eure_document/parse/
object_key.rs1use crate::{parse::ParseErrorKind, prelude_internal::*};
4use num_bigint::BigInt;
5
6pub trait ParseObjectKey<'doc>: Sized + Eq + core::hash::Hash + Ord {
38 fn from_object_key(key: &'doc ObjectKey) -> Result<Self, ParseErrorKind>;
54}
55
56impl<'doc> ParseObjectKey<'doc> for &'doc ObjectKey {
61 fn from_object_key(key: &'doc ObjectKey) -> Result<Self, ParseErrorKind> {
62 Ok(key)
63 }
64}
65
66impl ParseObjectKey<'_> for ObjectKey {
71 fn from_object_key(key: &ObjectKey) -> Result<Self, ParseErrorKind> {
72 Ok(key.clone())
73 }
74}
75
76impl ParseObjectKey<'_> for bool {
81 fn from_object_key(key: &ObjectKey) -> Result<Self, ParseErrorKind> {
82 match key {
83 ObjectKey::Bool(b) => Ok(*b),
84 _ => Err(ParseErrorKind::TypeMismatch {
85 expected: crate::value::ValueKind::Bool,
86 actual: key_to_value_kind(key),
87 }),
88 }
89 }
90}
91
92impl ParseObjectKey<'_> for BigInt {
97 fn from_object_key(key: &ObjectKey) -> Result<Self, ParseErrorKind> {
98 match key {
99 ObjectKey::Number(n) => Ok(n.clone()),
100 _ => Err(ParseErrorKind::TypeMismatch {
101 expected: crate::value::ValueKind::Integer,
102 actual: key_to_value_kind(key),
103 }),
104 }
105 }
106}
107
108impl ParseObjectKey<'_> for String {
113 fn from_object_key(key: &ObjectKey) -> Result<Self, ParseErrorKind> {
114 match key {
115 ObjectKey::String(s) => Ok(s.clone()),
116 _ => Err(ParseErrorKind::TypeMismatch {
117 expected: crate::value::ValueKind::Text,
118 actual: key_to_value_kind(key),
119 }),
120 }
121 }
122}
123
124fn key_to_value_kind(key: &ObjectKey) -> crate::value::ValueKind {
129 match key {
130 ObjectKey::Bool(_) => crate::value::ValueKind::Bool,
131 ObjectKey::Number(_) => crate::value::ValueKind::Integer,
132 ObjectKey::String(_) => crate::value::ValueKind::Text,
133 ObjectKey::Tuple(_) => crate::value::ValueKind::Tuple,
134 }
135}
136
137#[cfg(test)]
138mod tests {
139 use super::*;
140 use crate::value::Tuple;
141
142 #[test]
143 fn test_parse_object_key_borrowed() {
144 let key = ObjectKey::String("test".into());
145 let borrowed: &ObjectKey = ParseObjectKey::from_object_key(&key).unwrap();
146 assert_eq!(borrowed, &key);
147 }
148
149 #[test]
150 fn test_parse_object_key_owned() {
151 let key = ObjectKey::Bool(true);
152 let owned: ObjectKey = ParseObjectKey::from_object_key(&key).unwrap();
153 assert_eq!(owned, key);
154 }
155
156 #[test]
157 fn test_borrowed_key_is_zero_copy() {
158 let key = ObjectKey::String("test".into());
159 let borrowed: &ObjectKey = ParseObjectKey::from_object_key(&key).unwrap();
160 assert!(core::ptr::eq(&key, borrowed));
161 }
162
163 #[test]
164 #[allow(clippy::bool_assert_comparison)]
165 fn test_parse_bool_key() {
166 let key = ObjectKey::Bool(true);
167 let b: bool = ParseObjectKey::from_object_key(&key).unwrap();
168 assert_eq!(b, true);
169 }
170
171 #[test]
172 fn test_parse_bool_key_type_mismatch() {
173 let key = ObjectKey::String("not a bool".into());
174 let result: Result<bool, _> = ParseObjectKey::from_object_key(&key);
175 assert!(result.is_err());
176 }
177
178 #[test]
179 fn test_parse_bigint_key() {
180 let key = ObjectKey::Number(BigInt::from(42));
181 let n: BigInt = ParseObjectKey::from_object_key(&key).unwrap();
182 assert_eq!(n, BigInt::from(42));
183 }
184
185 #[test]
186 fn test_parse_bigint_key_type_mismatch() {
187 let key = ObjectKey::Bool(false);
188 let result: Result<BigInt, _> = ParseObjectKey::from_object_key(&key);
189 assert!(result.is_err());
190 }
191
192 #[test]
193 fn test_parse_string_key() {
194 let key = ObjectKey::String("hello".into());
195 let s: String = ParseObjectKey::from_object_key(&key).unwrap();
196 assert_eq!(s, "hello");
197 }
198
199 #[test]
200 fn test_parse_string_key_type_mismatch() {
201 let key = ObjectKey::Number(BigInt::from(123));
202 let result: Result<String, _> = ParseObjectKey::from_object_key(&key);
203 assert!(result.is_err());
204 }
205
206 #[test]
207 fn test_parse_tuple_key() {
208 let key = ObjectKey::Tuple(Tuple(vec![
209 ObjectKey::String("a".into()),
210 ObjectKey::Number(BigInt::from(1)),
211 ]));
212 let owned: ObjectKey = ParseObjectKey::from_object_key(&key).unwrap();
213 assert_eq!(owned, key);
214 }
215}