1use std::borrow::Cow;
2
3#[cfg(feature = "serde")]
4use serde::Deserialize;
5
6use zerocopy::transmute;
7use zerocopy_derive::{AsBytes, FromBytes, FromZeroes};
8
9use crate::token::TokenType;
10
11#[derive(Debug, Eq, PartialEq)]
13pub enum RealType {
14 ObjectOrArray,
19 Number,
21 Boolean,
23 String,
25 Identifier,
27 Date,
29}
30
31#[derive(Debug, Eq, PartialEq)]
33pub enum CollectionType {
34 Object,
36 Array,
38}
39
40impl RealType {
41 pub fn from_token_type(t: &TokenType) -> Option<RealType> {
45 match *t {
46 TokenType::Boolean => Some(RealType::Boolean),
47 TokenType::Number => Some(RealType::Number),
48 TokenType::Identifier => Some(RealType::Identifier),
49 TokenType::String => Some(RealType::String),
50 TokenType::OpenBracket => Some(RealType::ObjectOrArray),
51 TokenType::Date => Some(RealType::Date),
52 _ => None,
53 }
54 }
55}
56
57#[derive(
59 Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, FromZeroes, FromBytes, AsBytes, Hash,
60)]
61#[repr(C)]
62#[cfg_attr(feature = "serde", derive(Deserialize), serde(from = "u128"))]
63pub struct Date {
64 pub years: u32,
66 pub months: u32,
68 pub days: u32,
70 pub hours: u32,
73}
74
75impl Date {
76 pub fn new(years: u32, months: u32, days: u32, hours: u32) -> Date {
78 Date {
79 years,
80 months,
81 days,
82 hours,
83 }
84 }
85}
86
87impl From<[u32; 4]> for Date {
88 fn from(value: [u32; 4]) -> Self {
89 Date {
90 years: value[0],
91 months: value[1],
92 days: value[2],
93 hours: value[3],
94 }
95 }
96}
97
98impl From<Date> for [u32; 4] {
99 fn from(value: Date) -> Self {
100 [value.years, value.months, value.days, value.hours]
101 }
102}
103
104impl From<u128> for Date {
105 fn from(value: u128) -> Self {
106 let parts: [u32; 4] = transmute!(value);
107
108 parts.into()
109 }
110}
111
112impl From<Date> for u128 {
113 fn from(value: Date) -> Self {
114 let indices: [u32; 4] = [value.years, value.months, value.days, value.hours];
115 transmute!(indices)
116 }
117}
118
119impl From<Date> for (u32, u32, u32, u32) {
120 fn from(value: Date) -> Self {
121 (value.years, value.months, value.days, value.hours)
122 }
123}
124
125#[derive(Debug, PartialEq, PartialOrd, Clone)]
127pub enum ObjectKey<'src> {
128 Identifier(Cow<'src, str>),
130 Date(Date),
132}
133
134impl<'src> From<Date> for ObjectKey<'src> {
135 fn from(value: Date) -> Self {
136 ObjectKey::Date(value)
137 }
138}
139
140impl<'src> From<&'src str> for ObjectKey<'src> {
141 fn from(value: &'src str) -> Self {
142 ObjectKey::Identifier(value.into())
143 }
144}
145
146impl<'src> From<String> for ObjectKey<'src> {
147 fn from(value: String) -> Self {
148 ObjectKey::Identifier(value.into())
149 }
150}