Skip to main content

recoco_core/base/
value.rs

1// ReCoco is a Rust-only fork of CocoIndex, by [CocoIndex](https://CocoIndex)
2// Original code from CocoIndex is copyrighted by CocoIndex
3// SPDX-FileCopyrightText: 2025-2026 CocoIndex (upstream)
4// SPDX-FileContributor: CocoIndex Contributors
5//
6// All modifications from the upstream for ReCoco are copyrighted by Knitli Inc.
7// SPDX-FileCopyrightText: 2026 Knitli Inc. (ReCoco)
8// SPDX-FileContributor: Adam Poulemanos <adam@knit.li>
9//
10// Both the upstream CocoIndex code and the ReCoco modifications are licensed under the Apache-2.0 License.
11// SPDX-License-Identifier: Apache-2.0
12
13use 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/// Value of key.
102#[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    /// Returns the estimated byte size of the value, for detached data (i.e. allocated on heap).
704    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                // Take first element
1241                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                // Take second element
1247                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        // Test primitives that should have 0 detached byte size
1521        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        // Should include the size of the JSON structure
1561        // The exact size depends on the internal JSON representation
1562        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        // Should include the size of the vector elements
1576        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        // Empty UTable
1706        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        // Empty LTable
1711        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        // Empty KTable
1716        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        // Empty Struct
1721        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}