Skip to main content

json_ld/core/context/
container.rs

1use crate::syntax::JsonLdContainerItem;
2use crate::syntax::context::JsonLdContextTypeContainer;
3
4#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
5pub enum JsonLdContainer {
6	// Empty container
7	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}