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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
use std::marker::PhantomData;
use serde::de::DeserializeOwned;
use url::Url;
use crate::errors::*;
use super::deserializer::Deserializer;
#[derive(Default)]
pub struct YamlDeserializer<T>
where
T: DeserializeOwned,
{
t: PhantomData<T>,
}
impl<T> YamlDeserializer<T>
where
T: DeserializeOwned,
{
pub fn new() -> Self {
YamlDeserializer { t: PhantomData }
}
}
impl<'a, T> Deserializer<'a, T> for YamlDeserializer<T>
where
T: DeserializeOwned,
{
fn deserialize(&self, contents: &'a str, url: Option<&Url>) -> Result<T> {
serde_yaml::from_str(contents).chain_err(|| {
format!(
"Error deserializing Yaml from: '{}'",
url.map_or("URL was None".to_owned(), |u| u.to_string())
)
})
}
fn name(&self) -> &str {
"Yaml"
}
}
#[cfg(test)]
mod test {
use serde_derive::{Deserialize, Serialize};
use serde_yaml::Error;
use crate::model::metadata::MetaData;
use super::super::deserializer::Deserializer;
use super::YamlDeserializer;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TestStruct {
name: String,
}
#[test]
fn invalid_yaml() {
let deserializer = YamlDeserializer::<TestStruct>::new();
assert!(
deserializer.deserialize("{}", None).is_err(),
"Should not have parsed correctly as is invalid Yaml"
);
}
#[test]
fn flow() {
let flow_with_name = "
name: 'hello-world-simple-toml'
";
let deserializer = YamlDeserializer::<TestStruct>::new();
assert!(
deserializer.deserialize(flow_with_name, None).is_ok(),
"Did not parse correctly but is valid Yaml"
);
}
#[test]
fn metadata() {
let metadata = "\
name: \"me\"
version: \"1.1.1\"
description: \"ok\"
authors: [\"Andrew <andrew@foo.com>\"]
";
let result: Result<MetaData, Error> = serde_yaml::from_str(metadata);
match result {
Ok(md) => {
assert_eq!(md.name, "me".to_string());
assert_eq!(md.version, "1.1.1".to_string());
assert_eq!(md.description, "ok".to_string());
assert_eq!(md.authors, vec!("Andrew <andrew@foo.com>".to_string()));
}
Err(e) => panic!("Deserialization error: {e:?}"),
}
}
}