json_ld_syntax/context/term_definition/
nest.rs

1use std::hash::Hash;
2
3use crate::is_keyword;
4
5#[derive(Clone, PartialOrd, Ord, Debug)]
6pub enum Nest {
7	Nest,
8
9	/// Must not be a keyword.
10	Term(String),
11}
12
13impl Nest {
14	pub fn as_str(&self) -> &str {
15		match self {
16			Self::Nest => "@nest",
17			Self::Term(t) => t,
18		}
19	}
20
21	pub fn into_string(self) -> String {
22		match self {
23			Self::Nest => "@nest".to_string(),
24			Self::Term(t) => t,
25		}
26	}
27}
28
29impl PartialEq for Nest {
30	fn eq(&self, other: &Self) -> bool {
31		match (self, other) {
32			(Self::Nest, Self::Nest) => true,
33			(Self::Term(a), Self::Term(b)) => a == b,
34			_ => false,
35		}
36	}
37}
38
39impl Eq for Nest {}
40
41impl Hash for Nest {
42	fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
43		self.as_str().hash(state)
44	}
45}
46
47#[derive(Debug, thiserror::Error)]
48#[error("invalid `@nest` value")]
49pub struct InvalidNest(pub String);
50
51impl TryFrom<String> for Nest {
52	type Error = InvalidNest;
53
54	fn try_from(s: String) -> Result<Self, InvalidNest> {
55		if s == "@nest" {
56			Ok(Self::Nest)
57		} else if is_keyword(&s) {
58			Err(InvalidNest(s))
59		} else {
60			Ok(Self::Term(s))
61		}
62	}
63}
64
65#[cfg(feature = "serde")]
66impl serde::Serialize for Nest {
67	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
68	where
69		S: serde::Serializer,
70	{
71		self.as_str().serialize(serializer)
72	}
73}
74
75#[cfg(feature = "serde")]
76impl<'de> serde::Deserialize<'de> for Nest {
77	fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
78	where
79		D: serde::Deserializer<'de>,
80	{
81		struct Visitor;
82
83		impl<'de> serde::de::Visitor<'de> for Visitor {
84			type Value = Nest;
85
86			fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
87				formatter.write_str("`@nest` value")
88			}
89
90			fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
91			where
92				E: serde::de::Error,
93			{
94				self.visit_string(v.to_owned())
95			}
96
97			fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
98			where
99				E: serde::de::Error,
100			{
101				Nest::try_from(v).map_err(|e| E::custom(e))
102			}
103		}
104
105		deserializer.deserialize_string(Visitor)
106	}
107}