1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*!
This Rust module contains the SDML model of the SDML library module `iso_3166` for ISO-4217.
*/

use crate::model::annotations::HasAnnotations;
use crate::model::modules::Module;
use crate::model::HasBody;
use crate::stdlib::{dc::terms as dc_terms, rdfs, skos, xsd};
use url::Url;

// ------------------------------------------------------------------------------------------------
// Public Macros
// ------------------------------------------------------------------------------------------------

// ------------------------------------------------------------------------------------------------
// Public Types
// ------------------------------------------------------------------------------------------------

pub const MODULE_NAME: &str = "iso_4217";
pub const MODULE_URL: &str = "https://sdml.io/modules/iso4217/2020.ttl#";

pub const CURRENCY_CODE_ALPHA: &str = "CurrencyCodeAlpha";
pub const CURRENCY_CODE_NUMERIC: &str = "CurrencyCodeNumeric";
pub const CURRENCY_CODE: &str = "CurrencyCode";

// ------------------------------------------------------------------------------------------------
// Public Functions
// ------------------------------------------------------------------------------------------------

pub fn module() -> Module {
    let mut module = Module::empty(id!(MODULE_NAME)).with_base_uri(Url::parse(MODULE_URL).unwrap());

    module.body_mut().add_to_imports(import!(
        id!(dc_terms::MODULE_NAME),
        id!(rdfs::MODULE_NAME),
        id!(skos::MODULE_NAME),
        id!(xsd::MODULE_NAME)
    ));

    module.body_mut().extend_annotations(vec![
        prop!(
            skos::MODULE_NAME, skos::PREF_LABEL;
            simple!(lstr!("ISO 4217:2015"))
        )
        .into(),
        //prop!(
        //    dc_terms::MODULE_NAME, dc_terms::PROP_ISSUED_NAME;
        //    simple!(lstr!("2015-08-01"))
        //).into(),
        //prop!(
        //    dc_terms::MODULE_NAME, dc_terms::PROP_HAS_VERSION_NAME;
        //    simple!(8_u64)
        //).into(),
        prop!(
            dc_terms::MODULE_NAME, dc_terms::DESCRIPTION;
            simple!(lstr!("Codes for the representation of currencies"@"en"))
        )
        .into(),
        prop!(
            dc_terms::MODULE_NAME, dc_terms::DESCRIPTION;
            simple!(lstr!("Codes pour la représentation des monnaies"@"fr"))
        )
        .into(),
        prop!(
            rdfs::MODULE_NAME, rdfs::SEE_ALSO;
            simple!(Url::parse("https://www.iso.org/iso-4217-currency-codes.html").unwrap())
        )
        .into(),
    ]);

    module
        .body_mut()
        .extend_definitions(vec![
            datatype!(CURRENCY_CODE_ALPHA => xsd::MODULE_NAME, xsd::STRING)
                .with_body(
                    vec![
                        prop!(
                            xsd::MODULE_NAME, xsd::PATTERN;
                            simple!(lstr!("[A-Z]{3}"))
                        )
                        .into(),
                        prop!(
                            skos::MODULE_NAME, skos::PREF_LABEL;
                            simple!(lstr!("alpha code"@"en"))
                        )
                        .into(),
                        prop!(
                            skos::MODULE_NAME, skos::PREF_LABEL;
                            simple!(lstr!("code alpha"@"fr"))
                        )
                        .into(),
                    ]
                    .into(),
                )
                .into(),
            datatype!(CURRENCY_CODE_NUMERIC => xsd::MODULE_NAME, xsd::NONNEGATIVE_INTEGER)
                .with_body(
                    vec![
                        prop!(
                            xsd::MODULE_NAME, xsd::MIN_INCLUSIVE;
                            tc!(xsd::MODULE_NAME, xsd::NONNEGATIVE_INTEGER => 0_u64)
                        )
                        .into(),
                        prop!(
                            xsd::MODULE_NAME, xsd::MAX_INCLUSIVE;
                            tc!(xsd::MODULE_NAME, xsd::NONNEGATIVE_INTEGER => 899_u64)
                        )
                        .into(),
                        prop!(
                            skos::MODULE_NAME, skos::PREF_LABEL;
                            simple!(lstr!("numeric code"@"en"))
                        )
                        .into(),
                        prop!(
                            skos::MODULE_NAME, skos::PREF_LABEL;
                            simple!(lstr!("code numérique"@"fr"))
                        )
                        .into(),
                    ]
                    .into(),
                )
                .into(),
            union!(CURRENCY_CODE => CURRENCY_CODE_ALPHA, CURRENCY_CODE_NUMERIC).into(),
        ])
        .unwrap();

    module
}