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
mod definition;
mod field;
mod type_name;
mod value_type;
pub use self::{definition::Definition, field::Field, type_name::TypeName, value_type::ValueType};
use crate::error::{Error, ErrorKind};
use anomaly::fail;
use serde::Deserialize;
use std::{fs, path::Path, str::FromStr};
#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct Schema {
namespace: TypeName,
#[serde(rename = "definition")]
definitions: Vec<Definition>,
}
impl Schema {
pub fn new(namespace: TypeName, definitions: impl Into<Vec<Definition>>) -> Self {
Self {
namespace,
definitions: definitions.into(),
}
}
pub fn load_toml(path: impl AsRef<Path>) -> Result<Self, Error> {
match fs::read_to_string(path.as_ref()) {
Ok(s) => s.parse(),
Err(e) => fail!(
ErrorKind::Io,
"couldn't open {}: {}",
path.as_ref().display(),
e
),
}
}
pub fn definitions(&self) -> &[Definition] {
&self.definitions
}
}
impl FromStr for Schema {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Error> {
Ok(toml::from_str(s)?)
}
}