oca_rust/
controller.rs

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}