sdml_core/stdlib/
iso_3166.rs

1/*!
2This Rust module contains the SDML model of the SDML library module `iso_3166` for ISO-3166.
3*/
4
5use crate::model::annotations::HasAnnotations;
6use crate::model::modules::Module;
7use crate::model::HasBody;
8use crate::stdlib::{dc::terms as dc_terms, rdfs, skos, xsd};
9use url::Url;
10
11// ------------------------------------------------------------------------------------------------
12// Public Macros
13// ------------------------------------------------------------------------------------------------
14
15// ------------------------------------------------------------------------------------------------
16// Public Types
17// ------------------------------------------------------------------------------------------------
18
19pub const MODULE_NAME: &str = "iso_3166";
20pub const MODULE_URL: &str = "https://sdml.io/modules/iso3166/2020.ttl#";
21
22pub const COUNTRY_CODE_ALPHA_2: &str = "CountryCodeAlpha2";
23pub const COUNTRY_CODE_ALPHA_3: &str = "CountryCodeAlpha3";
24pub const COUNTRY_CODE_NUMERIC_3: &str = "CountryCodeNumeric3";
25pub const COUNTRY_CODE: &str = "CountryCode";
26
27// ------------------------------------------------------------------------------------------------
28// Public Functions
29// ------------------------------------------------------------------------------------------------
30
31pub fn module() -> Module {
32    let mut module = Module::empty(id!(MODULE_NAME)).with_base_uri(Url::parse(MODULE_URL).unwrap());
33
34    module.body_mut().add_to_imports(import!(
35        id!(dc_terms::MODULE_NAME),
36        id!(rdfs::MODULE_NAME),
37        id!(skos::MODULE_NAME),
38        id!(xsd::MODULE_NAME)
39    ));
40
41    module.body_mut().extend_annotations(vec![
42        prop!(
43            skos::MODULE_NAME, skos::PREF_LABEL;
44            simple!(lstr!("ISO 3166-1:2020"))
45        ).into(),
46        //prop!(
47        //    dc_terms::MODULE_NAME, dc_terms::PROP_ISSUED_NAME;
48        //    simple!(lstr!("ISO 3166-1:2020"))
49        //).into(),
50        //prop!(
51        //    dc_terms::MODULE_NAME, dc_terms::PROP_HAS_VERSION_NAME;
52        //    simple!(4_u64)
53        //).into(),
54        //prop!(
55        //    dc_terms::MODULE_NAME, dc_terms::PROP_REPLACES_NAME;
56        //    simple!(lstr!("ISO 3166-1:2013"))
57        //).into(),
58        prop!(
59            dc_terms::MODULE_NAME, dc_terms::DESCRIPTION;
60            simple!(lstr!("Codes for the representation of names of countries and their subdivisions — Part 1: Country code"@"en"))
61        ).into(),
62        prop!(
63            dc_terms::MODULE_NAME, dc_terms::DESCRIPTION;
64            simple!(lstr!("Codes pour la représentation des noms de pays et de leurs subdivisions — Partie 1: Codes de pays"@"fr"))
65        ).into(),
66        prop!(
67            rdfs::MODULE_NAME, rdfs::SEE_ALSO;
68            simple!(Url::parse("https://www.iso.org/standard/72482.html").unwrap())
69        ).into(),
70    ]);
71
72    module
73        .body_mut()
74        .extend_definitions(vec![
75        datatype!(COUNTRY_CODE_ALPHA_2 => xsd::MODULE_NAME, xsd::STRING)
76            .with_body(
77                vec![
78                    prop!(
79                        xsd::MODULE_NAME, xsd::PATTERN;
80                        simple!(lstr!("[A-Z]{2}"))
81                    )
82                    .into(),
83                    prop!(
84                        skos::MODULE_NAME, skos::PREF_LABEL;
85                        simple!(lstr!("alpha-2 code"@"en"))
86                    )
87                    .into(),
88                    prop!(
89                        skos::MODULE_NAME, skos::PREF_LABEL;
90                        simple!(lstr!("code alpha-2"@"fr"))
91                    )
92                    .into(),
93                ]
94                .into(),
95            )
96            .into(),
97        datatype!(COUNTRY_CODE_ALPHA_3 => xsd::MODULE_NAME, xsd::STRING)
98            .with_body(
99                vec![
100                    prop!(
101                        xsd::MODULE_NAME, xsd::PATTERN;
102                        simple!(lstr!("[A-Z]{3}"))
103                    )
104                    .into(),
105                    prop!(
106                        skos::MODULE_NAME, skos::PREF_LABEL;
107                        simple!(lstr!("alpha-3 code"@"en"))
108                    )
109                    .into(),
110                    prop!(
111                        skos::MODULE_NAME, skos::PREF_LABEL;
112                        simple!(lstr!("code alpha-3"@"fr"))
113                    )
114                    .into(),
115                ]
116                .into(),
117            )
118            .into(),
119        datatype!(COUNTRY_CODE_NUMERIC_3 => xsd::MODULE_NAME, xsd::NONNEGATIVE_INTEGER)
120            .with_body(
121                vec![
122                    prop!(
123                        xsd::MODULE_NAME, xsd::MIN_INCLUSIVE;
124                        tc!(xsd::MODULE_NAME, xsd::NONNEGATIVE_INTEGER => 0_u64)
125                    )
126                    .into(),
127                    prop!(
128                        xsd::MODULE_NAME, xsd::MAX_INCLUSIVE;
129                        tc!(xsd::MODULE_NAME, xsd::NONNEGATIVE_INTEGER => 999_u64)
130                    )
131                    .into(),
132                    prop!(
133                        skos::MODULE_NAME, skos::PREF_LABEL;
134                        simple!(lstr!("numeric-3 code"@"en"))
135                    )
136                    .into(),
137                    prop!(
138                        skos::MODULE_NAME, skos::PREF_LABEL;
139                        simple!(lstr!("code numérique-3"@"fr"))
140                    )
141                    .into(),
142                ]
143                .into(),
144            )
145            .into(),
146        union!(COUNTRY_CODE => COUNTRY_CODE_ALPHA_2, COUNTRY_CODE_ALPHA_3, COUNTRY_CODE_NUMERIC_3)
147            .into(),
148    ])
149        .unwrap();
150
151    module
152}