sdml_core/stdlib/
iso_3166.rs1use 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
11pub 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
27pub 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!(
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}