ankurah_core/value/
mod.rs

1mod cast;
2pub mod cast_predicate;
3mod collatable;
4#[cfg(feature = "wasm")]
5mod wasm;
6
7pub use cast::CastError;
8
9use ankurah_proto as proto;
10use serde::{Deserialize, Serialize};
11use std::fmt::Display;
12
13#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, PartialOrd)]
14pub enum Value {
15    // Numbers
16    I16(i16),
17    I32(i32),
18    I64(i64),
19    F64(f64),
20
21    Bool(bool),
22    String(String),
23    EntityId(proto::EntityId),
24    Object(Vec<u8>),
25    Binary(Vec<u8>),
26}
27
28#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
29pub enum ValueType {
30    I16,
31    I32,
32    I64,
33    F64,
34    Bool,
35    String,
36    EntityId,
37    Object,
38    Binary,
39}
40
41impl ValueType {
42    pub fn of(v: &Value) -> Self {
43        match v {
44            Value::I16(_) => ValueType::I16,
45            Value::I32(_) => ValueType::I32,
46            Value::I64(_) => ValueType::I64,
47            Value::F64(_) => ValueType::F64,
48            Value::Bool(_) => ValueType::Bool,
49            Value::String(_) => ValueType::String,
50            Value::EntityId(_) => ValueType::EntityId,
51            Value::Object(_) => ValueType::Object,
52            Value::Binary(_) => ValueType::Binary,
53        }
54    }
55}
56
57impl Display for Value {
58    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
59        match self {
60            Value::I16(int) => write!(f, "{:?}", int),
61            Value::I32(int) => write!(f, "{:?}", int),
62            Value::I64(int) => write!(f, "{:?}", int),
63            Value::F64(float) => write!(f, "{:?}", float),
64            Value::Bool(bool) => write!(f, "{:?}", bool),
65            Value::String(string) => write!(f, "{:?}", string),
66            Value::EntityId(entity_id) => write!(f, "{}", entity_id),
67            Value::Object(object) => write!(f, "{:?}", object),
68            Value::Binary(binary) => write!(f, "{:?}", binary),
69        }
70    }
71}
72
73impl From<ankql::ast::Literal> for Value {
74    fn from(literal: ankql::ast::Literal) -> Self {
75        match literal {
76            ankql::ast::Literal::I16(i) => Value::I16(i),
77            ankql::ast::Literal::I32(i) => Value::I32(i),
78            ankql::ast::Literal::I64(i) => Value::I64(i),
79            ankql::ast::Literal::F64(f) => Value::F64(f),
80            ankql::ast::Literal::Bool(b) => Value::Bool(b),
81            ankql::ast::Literal::String(s) => Value::String(s),
82            ankql::ast::Literal::EntityId(ulid) => Value::EntityId(proto::EntityId::from_ulid(ulid)),
83            ankql::ast::Literal::Object(object) => Value::Object(object),
84            ankql::ast::Literal::Binary(binary) => Value::Binary(binary),
85        }
86    }
87}
88
89impl From<&ankql::ast::Literal> for Value {
90    fn from(literal: &ankql::ast::Literal) -> Self {
91        match literal {
92            ankql::ast::Literal::I16(i) => Value::I16(*i),
93            ankql::ast::Literal::I32(i) => Value::I32(*i),
94            ankql::ast::Literal::I64(i) => Value::I64(*i),
95            ankql::ast::Literal::F64(f) => Value::F64(*f),
96            ankql::ast::Literal::Bool(b) => Value::Bool(*b),
97            ankql::ast::Literal::String(s) => Value::String(s.clone()),
98            ankql::ast::Literal::EntityId(ulid) => Value::EntityId(proto::EntityId::from_ulid(*ulid)),
99            ankql::ast::Literal::Object(object) => Value::Object(object.clone()),
100            ankql::ast::Literal::Binary(binary) => Value::Binary(binary.clone()),
101        }
102    }
103}
104
105impl From<Value> for ankql::ast::Literal {
106    fn from(value: Value) -> Self {
107        match value {
108            Value::I16(i) => ankql::ast::Literal::I16(i),
109            Value::I32(i) => ankql::ast::Literal::I32(i),
110            Value::I64(i) => ankql::ast::Literal::I64(i),
111            Value::F64(f) => ankql::ast::Literal::F64(f),
112            Value::Bool(b) => ankql::ast::Literal::Bool(b),
113            Value::String(s) => ankql::ast::Literal::String(s),
114            Value::EntityId(entity_id) => ankql::ast::Literal::EntityId(entity_id.to_ulid()),
115            Value::Object(bytes) => ankql::ast::Literal::String(String::from_utf8_lossy(&bytes).to_string()),
116            Value::Binary(bytes) => ankql::ast::Literal::String(String::from_utf8_lossy(&bytes).to_string()),
117        }
118    }
119}
120
121impl From<&Value> for ankql::ast::Literal {
122    fn from(value: &Value) -> Self {
123        match value {
124            Value::I16(i) => ankql::ast::Literal::I16(*i),
125            Value::I32(i) => ankql::ast::Literal::I32(*i),
126            Value::I64(i) => ankql::ast::Literal::I64(*i),
127            Value::F64(f) => ankql::ast::Literal::F64(*f),
128            Value::Bool(b) => ankql::ast::Literal::Bool(*b),
129            Value::String(s) => ankql::ast::Literal::String(s.clone()),
130            Value::EntityId(entity_id) => ankql::ast::Literal::EntityId(entity_id.to_ulid()),
131            Value::Object(bytes) => ankql::ast::Literal::String(String::from_utf8_lossy(bytes).to_string()),
132            Value::Binary(bytes) => ankql::ast::Literal::String(String::from_utf8_lossy(bytes).to_string()),
133        }
134    }
135}