1use crate::syntax::JsonLdContainerItem;
2use crate::syntax::context::JsonLdContextTypeContainer;
3
4#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
5pub enum JsonLdContainer {
6 Null,
8
9 Graph,
10 Id,
11 Index,
12 Language,
13 List,
14 Set,
15 Type,
16
17 GraphSet,
18 GraphId,
19 GraphIndex,
20 IdSet,
21 IndexSet,
22 LanguageSet,
23 SetType,
24
25 GraphIdSet,
26 GraphIndexSet,
27}
28
29impl Default for JsonLdContainer {
30 fn default() -> Self {
31 Self::new()
32 }
33}
34
35impl JsonLdContainer {
36 pub fn new() -> JsonLdContainer {
37 JsonLdContainer::Null
38 }
39
40 pub fn from<'a, I: IntoIterator<Item = &'a JsonLdContainerItem>>(
41 iter: I,
42 ) -> Result<JsonLdContainer, JsonLdContainerItem> {
43 let mut container = JsonLdContainer::new();
44 for item in iter {
45 if !container.add(*item) {
46 return Err(*item);
47 }
48 }
49
50 Ok(container)
51 }
52
53 pub fn as_slice(&self) -> &[JsonLdContainerItem] {
54 use JsonLdContainer::*;
55 match self {
56 Null => &[],
57 Graph => &[JsonLdContainerItem::Graph],
58 Id => &[JsonLdContainerItem::Id],
59 Index => &[JsonLdContainerItem::Index],
60 Language => &[JsonLdContainerItem::Language],
61 List => &[JsonLdContainerItem::List],
62 Set => &[JsonLdContainerItem::Set],
63 Type => &[JsonLdContainerItem::Type],
64 GraphSet => &[JsonLdContainerItem::Graph, JsonLdContainerItem::Set],
65 GraphId => &[JsonLdContainerItem::Graph, JsonLdContainerItem::Id],
66 GraphIndex => &[JsonLdContainerItem::Graph, JsonLdContainerItem::Index],
67 IdSet => &[JsonLdContainerItem::Id, JsonLdContainerItem::Set],
68 IndexSet => &[JsonLdContainerItem::Index, JsonLdContainerItem::Set],
69 LanguageSet => &[JsonLdContainerItem::Language, JsonLdContainerItem::Set],
70 SetType => &[JsonLdContainerItem::Type, JsonLdContainerItem::Set],
71 GraphIdSet => &[
72 JsonLdContainerItem::Graph,
73 JsonLdContainerItem::Id,
74 JsonLdContainerItem::Set,
75 ],
76 GraphIndexSet => &[
77 JsonLdContainerItem::Graph,
78 JsonLdContainerItem::Index,
79 JsonLdContainerItem::Set,
80 ],
81 }
82 }
83
84 pub fn iter(&self) -> impl Iterator<Item = &JsonLdContainerItem> {
85 self.as_slice().iter()
86 }
87
88 pub fn len(&self) -> usize {
89 self.as_slice().len()
90 }
91
92 pub fn is_empty(&self) -> bool {
93 matches!(self, JsonLdContainer::Null)
94 }
95
96 pub fn contains(&self, c: JsonLdContainerItem) -> bool {
97 self.as_slice().contains(&c)
98 }
99
100 pub fn with(&self, c: JsonLdContainerItem) -> Option<JsonLdContainer> {
101 let new_container = match (self, c) {
102 (JsonLdContainer::Null, c) => c.into(),
103 (JsonLdContainer::Graph, JsonLdContainerItem::Graph) => *self,
104 (JsonLdContainer::Graph, JsonLdContainerItem::Set) => JsonLdContainer::GraphSet,
105 (JsonLdContainer::Graph, JsonLdContainerItem::Id) => JsonLdContainer::GraphId,
106 (JsonLdContainer::Graph, JsonLdContainerItem::Index) => JsonLdContainer::GraphIndex,
107 (JsonLdContainer::Id, JsonLdContainerItem::Id) => *self,
108 (JsonLdContainer::Id, JsonLdContainerItem::Graph) => JsonLdContainer::GraphId,
109 (JsonLdContainer::Id, JsonLdContainerItem::Set) => JsonLdContainer::IdSet,
110 (JsonLdContainer::Index, JsonLdContainerItem::Index) => *self,
111 (JsonLdContainer::Index, JsonLdContainerItem::Graph) => JsonLdContainer::GraphIndex,
112 (JsonLdContainer::Index, JsonLdContainerItem::Set) => JsonLdContainer::IndexSet,
113 (JsonLdContainer::Language, JsonLdContainerItem::Language) => *self,
114 (JsonLdContainer::Language, JsonLdContainerItem::Set) => JsonLdContainer::LanguageSet,
115 (JsonLdContainer::List, JsonLdContainerItem::List) => *self,
116 (JsonLdContainer::Set, JsonLdContainerItem::Set) => *self,
117 (JsonLdContainer::Set, JsonLdContainerItem::Graph) => JsonLdContainer::GraphSet,
118 (JsonLdContainer::Set, JsonLdContainerItem::Id) => JsonLdContainer::IdSet,
119 (JsonLdContainer::Set, JsonLdContainerItem::Index) => JsonLdContainer::IndexSet,
120 (JsonLdContainer::Set, JsonLdContainerItem::Language) => JsonLdContainer::LanguageSet,
121 (JsonLdContainer::Set, JsonLdContainerItem::Type) => JsonLdContainer::SetType,
122 (JsonLdContainer::Type, JsonLdContainerItem::Type) => *self,
123 (JsonLdContainer::Type, JsonLdContainerItem::Set) => JsonLdContainer::SetType,
124 (JsonLdContainer::GraphSet, JsonLdContainerItem::Graph) => *self,
125 (JsonLdContainer::GraphSet, JsonLdContainerItem::Set) => *self,
126 (JsonLdContainer::GraphSet, JsonLdContainerItem::Id) => JsonLdContainer::GraphIdSet,
127 (JsonLdContainer::GraphSet, JsonLdContainerItem::Index) => JsonLdContainer::GraphIdSet,
128 (JsonLdContainer::GraphId, JsonLdContainerItem::Graph) => *self,
129 (JsonLdContainer::GraphId, JsonLdContainerItem::Id) => *self,
130 (JsonLdContainer::GraphId, JsonLdContainerItem::Set) => JsonLdContainer::GraphIdSet,
131 (JsonLdContainer::GraphIndex, JsonLdContainerItem::Graph) => *self,
132 (JsonLdContainer::GraphIndex, JsonLdContainerItem::Index) => *self,
133 (JsonLdContainer::GraphIndex, JsonLdContainerItem::Set) => {
134 JsonLdContainer::GraphIndexSet
135 }
136 (JsonLdContainer::IdSet, JsonLdContainerItem::Id) => *self,
137 (JsonLdContainer::IdSet, JsonLdContainerItem::Set) => *self,
138 (JsonLdContainer::IdSet, JsonLdContainerItem::Graph) => JsonLdContainer::GraphIdSet,
139 (JsonLdContainer::IndexSet, JsonLdContainerItem::Index) => *self,
140 (JsonLdContainer::IndexSet, JsonLdContainerItem::Set) => *self,
141 (JsonLdContainer::IndexSet, JsonLdContainerItem::Graph) => {
142 JsonLdContainer::GraphIndexSet
143 }
144 (JsonLdContainer::LanguageSet, JsonLdContainerItem::Language) => *self,
145 (JsonLdContainer::LanguageSet, JsonLdContainerItem::Set) => *self,
146 (JsonLdContainer::SetType, JsonLdContainerItem::Set) => *self,
147 (JsonLdContainer::SetType, JsonLdContainerItem::Type) => *self,
148 (JsonLdContainer::GraphIdSet, JsonLdContainerItem::Graph) => *self,
149 (JsonLdContainer::GraphIdSet, JsonLdContainerItem::Id) => *self,
150 (JsonLdContainer::GraphIdSet, JsonLdContainerItem::Set) => *self,
151 (JsonLdContainer::GraphIndexSet, JsonLdContainerItem::Graph) => *self,
152 (JsonLdContainer::GraphIndexSet, JsonLdContainerItem::Index) => *self,
153 (JsonLdContainer::GraphIndexSet, JsonLdContainerItem::Set) => *self,
154 _ => return None,
155 };
156
157 Some(new_container)
158 }
159
160 pub fn add(&mut self, c: JsonLdContainerItem) -> bool {
161 match self.with(c) {
162 Some(container) => {
163 *self = container;
164 true
165 }
166 None => false,
167 }
168 }
169}
170
171impl From<JsonLdContainerItem> for JsonLdContainer {
172 fn from(c: JsonLdContainerItem) -> Self {
173 match c {
174 JsonLdContainerItem::Graph => Self::Graph,
175 JsonLdContainerItem::Id => Self::Id,
176 JsonLdContainerItem::Index => Self::Index,
177 JsonLdContainerItem::Language => Self::Language,
178 JsonLdContainerItem::List => Self::List,
179 JsonLdContainerItem::Set => Self::Set,
180 JsonLdContainerItem::Type => Self::Type,
181 }
182 }
183}
184
185impl From<JsonLdContextTypeContainer> for JsonLdContainer {
186 fn from(c: JsonLdContextTypeContainer) -> Self {
187 match c {
188 JsonLdContextTypeContainer::Set => Self::Set,
189 }
190 }
191}