1use crate::model::annotations::AnnotationBuilder;
5use crate::model::identifiers::Identifier;
6use crate::model::modules::Module;
7use crate::model::HasBody;
8use crate::stdlib::{rdf, rdfs};
9use url::Url;
10
11pub const MODULE_NAME: &str = "xsd";
20pub const MODULE_URL: &str = "http://www.w3.org/2001/XMLSchema#";
21
22pub const ANY_TYPE: &str = "anyType";
27pub const ANY_SIMPLE_TYPE: &str = "anySimpleType";
28
29pub const ANY_URI: &str = "anyURI";
34pub const BASE64_BINARY: &str = "base64Binary";
35pub const BOOLEAN: &str = "boolean";
36pub const DATE: &str = "date";
37pub const DATETIME: &str = "dateTime";
38pub const DECIMAL: &str = "decimal";
39pub const DOUBLE: &str = "double";
40pub const DURATION: &str = "duration";
41pub const FLOAT: &str = "float";
42pub const GDAY: &str = "gDay";
43pub const GMONTH: &str = "gMonth";
44pub const GMONTH_DAY: &str = "gMonthDay";
45pub const GYEAR: &str = "gYear";
46pub const GYEAR_MONTH: &str = "gYearMonth";
47pub const HEX_BINARY: &str = "hexBinary";
48pub const QNAME: &str = "QName";
49pub const QNOTATION: &str = "QNotation";
50pub const STRING: &str = "string";
51pub const TIME: &str = "time";
52
53pub const NORMALIZED_STRING: &str = "normalizedString";
58pub const TOKEN: &str = "token";
59pub const LANGUAGE: &str = "language";
60pub const NAME: &str = "Name";
61pub const NMTOKEN: &str = "NMTOKEN";
62pub const NCNAME: &str = "NCName";
63pub const ID: &str = "ID";
64pub const IDREF: &str = "IDREF";
65pub const ENTITY: &str = "ENTITY";
66
67pub const INTEGER: &str = "integer";
68pub const NONPOSITIVE_INTEGER: &str = "nonPositiveInteger";
69pub const NEGATIVE_INTEGER: &str = "negativeInteger";
70pub const LONG: &str = "long";
71pub const INT: &str = "int";
72pub const SHORT: &str = "short";
73pub const BYTE: &str = "byte";
74pub const NONNEGATIVE_INTEGER: &str = "nonNegativeInteger";
75pub const UNSIGNED_LONG: &str = "unsignedLong";
76pub const UNSIGNED_INT: &str = "unsignedInt";
77pub const UNSIGNED_SHORT: &str = "unsignedShort";
78pub const UNSIGNED_BYTE: &str = "unsignedByte";
79pub const POSITIVE_INTEGER: &str = "positiveInteger";
80
81pub const ENUMERATION: &str = "enumeration";
86pub const FRACTION_DIGITS: &str = "fractionDigits";
87pub const LENGTH: &str = "length";
88pub const MAX_EXCLUSIVE: &str = "maxExclusive";
89pub const MAX_INCLUSIVE: &str = "maxInclusive";
90pub const MAX_LENGTH: &str = "maxLength";
91pub const MIN_EXCLUSIVE: &str = "minExclusive";
92pub const MIN_INCLUSIVE: &str = "minInclusive";
93pub const MIN_LENGTH: &str = "minLength";
94pub const PATTERN: &str = "pattern";
95pub const TOTAL_DIGITS: &str = "totalDigits";
96pub const WHITE_SPACE: &str = "whiteSpace";
97
98pub fn module() -> Module {
103 #[allow(non_snake_case)]
104 let MODULE_IRI: url::Url = url::Url::parse(MODULE_URL).unwrap();
105 let mut module = Module::empty(id!(MODULE_NAME)).with_base_uri(Url::parse(MODULE_URL).unwrap());
106
107 module
108 .body_mut()
109 .add_to_imports(import!(id!(rdf::MODULE_NAME), id!(rdfs::MODULE_NAME)));
110
111 module
112 .body_mut()
113 .extend_definitions(vec![
114 rdf!(datatype ANY_TYPE, MODULE_IRI).into(),
116 rdf!(datatype ANY_SIMPLE_TYPE, MODULE_IRI; ANY_TYPE).into(),
117 rdf!(datatype ANY_URI, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
119 rdf!(datatype BASE64_BINARY, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
120 rdf!(datatype BOOLEAN, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
121 rdf!(datatype DATE, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
122 rdf!(datatype DATETIME, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
123 rdf!(datatype DECIMAL, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
124 rdf!(datatype DOUBLE, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
125 rdf!(datatype DURATION, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
126 rdf!(datatype FLOAT, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
127 rdf!(datatype GDAY, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
128 rdf!(datatype GMONTH, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
129 rdf!(datatype GMONTH_DAY, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
130 rdf!(datatype GYEAR, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
131 rdf!(datatype GYEAR_MONTH, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
132 rdf!(datatype HEX_BINARY, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
133 rdf!(datatype QNAME, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
134 rdf!(datatype QNOTATION, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
135 rdf!(datatype STRING, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
136 rdf!(datatype TIME, MODULE_IRI; ANY_SIMPLE_TYPE).into(),
137 rdf!(datatype INTEGER, MODULE_IRI; DECIMAL).into(),
139 rdf!(datatype NORMALIZED_STRING, MODULE_IRI; STRING).into(),
140 rdf!(datatype TOKEN, MODULE_IRI; NORMALIZED_STRING).into(),
141 rdf!(datatype LANGUAGE, MODULE_IRI; TOKEN).into(),
142 rdf!(datatype NAME, MODULE_IRI; TOKEN).into(),
143 rdf!(datatype NMTOKEN, MODULE_IRI; TOKEN).into(),
144 rdf!(datatype NCNAME, MODULE_IRI; NAME).into(),
145 rdf!(datatype NONPOSITIVE_INTEGER, MODULE_IRI; INTEGER).into(),
146 rdf!(datatype NEGATIVE_INTEGER, MODULE_IRI; NONPOSITIVE_INTEGER).into(),
147 rdf!(datatype LONG, MODULE_IRI; INTEGER).into(),
148 rdf!(datatype INT, MODULE_IRI; LONG).into(),
149 rdf!(datatype SHORT, MODULE_IRI; INT).into(),
150 rdf!(datatype BYTE, MODULE_IRI; SHORT).into(),
151 rdf!(datatype NONNEGATIVE_INTEGER, MODULE_IRI; INTEGER).into(),
152 rdf!(datatype UNSIGNED_LONG, MODULE_IRI; NONNEGATIVE_INTEGER).into(),
153 rdf!(datatype UNSIGNED_INT, MODULE_IRI; UNSIGNED_LONG).into(),
154 rdf!(datatype UNSIGNED_SHORT, MODULE_IRI; UNSIGNED_INT).into(),
155 rdf!(datatype UNSIGNED_BYTE, MODULE_IRI; UNSIGNED_SHORT).into(),
156 rdf!(datatype POSITIVE_INTEGER, MODULE_IRI; NONNEGATIVE_INTEGER).into(),
157 rdf!(property ENUMERATION, MODULE_IRI;
159 (rdfs::MODULE_NAME, rdfs::DATATYPE))
160 .into(),
161 rdf!(property FRACTION_DIGITS, MODULE_IRI;
162 (rdfs::MODULE_NAME, rdfs::DATATYPE))
163 .into(),
164 rdf!(property LENGTH, MODULE_IRI;
165 (rdfs::MODULE_NAME, rdfs::DATATYPE))
166 .into(),
167 rdf!(property MAX_EXCLUSIVE, MODULE_IRI;
168 (rdfs::MODULE_NAME, rdfs::DATATYPE))
169 .into(),
170 rdf!(property MAX_INCLUSIVE, MODULE_IRI;
171 (rdfs::MODULE_NAME, rdfs::DATATYPE))
172 .into(),
173 rdf!(property MAX_LENGTH, MODULE_IRI;
174 (rdfs::MODULE_NAME, rdfs::DATATYPE))
175 .into(),
176 rdf!(property MIN_EXCLUSIVE, MODULE_IRI;
177 (rdfs::MODULE_NAME, rdfs::DATATYPE))
178 .into(),
179 rdf!(property MIN_INCLUSIVE, MODULE_IRI;
180 (rdfs::MODULE_NAME, rdfs::DATATYPE))
181 .into(),
182 rdf!(property MIN_LENGTH, MODULE_IRI;
183 (rdfs::MODULE_NAME, rdfs::DATATYPE))
184 .into(),
185 rdf!(property ENUMERATION, MODULE_IRI;
186 (rdfs::MODULE_NAME, rdfs::DATATYPE))
187 .into(),
188 rdf!(property TOTAL_DIGITS, MODULE_IRI;
189 (rdfs::MODULE_NAME, rdfs::DATATYPE))
190 .into(),
191 rdf!(property WHITE_SPACE, MODULE_IRI;
192 (rdfs::MODULE_NAME, rdfs::DATATYPE))
193 .into(),
194 ])
195 .unwrap();
196
197 module
198}
199
200pub fn is_constraining_facet(name: &Identifier) -> bool {
201 is_constraining_facet_str(name.as_ref())
202}
203
204pub fn is_constraining_facet_str(name: &str) -> bool {
205 [
206 ENUMERATION,
207 FRACTION_DIGITS,
208 LENGTH,
209 MAX_EXCLUSIVE,
210 MAX_INCLUSIVE,
211 MAX_LENGTH,
212 MIN_EXCLUSIVE,
213 MIN_INCLUSIVE,
214 MIN_LENGTH,
215 PATTERN,
216 TOTAL_DIGITS,
217 WHITE_SPACE,
218 ]
219 .contains(&name)
220}