1use crate::typed::Typed;
2use crate::*;
3pub use bytes::Bytes;
4pub use smol_str::SmolStr;
5
6#[derive(Clone, Debug)]
8pub enum OwnedValue<'ty> {
9 U64(u64),
10 U32(u32),
11 U16(u16),
12 U8(u8),
13 I64(i64),
14 I32(i32),
15 I16(i16),
16 I8(i8),
17 F32(f32),
18 F64(f64),
19 Bool(bool),
20 String(String),
21 Vec(Box<dyn VecInstance<'ty> + 'ty>),
22 Struct(Box<dyn StructInstance<'ty> + 'ty>),
23 Enum(Box<dyn EnumInstance<'ty> + 'ty>),
24 Bytes(Bytes),
25 Option(Box<dyn OptionInstance<'ty> + 'ty>),
26}
27
28impl<'ty> PartialEq for OwnedValue<'ty> {
29 fn eq(&self, other: &Self) -> bool {
30 use OwnedValue::*;
31 match (self, other) {
32 (U64(l), U64(r)) => l == r,
33 (U32(l), U32(r)) => l == r,
34 (U16(l), U16(r)) => l == r,
35 (U8(l), U8(r)) => l == r,
36 (I64(l), I64(r)) => l == r,
37 (I32(l), I32(r)) => l == r,
38 (I16(l), I16(r)) => l == r,
39 (I8(l), I8(r)) => l == r,
40 (F32(l), F32(r)) => l == r,
41 (F64(l), F64(r)) => l == r,
42 (Bool(l), Bool(r)) => l == r,
43 (String(l), String(r)) => l == r,
44 (Vec(l), Vec(r)) => l == r,
45 (Struct(l), Struct(r)) => l == r,
46 (Enum(l), Enum(r)) => l == r,
47 (Bytes(l), Bytes(r)) => l == r,
48 _ => false,
49 }
50 }
51}
52
53impl<'v> OwnedValue<'v> {
54 pub fn as_ref<'val>(&'val self) -> Value<'val, 'v>
56 where
57 'v: 'val,
58 {
59 match self {
60 OwnedValue::U64(a) => a.as_value(),
61 OwnedValue::U32(a) => a.as_value(),
62 OwnedValue::U16(a) => a.as_value(),
63 OwnedValue::U8(a) => a.as_value(),
64 OwnedValue::I64(a) => a.as_value(),
65 OwnedValue::I32(a) => a.as_value(),
66 OwnedValue::I16(a) => a.as_value(),
67 OwnedValue::I8(a) => a.as_value(),
68 OwnedValue::F32(a) => a.as_value(),
69 OwnedValue::F64(a) => a.as_value(),
70 OwnedValue::Bool(a) => a.as_value(),
71 OwnedValue::String(a) => a.as_value(),
72 OwnedValue::Vec(a) => Value::from_vec(a.as_ref()),
73 OwnedValue::Struct(a) => Value::from_struct(a.as_ref()),
74 OwnedValue::Enum(a) => Value::from_enum(a.as_ref()),
75 OwnedValue::Bytes(b) => b.as_value(),
76 OwnedValue::Option(o) => Value::from_option(o.as_ref()),
77 }
78 }
79}
80
81impl<'ty> From<String> for OwnedValue<'ty> {
82 fn from(val: String) -> OwnedValue<'ty> {
83 OwnedValue::String(val)
84 }
85}
86
87#[derive(Clone)]
88pub enum CowValue<'val, 'ty> {
89 Owned(OwnedValue<'ty>),
90 Ref(Value<'val, 'ty>),
91}
92
93impl<'val, 'ty> From<Value<'val, 'ty>> for CowValue<'val, 'ty> {
94 fn from(v: Value<'val, 'ty>) -> Self {
95 Self::Ref(v)
96 }
97}
98
99impl<'val, 'ty> From<OwnedValue<'ty>> for CowValue<'val, 'ty> {
100 fn from(v: OwnedValue<'ty>) -> Self {
101 Self::Owned(v)
102 }
103}
104
105impl<'val, 'ty> CowValue<'val, 'ty> {
106 pub fn slow_eq<'c, 'd>(&self, other: &CowValue<'c, 'd>) -> bool {
107 self.as_ref().slow_eq(&other.as_ref())
108 }
109}
110
111impl std::fmt::Debug for CowValue<'_, '_> {
112 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
113 match self {
114 CowValue::Owned(o) => std::fmt::Debug::fmt(&o, f),
115 CowValue::Ref(r) => std::fmt::Debug::fmt(&r, f),
116 }
117 }
118}
119
120impl PartialEq for CowValue<'_, '_> {
121 fn eq(&self, other: &Self) -> bool {
122 self.as_ref() == other.as_ref()
123 }
124}
125
126impl<'val, 'ty> CowValue<'val, 'ty> {
127 pub fn as_ref(&'val self) -> Value<'val, 'ty> {
128 match self {
129 CowValue::Owned(owned) => owned.as_ref(),
130 CowValue::Ref(r) => r.clone(),
131 }
132 }
133
134 pub fn to_owned(&self) -> OwnedValue<'ty> {
135 match self {
136 CowValue::Owned(owned) => owned.clone(),
137 CowValue::Ref(r) => r.to_owned(),
138 }
139 }
140}