json_ld_syntax/context/term_definition/
nest.rs1use std::hash::Hash;
2
3use crate::is_keyword;
4
5#[derive(Clone, PartialOrd, Ord, Debug)]
6pub enum Nest {
7 Nest,
8
9 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}