1use crate::prelude::*;
14
15use super::schema::*;
16use crate::base::duration::parse_duration;
17use base64::prelude::*;
18use bytes::Bytes;
19use chrono::Offset;
20use serde::{
21 de::{SeqAccess, Visitor},
22 ser::{SerializeMap, SerializeSeq, SerializeTuple},
23};
24use std::{collections::BTreeMap, ops::Deref, sync::Arc};
25
26pub trait EstimatedByteSize: Sized {
27 fn estimated_detached_byte_size(&self) -> usize;
28
29 fn estimated_byte_size(&self) -> usize {
30 self.estimated_detached_byte_size() + std::mem::size_of::<Self>()
31 }
32}
33
34#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
35pub struct RangeValue {
36 pub start: usize,
37 pub end: usize,
38}
39
40impl RangeValue {
41 pub fn new(start: usize, end: usize) -> Self {
42 RangeValue { start, end }
43 }
44
45 pub fn len(&self) -> usize {
46 self.end - self.start
47 }
48
49 pub fn is_empty(&self) -> bool {
50 self.start == self.end
51 }
52
53 pub fn extract_str<'s>(&self, s: &'s (impl AsRef<str> + ?Sized)) -> &'s str {
54 let s = s.as_ref();
55 &s[self.start..self.end]
56 }
57}
58
59impl Serialize for RangeValue {
60 fn serialize<S: serde::Serializer>(
61 &self,
62 serializer: S,
63 ) -> std::result::Result<S::Ok, S::Error> {
64 let mut tuple = serializer.serialize_tuple(2)?;
65 tuple.serialize_element(&self.start)?;
66 tuple.serialize_element(&self.end)?;
67 tuple.end()
68 }
69}
70
71impl<'de> Deserialize<'de> for RangeValue {
72 fn deserialize<D: serde::Deserializer<'de>>(
73 deserializer: D,
74 ) -> std::result::Result<Self, D::Error> {
75 struct RangeVisitor;
76
77 impl<'de> Visitor<'de> for RangeVisitor {
78 type Value = RangeValue;
79
80 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
81 formatter.write_str("a tuple of two u64")
82 }
83
84 fn visit_seq<V>(self, mut seq: V) -> std::result::Result<Self::Value, V::Error>
85 where
86 V: SeqAccess<'de>,
87 {
88 let start = seq
89 .next_element()?
90 .ok_or_else(|| serde::de::Error::missing_field("missing begin"))?;
91 let end = seq
92 .next_element()?
93 .ok_or_else(|| serde::de::Error::missing_field("missing end"))?;
94 Ok(RangeValue { start, end })
95 }
96 }
97 deserializer.deserialize_tuple(2, RangeVisitor)
98 }
99}
100
101#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Deserialize)]
103pub enum KeyPart {
104 Bytes(Bytes),
105 Str(Arc<str>),
106 Bool(bool),
107 Int64(i64),
108 Range(RangeValue),
109 Uuid(uuid::Uuid),
110 Date(chrono::NaiveDate),
111 Struct(Vec<KeyPart>),
112}
113
114impl From<Bytes> for KeyPart {
115 fn from(value: Bytes) -> Self {
116 KeyPart::Bytes(value)
117 }
118}
119
120impl From<Vec<u8>> for KeyPart {
121 fn from(value: Vec<u8>) -> Self {
122 KeyPart::Bytes(Bytes::from(value))
123 }
124}
125
126impl From<Arc<str>> for KeyPart {
127 fn from(value: Arc<str>) -> Self {
128 KeyPart::Str(value)
129 }
130}
131
132impl From<String> for KeyPart {
133 fn from(value: String) -> Self {
134 KeyPart::Str(Arc::from(value))
135 }
136}
137
138impl From<Cow<'_, str>> for KeyPart {
139 fn from(value: Cow<'_, str>) -> Self {
140 KeyPart::Str(Arc::from(value))
141 }
142}
143
144impl From<bool> for KeyPart {
145 fn from(value: bool) -> Self {
146 KeyPart::Bool(value)
147 }
148}
149
150impl From<i64> for KeyPart {
151 fn from(value: i64) -> Self {
152 KeyPart::Int64(value)
153 }
154}
155
156impl From<RangeValue> for KeyPart {
157 fn from(value: RangeValue) -> Self {
158 KeyPart::Range(value)
159 }
160}
161
162impl From<uuid::Uuid> for KeyPart {
163 fn from(value: uuid::Uuid) -> Self {
164 KeyPart::Uuid(value)
165 }
166}
167
168impl From<chrono::NaiveDate> for KeyPart {
169 fn from(value: chrono::NaiveDate) -> Self {
170 KeyPart::Date(value)
171 }
172}
173
174impl From<Vec<KeyPart>> for KeyPart {
175 fn from(value: Vec<KeyPart>) -> Self {
176 KeyPart::Struct(value)
177 }
178}
179
180impl serde::Serialize for KeyPart {
181 fn serialize<S: serde::Serializer>(
182 &self,
183 serializer: S,
184 ) -> std::result::Result<S::Ok, S::Error> {
185 Value::from(self.clone()).serialize(serializer)
186 }
187}
188
189impl std::fmt::Display for KeyPart {
190 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
191 match self {
192 KeyPart::Bytes(v) => write!(f, "{}", BASE64_STANDARD.encode(v)),
193 KeyPart::Str(v) => write!(f, "\"{}\"", v.escape_default()),
194 KeyPart::Bool(v) => write!(f, "{v}"),
195 KeyPart::Int64(v) => write!(f, "{v}"),
196 KeyPart::Range(v) => write!(f, "[{}, {})", v.start, v.end),
197 KeyPart::Uuid(v) => write!(f, "{v}"),
198 KeyPart::Date(v) => write!(f, "{v}"),
199 KeyPart::Struct(v) => {
200 write!(
201 f,
202 "[{}]",
203 v.iter()
204 .map(|v| v.to_string())
205 .collect::<Vec<_>>()
206 .join(", ")
207 )
208 }
209 }
210 }
211}
212
213impl KeyPart {
214 fn parts_from_str(
215 values_iter: &mut impl Iterator<Item = String>,
216 schema: &ValueType,
217 ) -> Result<Self> {
218 let result = match schema {
219 ValueType::Basic(basic_type) => {
220 let v = values_iter
221 .next()
222 .ok_or_else(|| api_error!("Key parts less than expected"))?;
223 match basic_type {
224 BasicValueType::Bytes => {
225 KeyPart::Bytes(Bytes::from(BASE64_STANDARD.decode(v)?))
226 }
227 BasicValueType::Str => KeyPart::Str(Arc::from(v)),
228 BasicValueType::Bool => KeyPart::Bool(v.parse()?),
229 BasicValueType::Int64 => KeyPart::Int64(v.parse()?),
230 BasicValueType::Range => {
231 let v2 = values_iter
232 .next()
233 .ok_or_else(|| api_error!("Key parts less than expected"))?;
234 KeyPart::Range(RangeValue {
235 start: v.parse()?,
236 end: v2.parse()?,
237 })
238 }
239 BasicValueType::Uuid => KeyPart::Uuid(v.parse()?),
240 BasicValueType::Date => KeyPart::Date(v.parse()?),
241 schema => api_bail!("Invalid key type {schema}"),
242 }
243 }
244 ValueType::Struct(s) => KeyPart::Struct(
245 s.fields
246 .iter()
247 .map(|f| KeyPart::parts_from_str(values_iter, &f.value_type.typ))
248 .collect::<Result<Vec<_>>>()?,
249 ),
250 _ => api_bail!("Invalid key type {schema}"),
251 };
252 Ok(result)
253 }
254
255 fn parts_to_strs(&self, output: &mut Vec<String>) {
256 match self {
257 KeyPart::Bytes(v) => output.push(BASE64_STANDARD.encode(v)),
258 KeyPart::Str(v) => output.push(v.to_string()),
259 KeyPart::Bool(v) => output.push(v.to_string()),
260 KeyPart::Int64(v) => output.push(v.to_string()),
261 KeyPart::Range(v) => {
262 output.push(v.start.to_string());
263 output.push(v.end.to_string());
264 }
265 KeyPart::Uuid(v) => output.push(v.to_string()),
266 KeyPart::Date(v) => output.push(v.to_string()),
267 KeyPart::Struct(v) => {
268 for part in v {
269 part.parts_to_strs(output);
270 }
271 }
272 }
273 }
274
275 pub fn from_strs(value: impl IntoIterator<Item = String>, schema: &ValueType) -> Result<Self> {
276 let mut values_iter = value.into_iter();
277 let result = Self::parts_from_str(&mut values_iter, schema)?;
278 if values_iter.next().is_some() {
279 api_bail!("Key parts more than expected");
280 }
281 Ok(result)
282 }
283
284 pub fn to_strs(&self) -> Vec<String> {
285 let mut output = Vec::with_capacity(self.num_parts());
286 self.parts_to_strs(&mut output);
287 output
288 }
289
290 pub fn kind_str(&self) -> &'static str {
291 match self {
292 KeyPart::Bytes(_) => "bytes",
293 KeyPart::Str(_) => "str",
294 KeyPart::Bool(_) => "bool",
295 KeyPart::Int64(_) => "int64",
296 KeyPart::Range { .. } => "range",
297 KeyPart::Uuid(_) => "uuid",
298 KeyPart::Date(_) => "date",
299 KeyPart::Struct(_) => "struct",
300 }
301 }
302
303 pub fn bytes_value(&self) -> Result<&Bytes> {
304 match self {
305 KeyPart::Bytes(v) => Ok(v),
306 _ => client_bail!("expected bytes value, but got {}", self.kind_str()),
307 }
308 }
309
310 pub fn str_value(&self) -> Result<&Arc<str>> {
311 match self {
312 KeyPart::Str(v) => Ok(v),
313 _ => client_bail!("expected str value, but got {}", self.kind_str()),
314 }
315 }
316
317 pub fn bool_value(&self) -> Result<bool> {
318 match self {
319 KeyPart::Bool(v) => Ok(*v),
320 _ => client_bail!("expected bool value, but got {}", self.kind_str()),
321 }
322 }
323
324 pub fn int64_value(&self) -> Result<i64> {
325 match self {
326 KeyPart::Int64(v) => Ok(*v),
327 _ => client_bail!("expected int64 value, but got {}", self.kind_str()),
328 }
329 }
330
331 pub fn range_value(&self) -> Result<RangeValue> {
332 match self {
333 KeyPart::Range(v) => Ok(*v),
334 _ => client_bail!("expected range value, but got {}", self.kind_str()),
335 }
336 }
337
338 pub fn uuid_value(&self) -> Result<uuid::Uuid> {
339 match self {
340 KeyPart::Uuid(v) => Ok(*v),
341 _ => client_bail!("expected uuid value, but got {}", self.kind_str()),
342 }
343 }
344
345 pub fn date_value(&self) -> Result<chrono::NaiveDate> {
346 match self {
347 KeyPart::Date(v) => Ok(*v),
348 _ => client_bail!("expected date value, but got {}", self.kind_str()),
349 }
350 }
351
352 pub fn struct_value(&self) -> Result<&Vec<KeyPart>> {
353 match self {
354 KeyPart::Struct(v) => Ok(v),
355 _ => client_bail!("expected struct value, but got {}", self.kind_str()),
356 }
357 }
358
359 pub fn num_parts(&self) -> usize {
360 match self {
361 KeyPart::Range(_) => 2,
362 KeyPart::Struct(v) => v.iter().map(|v| v.num_parts()).sum(),
363 _ => 1,
364 }
365 }
366
367 fn estimated_detached_byte_size(&self) -> usize {
368 match self {
369 KeyPart::Bytes(v) => v.len(),
370 KeyPart::Str(v) => v.len(),
371 KeyPart::Struct(v) => {
372 v.iter()
373 .map(KeyPart::estimated_detached_byte_size)
374 .sum::<usize>()
375 + v.len() * std::mem::size_of::<KeyPart>()
376 }
377 KeyPart::Bool(_)
378 | KeyPart::Int64(_)
379 | KeyPart::Range(_)
380 | KeyPart::Uuid(_)
381 | KeyPart::Date(_) => 0,
382 }
383 }
384}
385
386#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
387pub struct KeyValue(pub Box<[KeyPart]>);
388
389impl<T: Into<Box<[KeyPart]>>> From<T> for KeyValue {
390 fn from(value: T) -> Self {
391 KeyValue(value.into())
392 }
393}
394
395impl IntoIterator for KeyValue {
396 type Item = KeyPart;
397 type IntoIter = std::vec::IntoIter<KeyPart>;
398
399 fn into_iter(self) -> Self::IntoIter {
400 self.0.into_iter()
401 }
402}
403
404impl<'a> IntoIterator for &'a KeyValue {
405 type Item = &'a KeyPart;
406 type IntoIter = std::slice::Iter<'a, KeyPart>;
407
408 fn into_iter(self) -> Self::IntoIter {
409 self.0.iter()
410 }
411}
412
413impl Deref for KeyValue {
414 type Target = [KeyPart];
415
416 fn deref(&self) -> &Self::Target {
417 &self.0
418 }
419}
420
421impl std::fmt::Display for KeyValue {
422 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
423 write!(
424 f,
425 "{{{}}}",
426 self.0
427 .iter()
428 .map(|v| v.to_string())
429 .collect::<Vec<_>>()
430 .join(", ")
431 )
432 }
433}
434
435impl Serialize for KeyValue {
436 fn serialize<S: serde::Serializer>(
437 &self,
438 serializer: S,
439 ) -> std::result::Result<S::Ok, S::Error> {
440 if self.0.len() == 1 && !matches!(self.0[0], KeyPart::Struct(_)) {
441 self.0[0].serialize(serializer)
442 } else {
443 self.0.serialize(serializer)
444 }
445 }
446}
447
448impl KeyValue {
449 pub fn from_single_part<V: Into<KeyPart>>(value: V) -> Self {
450 Self(Box::new([value.into()]))
451 }
452
453 pub fn iter(&self) -> impl Iterator<Item = &KeyPart> {
454 self.0.iter()
455 }
456
457 pub fn from_json(value: serde_json::Value, schema: &[FieldSchema]) -> Result<Self> {
458 let field_values = if schema.len() == 1
459 && matches!(schema[0].value_type.typ, ValueType::Basic(_))
460 {
461 let val = Value::<ScopeValue>::from_json(value, &schema[0].value_type.typ)?;
462 Box::from([val.into_key()?])
463 } else {
464 match value {
465 serde_json::Value::Array(arr) => std::iter::zip(arr.into_iter(), schema)
466 .map(|(v, s)| Value::<ScopeValue>::from_json(v, &s.value_type.typ)?.into_key())
467 .collect::<Result<Box<[_]>>>()?,
468 _ => client_bail!("expected array value, but got {}", value),
469 }
470 };
471 Ok(Self(field_values))
472 }
473
474 pub fn encode_to_strs(&self) -> Vec<String> {
475 let capacity = self.0.iter().map(|k| k.num_parts()).sum();
476 let mut output = Vec::with_capacity(capacity);
477 for part in self.0.iter() {
478 part.parts_to_strs(&mut output);
479 }
480 output
481 }
482
483 pub fn decode_from_strs(
484 value: impl IntoIterator<Item = String>,
485 schema: &[FieldSchema],
486 ) -> Result<Self> {
487 let mut values_iter = value.into_iter();
488 let keys: Box<[KeyPart]> = schema
489 .iter()
490 .map(|f| KeyPart::parts_from_str(&mut values_iter, &f.value_type.typ))
491 .collect::<Result<Box<[_]>>>()?;
492 if values_iter.next().is_some() {
493 api_bail!("Key parts more than expected");
494 }
495 Ok(Self(keys))
496 }
497
498 pub fn to_values(&self) -> Box<[Value]> {
499 self.0.iter().map(|v| v.into()).collect()
500 }
501
502 pub fn single_part(&self) -> Result<&KeyPart> {
503 if self.0.len() != 1 {
504 api_bail!("expected single value, but got {}", self.0.len());
505 }
506 Ok(&self.0[0])
507 }
508}
509
510#[derive(Debug, Clone, PartialEq, Deserialize)]
511pub enum BasicValue {
512 Bytes(Bytes),
513 Str(Arc<str>),
514 Bool(bool),
515 Int64(i64),
516 Float32(f32),
517 Float64(f64),
518 Range(RangeValue),
519 Uuid(uuid::Uuid),
520 Date(chrono::NaiveDate),
521 Time(chrono::NaiveTime),
522 LocalDateTime(chrono::NaiveDateTime),
523 OffsetDateTime(chrono::DateTime<chrono::FixedOffset>),
524 TimeDelta(chrono::Duration),
525 Json(Arc<serde_json::Value>),
526 Vector(Arc<[BasicValue]>),
527 UnionVariant {
528 tag_id: usize,
529 value: Box<BasicValue>,
530 },
531}
532
533impl From<Bytes> for BasicValue {
534 fn from(value: Bytes) -> Self {
535 BasicValue::Bytes(value)
536 }
537}
538
539impl From<Vec<u8>> for BasicValue {
540 fn from(value: Vec<u8>) -> Self {
541 BasicValue::Bytes(Bytes::from(value))
542 }
543}
544
545impl From<Arc<str>> for BasicValue {
546 fn from(value: Arc<str>) -> Self {
547 BasicValue::Str(value)
548 }
549}
550
551impl From<String> for BasicValue {
552 fn from(value: String) -> Self {
553 BasicValue::Str(Arc::from(value))
554 }
555}
556
557impl From<Cow<'_, str>> for BasicValue {
558 fn from(value: Cow<'_, str>) -> Self {
559 BasicValue::Str(Arc::from(value))
560 }
561}
562
563impl From<bool> for BasicValue {
564 fn from(value: bool) -> Self {
565 BasicValue::Bool(value)
566 }
567}
568
569impl From<i64> for BasicValue {
570 fn from(value: i64) -> Self {
571 BasicValue::Int64(value)
572 }
573}
574
575impl From<f32> for BasicValue {
576 fn from(value: f32) -> Self {
577 BasicValue::Float32(value)
578 }
579}
580
581impl From<f64> for BasicValue {
582 fn from(value: f64) -> Self {
583 BasicValue::Float64(value)
584 }
585}
586
587impl From<uuid::Uuid> for BasicValue {
588 fn from(value: uuid::Uuid) -> Self {
589 BasicValue::Uuid(value)
590 }
591}
592
593impl From<chrono::NaiveDate> for BasicValue {
594 fn from(value: chrono::NaiveDate) -> Self {
595 BasicValue::Date(value)
596 }
597}
598
599impl From<chrono::NaiveTime> for BasicValue {
600 fn from(value: chrono::NaiveTime) -> Self {
601 BasicValue::Time(value)
602 }
603}
604
605impl From<chrono::NaiveDateTime> for BasicValue {
606 fn from(value: chrono::NaiveDateTime) -> Self {
607 BasicValue::LocalDateTime(value)
608 }
609}
610
611impl From<chrono::DateTime<chrono::FixedOffset>> for BasicValue {
612 fn from(value: chrono::DateTime<chrono::FixedOffset>) -> Self {
613 BasicValue::OffsetDateTime(value)
614 }
615}
616
617impl From<chrono::Duration> for BasicValue {
618 fn from(value: chrono::Duration) -> Self {
619 BasicValue::TimeDelta(value)
620 }
621}
622
623impl From<serde_json::Value> for BasicValue {
624 fn from(value: serde_json::Value) -> Self {
625 BasicValue::Json(Arc::from(value))
626 }
627}
628
629impl<T: Into<BasicValue>> From<Vec<T>> for BasicValue {
630 fn from(value: Vec<T>) -> Self {
631 BasicValue::Vector(Arc::from(
632 value.into_iter().map(|v| v.into()).collect::<Vec<_>>(),
633 ))
634 }
635}
636
637impl BasicValue {
638 pub fn into_key(self) -> Result<KeyPart> {
639 let result = match self {
640 BasicValue::Bytes(v) => KeyPart::Bytes(v),
641 BasicValue::Str(v) => KeyPart::Str(v),
642 BasicValue::Bool(v) => KeyPart::Bool(v),
643 BasicValue::Int64(v) => KeyPart::Int64(v),
644 BasicValue::Range(v) => KeyPart::Range(v),
645 BasicValue::Uuid(v) => KeyPart::Uuid(v),
646 BasicValue::Date(v) => KeyPart::Date(v),
647 BasicValue::Float32(_)
648 | BasicValue::Float64(_)
649 | BasicValue::Time(_)
650 | BasicValue::LocalDateTime(_)
651 | BasicValue::OffsetDateTime(_)
652 | BasicValue::TimeDelta(_)
653 | BasicValue::Json(_)
654 | BasicValue::Vector(_)
655 | BasicValue::UnionVariant { .. } => api_bail!("invalid key value type"),
656 };
657 Ok(result)
658 }
659
660 pub fn as_key(&self) -> Result<KeyPart> {
661 let result = match self {
662 BasicValue::Bytes(v) => KeyPart::Bytes(v.clone()),
663 BasicValue::Str(v) => KeyPart::Str(v.clone()),
664 BasicValue::Bool(v) => KeyPart::Bool(*v),
665 BasicValue::Int64(v) => KeyPart::Int64(*v),
666 BasicValue::Range(v) => KeyPart::Range(*v),
667 BasicValue::Uuid(v) => KeyPart::Uuid(*v),
668 BasicValue::Date(v) => KeyPart::Date(*v),
669 BasicValue::Float32(_)
670 | BasicValue::Float64(_)
671 | BasicValue::Time(_)
672 | BasicValue::LocalDateTime(_)
673 | BasicValue::OffsetDateTime(_)
674 | BasicValue::TimeDelta(_)
675 | BasicValue::Json(_)
676 | BasicValue::Vector(_)
677 | BasicValue::UnionVariant { .. } => api_bail!("invalid key value type"),
678 };
679 Ok(result)
680 }
681
682 pub fn kind(&self) -> &'static str {
683 match &self {
684 BasicValue::Bytes(_) => "bytes",
685 BasicValue::Str(_) => "str",
686 BasicValue::Bool(_) => "bool",
687 BasicValue::Int64(_) => "int64",
688 BasicValue::Float32(_) => "float32",
689 BasicValue::Float64(_) => "float64",
690 BasicValue::Range(_) => "range",
691 BasicValue::Uuid(_) => "uuid",
692 BasicValue::Date(_) => "date",
693 BasicValue::Time(_) => "time",
694 BasicValue::LocalDateTime(_) => "local_datetime",
695 BasicValue::OffsetDateTime(_) => "offset_datetime",
696 BasicValue::TimeDelta(_) => "timedelta",
697 BasicValue::Json(_) => "json",
698 BasicValue::Vector(_) => "vector",
699 BasicValue::UnionVariant { .. } => "union",
700 }
701 }
702
703 fn estimated_detached_byte_size(&self) -> usize {
705 fn json_estimated_detached_byte_size(val: &serde_json::Value) -> usize {
706 match val {
707 serde_json::Value::String(s) => s.len(),
708 serde_json::Value::Array(arr) => {
709 arr.iter()
710 .map(json_estimated_detached_byte_size)
711 .sum::<usize>()
712 + arr.len() * std::mem::size_of::<serde_json::Value>()
713 }
714 serde_json::Value::Object(map) => map
715 .iter()
716 .map(|(k, v)| {
717 std::mem::size_of::<serde_json::map::Entry>()
718 + k.len()
719 + json_estimated_detached_byte_size(v)
720 })
721 .sum(),
722 serde_json::Value::Null
723 | serde_json::Value::Bool(_)
724 | serde_json::Value::Number(_) => 0,
725 }
726 }
727 match self {
728 BasicValue::Bytes(v) => v.len(),
729 BasicValue::Str(v) => v.len(),
730 BasicValue::Json(v) => json_estimated_detached_byte_size(v),
731 BasicValue::Vector(v) => {
732 v.iter()
733 .map(BasicValue::estimated_detached_byte_size)
734 .sum::<usize>()
735 + v.len() * std::mem::size_of::<BasicValue>()
736 }
737 BasicValue::UnionVariant { value, .. } => {
738 value.estimated_detached_byte_size() + std::mem::size_of::<BasicValue>()
739 }
740 BasicValue::Bool(_)
741 | BasicValue::Int64(_)
742 | BasicValue::Float32(_)
743 | BasicValue::Float64(_)
744 | BasicValue::Range(_)
745 | BasicValue::Uuid(_)
746 | BasicValue::Date(_)
747 | BasicValue::Time(_)
748 | BasicValue::LocalDateTime(_)
749 | BasicValue::OffsetDateTime(_)
750 | BasicValue::TimeDelta(_) => 0,
751 }
752 }
753}
754
755#[derive(Debug, Clone, Default, PartialEq)]
756pub enum Value<VS = ScopeValue> {
757 #[default]
758 Null,
759 Basic(BasicValue),
760 Struct(FieldValues<VS>),
761 UTable(Vec<VS>),
762 KTable(BTreeMap<KeyValue, VS>),
763 LTable(Vec<VS>),
764}
765
766impl<T: Into<BasicValue>> From<T> for Value {
767 fn from(value: T) -> Self {
768 Value::Basic(value.into())
769 }
770}
771
772impl From<KeyPart> for Value {
773 fn from(value: KeyPart) -> Self {
774 match value {
775 KeyPart::Bytes(v) => Value::Basic(BasicValue::Bytes(v)),
776 KeyPart::Str(v) => Value::Basic(BasicValue::Str(v)),
777 KeyPart::Bool(v) => Value::Basic(BasicValue::Bool(v)),
778 KeyPart::Int64(v) => Value::Basic(BasicValue::Int64(v)),
779 KeyPart::Range(v) => Value::Basic(BasicValue::Range(v)),
780 KeyPart::Uuid(v) => Value::Basic(BasicValue::Uuid(v)),
781 KeyPart::Date(v) => Value::Basic(BasicValue::Date(v)),
782 KeyPart::Struct(v) => Value::Struct(FieldValues {
783 fields: v.into_iter().map(Value::from).collect(),
784 }),
785 }
786 }
787}
788
789impl From<&KeyPart> for Value {
790 fn from(value: &KeyPart) -> Self {
791 match value {
792 KeyPart::Bytes(v) => Value::Basic(BasicValue::Bytes(v.clone())),
793 KeyPart::Str(v) => Value::Basic(BasicValue::Str(v.clone())),
794 KeyPart::Bool(v) => Value::Basic(BasicValue::Bool(*v)),
795 KeyPart::Int64(v) => Value::Basic(BasicValue::Int64(*v)),
796 KeyPart::Range(v) => Value::Basic(BasicValue::Range(*v)),
797 KeyPart::Uuid(v) => Value::Basic(BasicValue::Uuid(*v)),
798 KeyPart::Date(v) => Value::Basic(BasicValue::Date(*v)),
799 KeyPart::Struct(v) => Value::Struct(FieldValues {
800 fields: v.iter().map(Value::from).collect(),
801 }),
802 }
803 }
804}
805
806impl From<FieldValues> for Value {
807 fn from(value: FieldValues) -> Self {
808 Value::Struct(value)
809 }
810}
811
812impl<T: Into<Value>> From<Option<T>> for Value {
813 fn from(value: Option<T>) -> Self {
814 match value {
815 Some(v) => v.into(),
816 None => Value::Null,
817 }
818 }
819}
820
821impl<VS> Value<VS> {
822 pub fn from_alternative<AltVS>(value: Value<AltVS>) -> Self
823 where
824 AltVS: Into<VS>,
825 {
826 match value {
827 Value::Null => Value::Null,
828 Value::Basic(v) => Value::Basic(v),
829 Value::Struct(v) => Value::Struct(FieldValues::<VS> {
830 fields: v
831 .fields
832 .into_iter()
833 .map(|v| Value::<VS>::from_alternative(v))
834 .collect(),
835 }),
836 Value::UTable(v) => Value::UTable(v.into_iter().map(|v| v.into()).collect()),
837 Value::KTable(v) => Value::KTable(v.into_iter().map(|(k, v)| (k, v.into())).collect()),
838 Value::LTable(v) => Value::LTable(v.into_iter().map(|v| v.into()).collect()),
839 }
840 }
841
842 pub fn from_alternative_ref<AltVS>(value: &Value<AltVS>) -> Self
843 where
844 for<'a> &'a AltVS: Into<VS>,
845 {
846 match value {
847 Value::Null => Value::Null,
848 Value::Basic(v) => Value::Basic(v.clone()),
849 Value::Struct(v) => Value::Struct(FieldValues::<VS> {
850 fields: v
851 .fields
852 .iter()
853 .map(|v| Value::<VS>::from_alternative_ref(v))
854 .collect(),
855 }),
856 Value::UTable(v) => Value::UTable(v.iter().map(|v| v.into()).collect()),
857 Value::KTable(v) => {
858 Value::KTable(v.iter().map(|(k, v)| (k.clone(), v.into())).collect())
859 }
860 Value::LTable(v) => Value::LTable(v.iter().map(|v| v.into()).collect()),
861 }
862 }
863
864 pub fn is_null(&self) -> bool {
865 matches!(self, Value::Null)
866 }
867
868 pub fn into_key(self) -> Result<KeyPart> {
869 let result = match self {
870 Value::Basic(v) => v.into_key()?,
871 Value::Struct(v) => KeyPart::Struct(
872 v.fields
873 .into_iter()
874 .map(|v| v.into_key())
875 .collect::<Result<Vec<_>>>()?,
876 ),
877 Value::Null | Value::UTable(_) | Value::KTable(_) | Value::LTable(_) => {
878 client_bail!("invalid key value type")
879 }
880 };
881 Ok(result)
882 }
883
884 pub fn as_key(&self) -> Result<KeyPart> {
885 let result = match self {
886 Value::Basic(v) => v.as_key()?,
887 Value::Struct(v) => KeyPart::Struct(
888 v.fields
889 .iter()
890 .map(|v| v.as_key())
891 .collect::<Result<Vec<_>>>()?,
892 ),
893 Value::Null | Value::UTable(_) | Value::KTable(_) | Value::LTable(_) => {
894 client_bail!("invalid key value type")
895 }
896 };
897 Ok(result)
898 }
899
900 pub fn kind(&self) -> &'static str {
901 match self {
902 Value::Null => "null",
903 Value::Basic(v) => v.kind(),
904 Value::Struct(_) => "Struct",
905 Value::UTable(_) => "UTable",
906 Value::KTable(_) => "KTable",
907 Value::LTable(_) => "LTable",
908 }
909 }
910
911 pub fn optional(&self) -> Option<&Self> {
912 match self {
913 Value::Null => None,
914 _ => Some(self),
915 }
916 }
917
918 pub fn as_bytes(&self) -> Result<&Bytes> {
919 match self {
920 Value::Basic(BasicValue::Bytes(v)) => Ok(v),
921 _ => client_bail!("expected bytes value, but got {}", self.kind()),
922 }
923 }
924
925 pub fn as_str(&self) -> Result<&Arc<str>> {
926 match self {
927 Value::Basic(BasicValue::Str(v)) => Ok(v),
928 _ => client_bail!("expected str value, but got {}", self.kind()),
929 }
930 }
931
932 pub fn as_bool(&self) -> Result<bool> {
933 match self {
934 Value::Basic(BasicValue::Bool(v)) => Ok(*v),
935 _ => client_bail!("expected bool value, but got {}", self.kind()),
936 }
937 }
938
939 pub fn as_int64(&self) -> Result<i64> {
940 match self {
941 Value::Basic(BasicValue::Int64(v)) => Ok(*v),
942 _ => client_bail!("expected int64 value, but got {}", self.kind()),
943 }
944 }
945
946 pub fn as_float32(&self) -> Result<f32> {
947 match self {
948 Value::Basic(BasicValue::Float32(v)) => Ok(*v),
949 _ => client_bail!("expected float32 value, but got {}", self.kind()),
950 }
951 }
952
953 pub fn as_float64(&self) -> Result<f64> {
954 match self {
955 Value::Basic(BasicValue::Float64(v)) => Ok(*v),
956 _ => client_bail!("expected float64 value, but got {}", self.kind()),
957 }
958 }
959
960 pub fn as_range(&self) -> Result<RangeValue> {
961 match self {
962 Value::Basic(BasicValue::Range(v)) => Ok(*v),
963 _ => client_bail!("expected range value, but got {}", self.kind()),
964 }
965 }
966
967 pub fn as_json(&self) -> Result<&Arc<serde_json::Value>> {
968 match self {
969 Value::Basic(BasicValue::Json(v)) => Ok(v),
970 _ => client_bail!("expected json value, but got {}", self.kind()),
971 }
972 }
973
974 pub fn as_vector(&self) -> Result<&Arc<[BasicValue]>> {
975 match self {
976 Value::Basic(BasicValue::Vector(v)) => Ok(v),
977 _ => client_bail!("expected vector value, but got {}", self.kind()),
978 }
979 }
980
981 pub fn as_struct(&self) -> Result<&FieldValues<VS>> {
982 match self {
983 Value::Struct(v) => Ok(v),
984 _ => client_bail!("expected struct value, but got {}", self.kind()),
985 }
986 }
987}
988
989impl<VS: EstimatedByteSize> Value<VS> {
990 pub fn estimated_byte_size(&self) -> usize {
991 std::mem::size_of::<Self>()
992 + match self {
993 Value::Null => 0,
994 Value::Basic(v) => v.estimated_detached_byte_size(),
995 Value::Struct(v) => v.estimated_detached_byte_size(),
996 Value::UTable(v) | Value::LTable(v) => {
997 v.iter()
998 .map(|v| v.estimated_detached_byte_size())
999 .sum::<usize>()
1000 + v.len() * std::mem::size_of::<ScopeValue>()
1001 }
1002 Value::KTable(v) => {
1003 v.iter()
1004 .map(|(k, v)| {
1005 k.iter()
1006 .map(|k| k.estimated_detached_byte_size())
1007 .sum::<usize>()
1008 + v.estimated_detached_byte_size()
1009 })
1010 .sum::<usize>()
1011 + v.len() * std::mem::size_of::<(String, ScopeValue)>()
1012 }
1013 }
1014 }
1015}
1016
1017#[derive(Debug, Clone, PartialEq)]
1018pub struct FieldValues<VS = ScopeValue> {
1019 pub fields: Vec<Value<VS>>,
1020}
1021
1022impl<VS: EstimatedByteSize> EstimatedByteSize for FieldValues<VS> {
1023 fn estimated_detached_byte_size(&self) -> usize {
1024 self.fields
1025 .iter()
1026 .map(Value::<VS>::estimated_byte_size)
1027 .sum::<usize>()
1028 + self.fields.len() * std::mem::size_of::<Value<VS>>()
1029 }
1030}
1031
1032impl serde::Serialize for FieldValues {
1033 fn serialize<S: serde::Serializer>(
1034 &self,
1035 serializer: S,
1036 ) -> std::result::Result<S::Ok, S::Error> {
1037 self.fields.serialize(serializer)
1038 }
1039}
1040
1041impl<VS: Clone> FieldValues<VS>
1042where
1043 FieldValues<VS>: Into<VS>,
1044{
1045 pub fn new(num_fields: usize) -> Self {
1046 let mut fields = Vec::with_capacity(num_fields);
1047 fields.resize(num_fields, Value::<VS>::Null);
1048 Self { fields }
1049 }
1050
1051 fn from_json_values<'a>(
1052 fields: impl Iterator<Item = (&'a FieldSchema, serde_json::Value)>,
1053 ) -> Result<Self> {
1054 Ok(Self {
1055 fields: fields
1056 .map(|(s, v)| {
1057 let value = Value::<VS>::from_json(v, &s.value_type.typ)
1058 .with_context(|| format!("while deserializing field `{}`", s.name))?;
1059 if value.is_null() && !s.value_type.nullable {
1060 api_bail!("expected non-null value for `{}`", s.name);
1061 }
1062 Ok(value)
1063 })
1064 .collect::<Result<Vec<_>>>()?,
1065 })
1066 }
1067
1068 fn from_json_object<'a>(
1069 values: serde_json::Map<String, serde_json::Value>,
1070 fields_schema: impl Iterator<Item = &'a FieldSchema>,
1071 ) -> Result<Self> {
1072 let mut values = values;
1073 Ok(Self {
1074 fields: fields_schema
1075 .map(|field| {
1076 let value = match values.get_mut(&field.name) {
1077 Some(v) => Value::<VS>::from_json(std::mem::take(v), &field.value_type.typ)
1078 .with_context(|| {
1079 format!("while deserializing field `{}`", field.name)
1080 })?,
1081 None => Value::<VS>::default(),
1082 };
1083 if value.is_null() && !field.value_type.nullable {
1084 api_bail!("expected non-null value for `{}`", field.name);
1085 }
1086 Ok(value)
1087 })
1088 .collect::<Result<Vec<_>>>()?,
1089 })
1090 }
1091
1092 pub fn from_json(value: serde_json::Value, fields_schema: &[FieldSchema]) -> Result<Self> {
1093 match value {
1094 serde_json::Value::Array(v) => {
1095 if v.len() != fields_schema.len() {
1096 api_bail!("unmatched value length");
1097 }
1098 Self::from_json_values(fields_schema.iter().zip(v))
1099 }
1100 serde_json::Value::Object(v) => Self::from_json_object(v, fields_schema.iter()),
1101 _ => api_bail!("invalid value type"),
1102 }
1103 }
1104}
1105
1106#[derive(Debug, Clone, Serialize, PartialEq)]
1107pub struct ScopeValue(pub FieldValues);
1108
1109impl EstimatedByteSize for ScopeValue {
1110 fn estimated_detached_byte_size(&self) -> usize {
1111 self.0.estimated_detached_byte_size()
1112 }
1113}
1114
1115impl Deref for ScopeValue {
1116 type Target = FieldValues;
1117
1118 fn deref(&self) -> &Self::Target {
1119 &self.0
1120 }
1121}
1122
1123impl From<FieldValues> for ScopeValue {
1124 fn from(value: FieldValues) -> Self {
1125 Self(value)
1126 }
1127}
1128
1129impl serde::Serialize for BasicValue {
1130 fn serialize<S: serde::Serializer>(
1131 &self,
1132 serializer: S,
1133 ) -> std::result::Result<S::Ok, S::Error> {
1134 match self {
1135 BasicValue::Bytes(v) => serializer.serialize_str(&BASE64_STANDARD.encode(v)),
1136 BasicValue::Str(v) => serializer.serialize_str(v),
1137 BasicValue::Bool(v) => serializer.serialize_bool(*v),
1138 BasicValue::Int64(v) => serializer.serialize_i64(*v),
1139 BasicValue::Float32(v) => serializer.serialize_f32(*v),
1140 BasicValue::Float64(v) => serializer.serialize_f64(*v),
1141 BasicValue::Range(v) => v.serialize(serializer),
1142 BasicValue::Uuid(v) => serializer.serialize_str(&v.to_string()),
1143 BasicValue::Date(v) => serializer.serialize_str(&v.to_string()),
1144 BasicValue::Time(v) => serializer.serialize_str(&v.to_string()),
1145 BasicValue::LocalDateTime(v) => {
1146 serializer.serialize_str(&v.format("%Y-%m-%dT%H:%M:%S%.6f").to_string())
1147 }
1148 BasicValue::OffsetDateTime(v) => {
1149 serializer.serialize_str(&v.to_rfc3339_opts(chrono::SecondsFormat::AutoSi, true))
1150 }
1151 BasicValue::TimeDelta(v) => serializer.serialize_str(&v.to_string()),
1152 BasicValue::Json(v) => v.serialize(serializer),
1153 BasicValue::Vector(v) => v.serialize(serializer),
1154 BasicValue::UnionVariant { tag_id, value } => {
1155 let mut s = serializer.serialize_tuple(2)?;
1156 s.serialize_element(tag_id)?;
1157 s.serialize_element(value)?;
1158 s.end()
1159 }
1160 }
1161 }
1162}
1163
1164impl BasicValue {
1165 pub fn from_json(value: serde_json::Value, schema: &BasicValueType) -> Result<Self> {
1166 let result = match (value, schema) {
1167 (serde_json::Value::String(v), BasicValueType::Bytes) => {
1168 BasicValue::Bytes(Bytes::from(BASE64_STANDARD.decode(v)?))
1169 }
1170 (serde_json::Value::String(v), BasicValueType::Str) => BasicValue::Str(Arc::from(v)),
1171 (serde_json::Value::Bool(v), BasicValueType::Bool) => BasicValue::Bool(v),
1172 (serde_json::Value::Number(v), BasicValueType::Int64) => BasicValue::Int64(
1173 v.as_i64()
1174 .ok_or_else(|| client_error!("invalid int64 value {v}"))?,
1175 ),
1176 (serde_json::Value::Number(v), BasicValueType::Float32) => BasicValue::Float32(
1177 v.as_f64()
1178 .ok_or_else(|| client_error!("invalid fp32 value {v}"))? as f32,
1179 ),
1180 (serde_json::Value::Number(v), BasicValueType::Float64) => BasicValue::Float64(
1181 v.as_f64()
1182 .ok_or_else(|| client_error!("invalid fp64 value {v}"))?,
1183 ),
1184 (v, BasicValueType::Range) => BasicValue::Range(utils::deser::from_json_value(v)?),
1185 (serde_json::Value::String(v), BasicValueType::Uuid) => BasicValue::Uuid(v.parse()?),
1186 (serde_json::Value::String(v), BasicValueType::Date) => BasicValue::Date(v.parse()?),
1187 (serde_json::Value::String(v), BasicValueType::Time) => BasicValue::Time(v.parse()?),
1188 (serde_json::Value::String(v), BasicValueType::LocalDateTime) => {
1189 BasicValue::LocalDateTime(v.parse()?)
1190 }
1191 (serde_json::Value::String(v), BasicValueType::OffsetDateTime) => {
1192 match chrono::DateTime::parse_from_rfc3339(&v) {
1193 Ok(dt) => BasicValue::OffsetDateTime(dt),
1194 Err(e) => {
1195 if let Ok(dt) = v.parse::<chrono::NaiveDateTime>() {
1196 warn!("Datetime without timezone offset, assuming UTC");
1197 BasicValue::OffsetDateTime(chrono::DateTime::from_naive_utc_and_offset(
1198 dt,
1199 chrono::Utc.fix(),
1200 ))
1201 } else {
1202 Err(e)?
1203 }
1204 }
1205 }
1206 }
1207 (serde_json::Value::String(v), BasicValueType::TimeDelta) => {
1208 BasicValue::TimeDelta(parse_duration(&v)?)
1209 }
1210 (v, BasicValueType::Json) => BasicValue::Json(Arc::from(v)),
1211 (
1212 serde_json::Value::Array(v),
1213 BasicValueType::Vector(VectorTypeSchema { element_type, .. }),
1214 ) => {
1215 let vec = v
1216 .into_iter()
1217 .enumerate()
1218 .map(|(i, v)| {
1219 BasicValue::from_json(v, element_type)
1220 .with_context(|| format!("while deserializing Vector element #{i}"))
1221 })
1222 .collect::<Result<Vec<_>>>()?;
1223 BasicValue::Vector(Arc::from(vec))
1224 }
1225 (v, BasicValueType::Union(typ)) => {
1226 let arr = match v {
1227 serde_json::Value::Array(arr) => arr,
1228 _ => client_bail!("Invalid JSON value for union, expect array"),
1229 };
1230
1231 if arr.len() != 2 {
1232 client_bail!(
1233 "Invalid union tuple: expect 2 values, received {}",
1234 arr.len()
1235 );
1236 }
1237
1238 let mut obj_iter = arr.into_iter();
1239
1240 let tag_id = obj_iter
1242 .next()
1243 .and_then(|value| value.as_u64().map(|num_u64| num_u64 as usize))
1244 .unwrap();
1245
1246 let value = obj_iter.next().unwrap();
1248
1249 let cur_type = typ
1250 .types
1251 .get(tag_id)
1252 .ok_or_else(|| client_error!("No type in `tag_id` \"{tag_id}\" found"))?;
1253
1254 BasicValue::UnionVariant {
1255 tag_id,
1256 value: Box::new(BasicValue::from_json(value, cur_type)?),
1257 }
1258 }
1259 (v, t) => {
1260 client_bail!("Value and type not matched.\nTarget type {t:?}\nJSON value: {v}\n")
1261 }
1262 };
1263 Ok(result)
1264 }
1265}
1266
1267struct TableEntry<'a>(&'a [KeyPart], &'a ScopeValue);
1268
1269impl serde::Serialize for Value<ScopeValue> {
1270 fn serialize<S: serde::Serializer>(
1271 &self,
1272 serializer: S,
1273 ) -> std::result::Result<S::Ok, S::Error> {
1274 match self {
1275 Value::Null => serializer.serialize_none(),
1276 Value::Basic(v) => v.serialize(serializer),
1277 Value::Struct(v) => v.serialize(serializer),
1278 Value::UTable(v) => v.serialize(serializer),
1279 Value::KTable(m) => {
1280 let mut seq = serializer.serialize_seq(Some(m.len()))?;
1281 for (k, v) in m.iter() {
1282 seq.serialize_element(&TableEntry(k, v))?;
1283 }
1284 seq.end()
1285 }
1286 Value::LTable(v) => v.serialize(serializer),
1287 }
1288 }
1289}
1290
1291impl serde::Serialize for TableEntry<'_> {
1292 fn serialize<S: serde::Serializer>(
1293 &self,
1294 serializer: S,
1295 ) -> std::result::Result<S::Ok, S::Error> {
1296 let &TableEntry(key, value) = self;
1297 let mut seq = serializer.serialize_seq(Some(key.len() + value.0.fields.len()))?;
1298 for item in key.iter() {
1299 seq.serialize_element(item)?;
1300 }
1301 for item in value.0.fields.iter() {
1302 seq.serialize_element(item)?;
1303 }
1304 seq.end()
1305 }
1306}
1307
1308impl<VS: Clone> Value<VS>
1309where
1310 FieldValues<VS>: Into<VS>,
1311{
1312 pub fn from_json(value: serde_json::Value, schema: &ValueType) -> Result<Self> {
1313 let result = match (value, schema) {
1314 (serde_json::Value::Null, _) => Value::<VS>::Null,
1315 (v, ValueType::Basic(t)) => Value::<VS>::Basic(BasicValue::from_json(v, t)?),
1316 (v, ValueType::Struct(s)) => {
1317 Value::<VS>::Struct(FieldValues::<VS>::from_json(v, &s.fields)?)
1318 }
1319 (serde_json::Value::Array(v), ValueType::Table(s)) => {
1320 match s.kind {
1321 TableKind::UTable => {
1322 let rows = v
1323 .into_iter()
1324 .map(|v| {
1325 Ok(FieldValues::from_json(v, &s.row.fields)
1326 .with_context(|| "while deserializing UTable row".to_string())?
1327 .into())
1328 })
1329 .collect::<Result<Vec<_>>>()?;
1330 Value::LTable(rows)
1331 }
1332 TableKind::KTable(info) => {
1333 let num_key_parts = info.num_key_parts;
1334 let rows =
1335 v.into_iter()
1336 .map(|v| {
1337 if s.row.fields.len() < num_key_parts {
1338 client_bail!("Invalid KTable schema: expect at least {} fields, got {}", num_key_parts, s.row.fields.len());
1339 }
1340 let mut fields_iter = s.row.fields.iter();
1341 match v {
1342 serde_json::Value::Array(v) => {
1343 if v.len() != fields_iter.len() {
1344 client_bail!("Invalid KTable value: expect {} values, received {}", fields_iter.len(), v.len());
1345 }
1346
1347 let mut field_vals_iter = v.into_iter();
1348 let keys: Box<[KeyPart]> = (0..num_key_parts)
1349 .map(|_| {
1350 let field_schema = fields_iter.next().unwrap();
1351 Self::from_json(
1352 field_vals_iter.next().unwrap(),
1353 &field_schema.value_type.typ,
1354 ).with_context(|| {
1355 format!("while deserializing key part `{}`", field_schema.name)
1356 })?
1357 .into_key()
1358 })
1359 .collect::<Result<_>>()?;
1360
1361 let values = FieldValues::from_json_values(
1362 std::iter::zip(fields_iter, field_vals_iter),
1363 )?;
1364 Ok((KeyValue(keys), values.into()))
1365 }
1366 serde_json::Value::Object(mut v) => {
1367 let keys: Box<[KeyPart]> = (0..num_key_parts).map(|_| {
1368 let f = fields_iter.next().unwrap();
1369 Self::from_json(
1370 std::mem::take(v.get_mut(&f.name).ok_or_else(
1371 || {
1372 api_error!(
1373 "key field `{}` doesn't exist in value",
1374 f.name
1375 )
1376 },
1377 )?),
1378 &f.value_type.typ)?.into_key()
1379 }).collect::<Result<_>>()?;
1380 let values = FieldValues::from_json_object(v, fields_iter)?;
1381 Ok((KeyValue(keys), values.into()))
1382 }
1383 _ => api_bail!("Table value must be a JSON array or object"),
1384 }
1385 })
1386 .collect::<Result<BTreeMap<_, _>>>()?;
1387 Value::KTable(rows)
1388 }
1389 TableKind::LTable => {
1390 let rows = v
1391 .into_iter()
1392 .enumerate()
1393 .map(|(i, v)| {
1394 Ok(FieldValues::from_json(v, &s.row.fields)
1395 .with_context(|| {
1396 format!("while deserializing LTable row #{i}")
1397 })?
1398 .into())
1399 })
1400 .collect::<Result<Vec<_>>>()?;
1401 Value::LTable(rows)
1402 }
1403 }
1404 }
1405 (v, t) => {
1406 client_bail!("Value and type not matched.\nTarget type {t:?}\nJSON value: {v}\n")
1407 }
1408 };
1409 Ok(result)
1410 }
1411}
1412
1413#[derive(Debug, Clone, Copy)]
1414pub struct TypedValue<'a> {
1415 pub t: &'a ValueType,
1416 pub v: &'a Value,
1417}
1418
1419impl Serialize for TypedValue<'_> {
1420 fn serialize<S: serde::Serializer>(
1421 &self,
1422 serializer: S,
1423 ) -> std::result::Result<S::Ok, S::Error> {
1424 match (self.t, self.v) {
1425 (_, Value::Null) => serializer.serialize_none(),
1426 (ValueType::Basic(t), v) => match t {
1427 BasicValueType::Union(_) => match v {
1428 Value::Basic(BasicValue::UnionVariant { value, .. }) => {
1429 value.serialize(serializer)
1430 }
1431 _ => Err(serde::ser::Error::custom(
1432 "Unmatched union type and value for `TypedValue`",
1433 )),
1434 },
1435 _ => v.serialize(serializer),
1436 },
1437 (ValueType::Struct(s), Value::Struct(field_values)) => TypedFieldsValue {
1438 schema: &s.fields,
1439 values_iter: field_values.fields.iter(),
1440 }
1441 .serialize(serializer),
1442 (ValueType::Table(c), Value::UTable(rows) | Value::LTable(rows)) => {
1443 let mut seq = serializer.serialize_seq(Some(rows.len()))?;
1444 for row in rows {
1445 seq.serialize_element(&TypedFieldsValue {
1446 schema: &c.row.fields,
1447 values_iter: row.fields.iter(),
1448 })?;
1449 }
1450 seq.end()
1451 }
1452 (ValueType::Table(c), Value::KTable(rows)) => {
1453 let mut seq = serializer.serialize_seq(Some(rows.len()))?;
1454 for (k, v) in rows {
1455 let keys: Box<[Value]> = k.iter().map(|k| Value::from(k.clone())).collect();
1456 seq.serialize_element(&TypedFieldsValue {
1457 schema: &c.row.fields,
1458 values_iter: keys.iter().chain(v.fields.iter()),
1459 })?;
1460 }
1461 seq.end()
1462 }
1463 _ => Err(serde::ser::Error::custom(format!(
1464 "Incompatible value type: {:?} {:?}",
1465 self.t, self.v
1466 ))),
1467 }
1468 }
1469}
1470
1471pub struct TypedFieldsValue<'a, I: Iterator<Item = &'a Value> + Clone> {
1472 pub schema: &'a [FieldSchema],
1473 pub values_iter: I,
1474}
1475
1476impl<'a, I: Iterator<Item = &'a Value> + Clone> Serialize for TypedFieldsValue<'a, I> {
1477 fn serialize<S: serde::Serializer>(
1478 &self,
1479 serializer: S,
1480 ) -> std::result::Result<S::Ok, S::Error> {
1481 let mut map = serializer.serialize_map(Some(self.schema.len()))?;
1482 let values_iter = self.values_iter.clone();
1483 for (field, value) in self.schema.iter().zip(values_iter) {
1484 map.serialize_entry(
1485 &field.name,
1486 &TypedValue {
1487 t: &field.value_type.typ,
1488 v: value,
1489 },
1490 )?;
1491 }
1492 map.end()
1493 }
1494}
1495
1496pub mod test_util {
1497 use super::*;
1498
1499 pub fn serde_roundtrip(value: &Value, typ: &ValueType) -> Result<Value> {
1500 let json_value = serde_json::to_value(value)?;
1501 let roundtrip_value = Value::from_json(json_value, typ)?;
1502 Ok(roundtrip_value)
1503 }
1504}
1505
1506#[cfg(test)]
1507mod tests {
1508 use super::*;
1509 use std::collections::BTreeMap;
1510
1511 #[test]
1512 fn test_estimated_byte_size_null() {
1513 let value = Value::<ScopeValue>::Null;
1514 let size = value.estimated_byte_size();
1515 assert_eq!(size, std::mem::size_of::<Value<ScopeValue>>());
1516 }
1517
1518 #[test]
1519 fn test_estimated_byte_size_basic_primitive() {
1520 let value = Value::<ScopeValue>::Basic(BasicValue::Bool(true));
1522 let size = value.estimated_byte_size();
1523 assert_eq!(size, std::mem::size_of::<Value<ScopeValue>>());
1524
1525 let value = Value::<ScopeValue>::Basic(BasicValue::Int64(42));
1526 let size = value.estimated_byte_size();
1527 assert_eq!(size, std::mem::size_of::<Value<ScopeValue>>());
1528
1529 let value = Value::<ScopeValue>::Basic(BasicValue::Float64(3.14));
1530 let size = value.estimated_byte_size();
1531 assert_eq!(size, std::mem::size_of::<Value<ScopeValue>>());
1532 }
1533
1534 #[test]
1535 fn test_estimated_byte_size_basic_string() {
1536 let test_str = "hello world";
1537 let value = Value::<ScopeValue>::Basic(BasicValue::Str(Arc::from(test_str)));
1538 let size = value.estimated_byte_size();
1539
1540 let expected_size = std::mem::size_of::<Value<ScopeValue>>() + test_str.len();
1541 assert_eq!(size, expected_size);
1542 }
1543
1544 #[test]
1545 fn test_estimated_byte_size_basic_bytes() {
1546 let test_bytes = b"hello world";
1547 let value = Value::<ScopeValue>::Basic(BasicValue::Bytes(Bytes::from(test_bytes.to_vec())));
1548 let size = value.estimated_byte_size();
1549
1550 let expected_size = std::mem::size_of::<Value<ScopeValue>>() + test_bytes.len();
1551 assert_eq!(size, expected_size);
1552 }
1553
1554 #[test]
1555 fn test_estimated_byte_size_basic_json() {
1556 let json_val = serde_json::json!({"key": "value", "number": 42});
1557 let value = Value::<ScopeValue>::Basic(BasicValue::Json(Arc::from(json_val)));
1558 let size = value.estimated_byte_size();
1559
1560 assert!(size > std::mem::size_of::<Value<ScopeValue>>());
1563 }
1564
1565 #[test]
1566 fn test_estimated_byte_size_basic_vector() {
1567 let vec_elements = vec![
1568 BasicValue::Str(Arc::from("hello")),
1569 BasicValue::Str(Arc::from("world")),
1570 BasicValue::Int64(42),
1571 ];
1572 let value = Value::<ScopeValue>::Basic(BasicValue::Vector(Arc::from(vec_elements)));
1573 let size = value.estimated_byte_size();
1574
1575 let expected_min_size = std::mem::size_of::<Value<ScopeValue>>()
1577 + "hello".len()
1578 + "world".len()
1579 + 3 * std::mem::size_of::<BasicValue>();
1580 assert!(size >= expected_min_size);
1581 }
1582
1583 #[test]
1584 fn test_estimated_byte_size_struct() {
1585 let fields = vec![
1586 Value::<ScopeValue>::Basic(BasicValue::Str(Arc::from("test"))),
1587 Value::<ScopeValue>::Basic(BasicValue::Int64(123)),
1588 ];
1589 let field_values = FieldValues { fields };
1590 let value = Value::<ScopeValue>::Struct(field_values);
1591 let size = value.estimated_byte_size();
1592
1593 let expected_min_size = std::mem::size_of::<Value<ScopeValue>>()
1594 + "test".len()
1595 + 2 * std::mem::size_of::<Value<ScopeValue>>();
1596 assert!(size >= expected_min_size);
1597 }
1598
1599 #[test]
1600 fn test_estimated_byte_size_utable() {
1601 let scope_values = vec![
1602 ScopeValue(FieldValues {
1603 fields: vec![Value::<ScopeValue>::Basic(BasicValue::Str(Arc::from(
1604 "item1",
1605 )))],
1606 }),
1607 ScopeValue(FieldValues {
1608 fields: vec![Value::<ScopeValue>::Basic(BasicValue::Str(Arc::from(
1609 "item2",
1610 )))],
1611 }),
1612 ];
1613 let value = Value::<ScopeValue>::UTable(scope_values);
1614 let size = value.estimated_byte_size();
1615
1616 let expected_min_size = std::mem::size_of::<Value<ScopeValue>>()
1617 + "item1".len()
1618 + "item2".len()
1619 + 2 * std::mem::size_of::<ScopeValue>();
1620 assert!(size >= expected_min_size);
1621 }
1622
1623 #[test]
1624 fn test_estimated_byte_size_ltable() {
1625 let scope_values = vec![
1626 ScopeValue(FieldValues {
1627 fields: vec![Value::<ScopeValue>::Basic(BasicValue::Str(Arc::from(
1628 "list1",
1629 )))],
1630 }),
1631 ScopeValue(FieldValues {
1632 fields: vec![Value::<ScopeValue>::Basic(BasicValue::Str(Arc::from(
1633 "list2",
1634 )))],
1635 }),
1636 ];
1637 let value = Value::<ScopeValue>::LTable(scope_values);
1638 let size = value.estimated_byte_size();
1639
1640 let expected_min_size = std::mem::size_of::<Value<ScopeValue>>()
1641 + "list1".len()
1642 + "list2".len()
1643 + 2 * std::mem::size_of::<ScopeValue>();
1644 assert!(size >= expected_min_size);
1645 }
1646
1647 #[test]
1648 fn test_estimated_byte_size_ktable() {
1649 let mut map = BTreeMap::new();
1650 map.insert(
1651 KeyValue(Box::from([KeyPart::Str(Arc::from("key1"))])),
1652 ScopeValue(FieldValues {
1653 fields: vec![Value::<ScopeValue>::Basic(BasicValue::Str(Arc::from(
1654 "value1",
1655 )))],
1656 }),
1657 );
1658 map.insert(
1659 KeyValue(Box::from([KeyPart::Str(Arc::from("key2"))])),
1660 ScopeValue(FieldValues {
1661 fields: vec![Value::<ScopeValue>::Basic(BasicValue::Str(Arc::from(
1662 "value2",
1663 )))],
1664 }),
1665 );
1666 let value = Value::<ScopeValue>::KTable(map);
1667 let size = value.estimated_byte_size();
1668
1669 let expected_min_size = std::mem::size_of::<Value<ScopeValue>>()
1670 + "key1".len()
1671 + "key2".len()
1672 + "value1".len()
1673 + "value2".len()
1674 + 2 * std::mem::size_of::<(String, ScopeValue)>();
1675 assert!(size >= expected_min_size);
1676 }
1677
1678 #[test]
1679 fn test_estimated_byte_size_nested_struct() {
1680 let inner_struct = Value::<ScopeValue>::Struct(FieldValues {
1681 fields: vec![
1682 Value::<ScopeValue>::Basic(BasicValue::Str(Arc::from("inner"))),
1683 Value::<ScopeValue>::Basic(BasicValue::Int64(456)),
1684 ],
1685 });
1686
1687 let outer_struct = Value::<ScopeValue>::Struct(FieldValues {
1688 fields: vec![
1689 Value::<ScopeValue>::Basic(BasicValue::Str(Arc::from("outer"))),
1690 inner_struct,
1691 ],
1692 });
1693
1694 let size = outer_struct.estimated_byte_size();
1695
1696 let expected_min_size = std::mem::size_of::<Value<ScopeValue>>()
1697 + "outer".len()
1698 + "inner".len()
1699 + 4 * std::mem::size_of::<Value<ScopeValue>>();
1700 assert!(size >= expected_min_size);
1701 }
1702
1703 #[test]
1704 fn test_estimated_byte_size_empty_collections() {
1705 let value = Value::<ScopeValue>::UTable(vec![]);
1707 let size = value.estimated_byte_size();
1708 assert_eq!(size, std::mem::size_of::<Value<ScopeValue>>());
1709
1710 let value = Value::<ScopeValue>::LTable(vec![]);
1712 let size = value.estimated_byte_size();
1713 assert_eq!(size, std::mem::size_of::<Value<ScopeValue>>());
1714
1715 let value = Value::<ScopeValue>::KTable(BTreeMap::new());
1717 let size = value.estimated_byte_size();
1718 assert_eq!(size, std::mem::size_of::<Value<ScopeValue>>());
1719
1720 let value = Value::<ScopeValue>::Struct(FieldValues { fields: vec![] });
1722 let size = value.estimated_byte_size();
1723 assert_eq!(size, std::mem::size_of::<Value<ScopeValue>>());
1724 }
1725}