stevenrwalter icon

Untitled

stevenrwalter | PRO | 04/20/15 06:35:13 PM UTC | 0 ⭐ | 342 👁️ | Never ⏰ | []
Rust |

1.99 KB

|

None

|

0 👍

/

0 👎

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<Element>),
    MapElem(HashMap<String,Element>)
}
 
impl From<i32> for Element {
    fn from(x: i32) -> Element {
        Element::IntegerElem(x)
    }
}
 
impl From<f64> 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<T: Into<Element>> FromIterator<T> for Element {
    fn from_iter<U>(iterator: U) -> Self
        where U: IntoIterator<Item=T>
    {
        let x = iterator.into_iter().map(|y| { y.into() });
        Element::ListElem(x.collect())
    }
}
 
impl<'a, V: Into<Element>> From<HashMap<&'a str, V>> for Element {
        fn from(mut input: HashMap<&str, V>) -> Self
        {
            let mut map : HashMap<String,Element> = 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);
}

Comments