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 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}