1use crate::state::oca::OCABuilder;
2use std::io::Read;
3
4pub type GenericError = Box<dyn std::error::Error + Sync + Send>;
5pub type GenericResult<T> = Result<T, GenericError>;
6
7pub fn load_oca(source: &mut dyn Read) -> GenericResult<OCABuilder> {
8 let oca: OCABuilder = serde_json::from_reader(source)?;
9
10 Ok(oca)
11}
12
13#[cfg(test)]
14mod tests {
15 use super::load_oca;
16 use crate::state::attribute::{AttributeBuilder, AttributeType};
17 use maplit::hashmap;
18
19 #[test]
20 fn loads_json_from_str() {
21 let data = r#"
22{
23 "capture_base": {
24 "attributes": {
25 "n1": "Text",
26 "n2": "DateTime",
27 "n3": "Reference:sai"
28 },
29 "classification": "",
30 "digest": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
31 "flagged_attributes": [
32 "n1"
33 ],
34 "type": "spec/capture_base/1.0"
35 },
36 "overlays": [
37 {
38 "attribute_character_encoding": {
39 "n2": "iso-8859-1"
40 },
41 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
42 "default_character_encoding": "utf-8",
43 "digest": "E-fCW5Gcnzn4uTBIUUH4Gdl3xRdlDg25cM3UCk3blubU",
44 "type": "spec/overlays/character_encoding/1.0"
45 },
46 {
47 "attribute_units": {
48 "n1": "cm"
49 },
50 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
51 "digest": "E-gA3mYg2RbZcLXuNrWyMNJqCaclfzMrgQogVUlpFcoY",
52 "metric_system": "SI",
53 "type": "spec/overlays/unit/1.0"
54 },
55 {
56 "attribute_entry_codes": {
57 "n1": [
58 "op1",
59 "op2"
60 ]
61 },
62 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
63 "digest": "E4L-BukSBsqZoDDIJvw4_gGjAJs5It4UUfiA200lGup0",
64 "type": "spec/overlays/entry_code/1.0"
65 },
66 {
67 "attribute_categories": [],
68 "attribute_labels": {
69 "n1": "Name: ",
70 "n2": "Date: ",
71 "n3": "Reference: "
72 },
73 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
74 "category_labels": {},
75 "digest": "EwXoTd4_ZSZMnRmfQGFkXTfw7uMu9z9bnIah2ZM6hPpQ",
76 "language": "En",
77 "type": "spec/overlays/label/1.0"
78 },
79 {
80 "attribute_information": {
81 "n1": "info en"
82 },
83 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
84 "digest": "EUcv8Udxqj7pZfHF1XxrIpb01lfRhpRtWdzxVS706EVI",
85 "language": "En",
86 "type": "spec/overlays/information/1.0"
87 },
88 {
89 "attribute_entries": {
90 "n1": {
91 "op1": "Option 1",
92 "op2": "Option 2"
93 }
94 },
95 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
96 "digest": "EcNtZGAs1yPlPSVRO38t13sxr1abF67MnqvjTJQGM3jc",
97 "language": "En",
98 "type": "spec/overlays/entry/1.0"
99 },
100 {
101 "attribute_categories": [],
102 "attribute_labels": {
103 "n1": "ImiÄ™: ",
104 "n2": "Data: ",
105 "n3": "Referecja: "
106 },
107 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
108 "category_labels": {},
109 "digest": "Eme3tfHtbrY0nT8ZNEorzM2Nrkdf3PzwFIP1hnAmXkdg",
110 "language": "Pl",
111 "type": "spec/overlays/label/1.0"
112 },
113 {
114 "attribute_information": {
115 "n1": "info pl"
116 },
117 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
118 "digest": "EZvWNCh1yj7FSOdyz67WK1n7pq_xyo-M7RjDiFDR4Q7I",
119 "language": "Pl",
120 "type": "spec/overlays/information/1.0"
121 },
122 {
123 "attribute_entries": {
124 "n1": {
125 "op1": "Opcja 1",
126 "op2": "Opcja 2"
127 }
128 },
129 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
130 "digest": "EBXzK5l6KiH40PyJSoDjB4WBMpXh6DwvgpLMbZ2jj-Ws",
131 "language": "Pl",
132 "type": "spec/overlays/entry/1.0"
133 },
134 {
135 "attribute_conditions": {
136 "n2": "${0} == 'op1'"
137 },
138 "attribute_dependencies": {
139 "n2": [
140 "n1"
141 ]
142 },
143 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
144 "digest": "EkyIEvDwMete4Y-adBJZcGihh6K2Orswhkv_unFmXzHM",
145 "type": "spec/overlays/conditional/1.0"
146 },
147 {
148 "attribute_formats": {
149 "n2": "DD/MM/YYYY"
150 },
151 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
152 "digest": "EGiJKfiFCIf8Hdt8QLlnksOB9AH6_gcuc0l3gx0aATnM",
153 "type": "spec/overlays/format/1.0"
154 },
155 {
156 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
157 "description": "DL desc",
158 "digest": "Eluyyqh9h7TQWJt980o16ZfHSqSKQD2q0q7QtTUiIBPc",
159 "language": "En",
160 "name": "Driving Licence",
161 "type": "spec/overlays/meta/1.0"
162 },
163 {
164 "capture_base": "ElNWOR0fQbv_J6EL0pJlvCxEpbu4bg1AurHgr_0A7LKc",
165 "description": "PJ desc",
166 "digest": "EfDTiIz_5kHXWQIxw8JmDEou__3pi94c63cMrIRo7nK4",
167 "language": "Pl",
168 "name": "Prawo Jazdy",
169 "type": "spec/overlays/meta/1.0"
170 }
171 ]
172}
173 "#;
174
175 let oca_builder_result = load_oca(&mut data.as_bytes());
176 assert!(oca_builder_result.is_ok());
177 if let Ok(oca_builder) = oca_builder_result {
178 let oca = oca_builder
179 .add_attribute(
180 AttributeBuilder::new("new_attr".to_string(), AttributeType::Text)
181 .add_label(hashmap! {
182 "En".to_string() => "New: ".to_string(),
183 "Pl".to_string() => "Nowy: ".to_string(),
184 })
185 .build(),
186 )
187 .finalize();
188
189 assert_eq!(oca.capture_base.attributes.len(), 4);
190 }
191 }
192}