1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
use super::Value; use crate::lexer::Token; use crate::util::Span; use std::hash::{Hash, Hasher}; use std::collections::HashMap; pub type Object = Item<HashMap<Literal, Value>>; pub type Array = Item<Vec<Value>>; pub type Number = Item<String>; pub type Literal = Item<String>; pub type Bool = Item<bool>; pub type Null = Item<()>; #[derive(Debug, Clone, Copy)] pub struct Item<T> { pub span: Span, pub value: T, } impl<T> Item<T> { pub const fn new(span: Span, value: T) -> Item<T> { Item { span, value } } pub fn span(&self) -> Span { self.span } } impl Literal { pub fn new_literal(value: impl Into<String>) -> Self { let value = value.into(); let span = Span::default(); Item { span, value } } } impl Number { pub fn new_number(value: String) -> Self { let span = Span::default(); Item { span, value } } } impl Array { pub fn new_array(value: Vec<Value>) -> Self { let span = Span::default(); Item { span, value } } } impl Bool { pub fn new_bool(value: bool) -> Self { let span = Span::default(); Item { span, value } } } impl Null { pub fn new_null() -> Self { let span = Span::default(); Item { span, value: () } } } impl Object { pub fn new_object(value: HashMap<Literal, Value>) -> Self { let span = Span::default(); Item { span, value } } } impl<T: PartialEq> PartialEq for Item<T> { fn eq(&self, other: &Item<T>) -> bool { self.value == other.value } } impl<T: PartialEq> Eq for Item<T> {} impl<T: Hash> Hash for Item<T> { fn hash<H: Hasher>(&self, state: &mut H) { self.value.hash(state); } } impl From<&str> for Literal { fn from(value: &str) -> Self { Literal::new_literal(value) } } impl From<Token<'_>> for Literal { fn from(token: Token) -> Self { Item::new(token.span, token.value().to_owned()) } }