summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/conversion.rs52
1 files changed, 51 insertions, 1 deletions
diff --git a/src/conversion.rs b/src/conversion.rs
index addc341..54eccc1 100644
--- a/src/conversion.rs
+++ b/src/conversion.rs
@@ -1,4 +1,4 @@
-use std::collections::{BTreeMap, HashMap};
+use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
use std::ffi::{CStr, CString};
use std::hash::{BuildHasher, Hash};
use std::string::String as StdString;
@@ -481,6 +481,56 @@ impl<'lua, K: Ord + FromLua<'lua>, V: FromLua<'lua>> FromLua<'lua> for BTreeMap<
}
}
+impl<'lua, T: Eq + Hash + ToLua<'lua>, S: BuildHasher> ToLua<'lua> for HashSet<T, S> {
+ fn to_lua(self, lua: &'lua Lua) -> Result<Value<'lua>> {
+ Ok(Value::Table(lua.create_table_from(
+ self.into_iter().map(|val| (val, true)),
+ )?))
+ }
+}
+
+impl<'lua, T: Eq + Hash + FromLua<'lua>, S: BuildHasher + Default> FromLua<'lua> for HashSet<T, S> {
+ fn from_lua(value: Value<'lua>, _: &'lua Lua) -> Result<Self> {
+ if let Value::Table(table) = value {
+ table
+ .pairs::<T, Value<'lua>>()
+ .map(|res| res.map(|(k, _)| k))
+ .collect()
+ } else {
+ Err(Error::FromLuaConversionError {
+ from: value.type_name(),
+ to: "HashSet",
+ message: Some("expected table".to_string()),
+ })
+ }
+ }
+}
+
+impl<'lua, T: Ord + ToLua<'lua>> ToLua<'lua> for BTreeSet<T> {
+ fn to_lua(self, lua: &'lua Lua) -> Result<Value<'lua>> {
+ Ok(Value::Table(lua.create_table_from(
+ self.into_iter().map(|val| (val, true)),
+ )?))
+ }
+}
+
+impl<'lua, T: Ord + FromLua<'lua>> FromLua<'lua> for BTreeSet<T> {
+ fn from_lua(value: Value<'lua>, _: &'lua Lua) -> Result<Self> {
+ if let Value::Table(table) = value {
+ table
+ .pairs::<T, Value<'lua>>()
+ .map(|res| res.map(|(k, _)| k))
+ .collect()
+ } else {
+ Err(Error::FromLuaConversionError {
+ from: value.type_name(),
+ to: "BTreeSet",
+ message: Some("expected table".to_string()),
+ })
+ }
+ }
+}
+
impl<'lua, T: ToLua<'lua>> ToLua<'lua> for Option<T> {
fn to_lua(self, lua: &'lua Lua) -> Result<Value<'lua>> {
match self {