sdml_core/stdlib/
xsd.rs

1/**
2This Rust module contains the SDML model of the SDML library module `xsd` for XML Schema.
3*/
4use 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
11// ------------------------------------------------------------------------------------------------
12// Public Macros
13// ------------------------------------------------------------------------------------------------
14
15// ------------------------------------------------------------------------------------------------
16// Public Types
17// ------------------------------------------------------------------------------------------------
18
19pub const MODULE_NAME: &str = "xsd";
20pub const MODULE_URL: &str = "http://www.w3.org/2001/XMLSchema#";
21
22// ------------------------------------------------------------------------------------------------
23// Public Types ❱ "ur" types
24// ------------------------------------------------------------------------------------------------
25
26pub const ANY_TYPE: &str = "anyType";
27pub const ANY_SIMPLE_TYPE: &str = "anySimpleType";
28
29// ------------------------------------------------------------------------------------------------
30// Public Types ❱ built-in primitive types
31// ------------------------------------------------------------------------------------------------
32
33pub 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
53// ------------------------------------------------------------------------------------------------
54// Public Types ❱ built-in derived types
55// ------------------------------------------------------------------------------------------------
56
57pub 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
81// ------------------------------------------------------------------------------------------------
82// Public Types ❱ constraining facets
83// ------------------------------------------------------------------------------------------------
84
85pub 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
98// ------------------------------------------------------------------------------------------------
99// Public Functions
100// ------------------------------------------------------------------------------------------------
101
102pub 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            // Purple
115            rdf!(datatype ANY_TYPE, MODULE_IRI).into(),
116            rdf!(datatype ANY_SIMPLE_TYPE, MODULE_IRI; ANY_TYPE).into(),
117            // Blue
118            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            // Green
138            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            // Facets
158            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}