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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
use strm_privacy_driver::StrmPrivacyValue;

#[derive(Debug, PartialEq, Clone, serde::Deserialize, serde::Serialize)]
#[serde(default)]
pub struct StrmMeta {
    #[serde(rename = "eventContractRef")]
    pub event_contract_ref: String,
    pub nonce: Option<i32>,
    pub timestamp: Option<i64>,
    #[serde(rename = "keyLink")]
    pub key_link: Option<String>,
    #[serde(rename = "billingId")]
    pub billing_id: Option<String>,
    #[serde(rename = "consentLevels")]
    pub consent_levels: Vec<i32>,
}

impl Default for StrmMeta {
    fn default() -> StrmMeta {
        StrmMeta {
            event_contract_ref: String::default(),
            nonce: None,
            timestamp: None,
            key_link: None,
            billing_id: None,
            consent_levels: vec![],
        }
    }
}

#[derive(Debug, PartialEq, Clone, serde::Deserialize, serde::Serialize)]
#[serde(default)]
pub struct DemoEvent {
    #[serde(rename = "strmMeta")]
    pub strm_meta: StrmMeta,
    #[serde(rename = "uniqueIdentifier")]
    pub unique_identifier: Option<String>,
    #[serde(rename = "consistentValue")]
    pub consistent_value: String,
    #[serde(rename = "someSensitiveValue")]
    pub some_sensitive_value: Option<String>,
    #[serde(rename = "notSensitiveValue")]
    pub not_sensitive_value: Option<String>,
}

impl Default for DemoEvent {
    fn default() -> DemoEvent {
        DemoEvent {
            strm_meta: StrmMeta::default(),
            unique_identifier: None,
            consistent_value: String::default(),
            some_sensitive_value: None,
            not_sensitive_value: None,
        }
    }
}

impl StrmPrivacyValue for DemoEvent {
    const STRM_SCHEMA_REF: &'static str = "strmprivacy/demo/1.0.2";
    const STRM_SCHEMA: &'static str = r#"
{
    "type": "record",
    "name": "DemoEvent",
    "namespace": "io.strmprivacy.schemas.demo.v1",
    "fields": [
        {
            "name": "strmMeta",
            "type": {
                "type": "record",
                "name": "StrmMeta",
                "fields": [
                    {
                        "name": "eventContractRef",
                        "type": "string"
                    },
                    {
                        "name": "nonce",
                        "type": [
                            "null",
                            "int"
                        ],
                        "default": null
                    },
                    {
                        "name": "timestamp",
                        "type": [
                            "null",
                            "long"
                        ],
                        "default": null
                    },
                    {
                        "name": "keyLink",
                        "type": [
                            "null",
                            "string"
                        ],
                        "default": null
                    },
                    {
                        "name": "billingId",
                        "type": [
                            "null",
                            "string"
                        ],
                        "default": null
                    },
                    {
                        "name": "consentLevels",
                        "type": {
                            "type": "array",
                            "items": "int"
                        }
                    }
                ]
            }
        },
        {
            "name": "uniqueIdentifier",
            "type": [
                "null",
                "string"
            ],
            "default": null,
            "doc": "any value. For illustration purposes: use a value that is consistent over time like a customer or device ID."
        },
        {
            "name": "consistentValue",
            "type": "string",
            "doc": "any value. For illustration purposes: use a value that is consistent over a limited period like a session."
        },
        {
            "name": "someSensitiveValue",
            "type": [
                "null",
                "string"
            ],
            "default": null,
            "doc": "any value. For illustration purposes: use a value that could identify a user over time based on behavior, like browsing behavior (e.g. urls)."
        },
        {
            "name": "notSensitiveValue",
            "type": [
                "null",
                "string"
            ],
            "default": null,
            "doc": "any value. For illustration purposes: use a value that is not sensitive at all, like the rank of an item in a set."
        }
    ]
}

    "#;
}