1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
#![feature(custom_derive, plugin)] #![plugin(serde_macros)] extern crate serde; extern crate serde_yaml; use std::cmp::Ordering; use std::fs::File; use serde_yaml::from_reader; use serde::{Deserialize, Deserializer}; pub fn from_yaml_file<T, D> (d: &mut D) -> Result<T, D::Error> where T: Deserialize, D: Deserializer { let s: String = try!(Deserialize::deserialize(d)); match from_reader(File::open(s).unwrap()) { Ok(something) => Ok(something), Err(err) => return Err(serde::de::Error::custom(err.to_string())) } } #[derive(PartialEq, Serialize, Deserialize, Debug, Default, Clone, Eq)] pub struct BIT { #[serde(rename="configureCommands")] pub configure_commands : Option<Vec<String>>, #[serde(rename="buildCommands")] pub build_commands : Option<Vec<String>>, #[serde(rename="installCommands")] pub install_commands : Option<Vec<String>> } #[derive(PartialEq, Serialize, Deserialize, Debug, Default, Clone, Eq)] pub struct Chunk { pub name : String, pub repo : String, #[serde(rename="ref")] pub reference : String, #[serde(rename="buildDepends")] pub build_depends : Option<Vec<String>>, #[serde(deserialize_with="from_yaml_file")] pub bit : BIT } #[derive(PartialEq, Serialize, Deserialize, Debug, Default, Clone, Eq)] pub struct Stratum { pub name : String, #[serde(deserialize_with="from_yaml_file")] pub chunks : Vec<Chunk>, #[serde(rename="buildDepends")] pub build_depends : Option<Vec<String>> } #[derive(PartialEq, Serialize, Deserialize, Debug, Default, Clone, Eq)] pub struct System { pub name : String, pub strata : Vec<Stratum> } #[test] fn test_stratum_serde() { let x: Vec<Chunk> = from_reader(File::open("assets/test-stratum.morph").unwrap()).unwrap(); } #[test] fn test_system_serde() { let x : System = from_reader(File::open("assets/test-system.morph").unwrap()).unwrap(); }