use std::collections::LinkedList; use std::collections::HashMap; use std::convert::From; use std::iter::FromIterator; use std::iter::IntoIterator; #[derive(Debug)] pub enum Element { IntegerElem(i32), DoubleElem(f64), StringElem(String), ListElem(LinkedList), MapElem(HashMap) } impl From for Element { fn from(x: i32) -> Element { Element::IntegerElem(x) } } impl From for Element { fn from(x: f64) -> Element { Element::DoubleElem(x) } } impl<'a> From<&'a str> for Element { fn from(x: &str) -> Element { Element::StringElem(x.to_string()) } } impl> FromIterator for Element { fn from_iter(iterator: U) -> Self where U: IntoIterator { let x = iterator.into_iter().map(|y| { y.into() }); Element::ListElem(x.collect()) } } impl<'a, V: Into> From> for Element { fn from(mut input: HashMap<&str, V>) -> Self { let mut map : HashMap = HashMap::new(); while input.len() > 0 { let key = input.keys().next().unwrap().clone(); let val = input.remove(key).unwrap(); let elem = val.into(); map.insert(key.to_string(), elem); } Element::MapElem(map) } } fn main () { let five = Element::IntegerElem(5); let foo : Element = "Foo".into(); let bar = Element::from("Bar"); let mut list = LinkedList::new(); list.push_back(five); list.push_back(foo); list.push_back(bar); println!("{:?}", list); let listelem = Element::from_iter(list); println!("{:?}", listelem); let integers = vec![1,3,5]; let element = Element::from_iter(integers); println!("{:?}", element); let mut int_map : HashMap<&str,i32> = HashMap::new(); int_map.insert("1", 1); int_map.insert("2", 2); let int_map_elem = Element::from(int_map); println!("{:?}", int_map_elem); }