Skip to main content

qubit_value/multi_values/
multi_values_getter.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026 Haixing Hu.
4 *
5 *    SPDX-License-Identifier: Apache-2.0
6 *
7 *    Licensed under the Apache License, Version 2.0.
8 *
9 ******************************************************************************/
10
11//! `TryFrom<&MultiValues>` implementations for strict first-value and list reads.
12
13use qubit_datatype::DataType;
14
15use crate::value_error::{
16    ValueError,
17    ValueResult,
18};
19
20use super::multi_values::MultiValues;
21
22macro_rules! impl_multi_value_first_try_from_ref {
23    ($type:ty, $variant:ident, $data_type:expr) => {
24        impl TryFrom<&MultiValues> for $type {
25            type Error = ValueError;
26
27            #[inline]
28            fn try_from(values: &MultiValues) -> ValueResult<$type> {
29                match values {
30                    MultiValues::$variant(v) => v.first().cloned().ok_or(ValueError::NoValue),
31                    MultiValues::Empty(dt) if *dt == $data_type => Err(ValueError::NoValue),
32                    _ => Err(ValueError::TypeMismatch {
33                        expected: $data_type,
34                        actual: values.data_type(),
35                    }),
36                }
37            }
38        }
39    };
40}
41
42macro_rules! impl_multi_values_try_from_ref {
43    ($type:ty, $variant:ident, $data_type:expr) => {
44        impl TryFrom<&MultiValues> for Vec<$type> {
45            type Error = ValueError;
46
47            #[inline]
48            fn try_from(values: &MultiValues) -> ValueResult<Vec<$type>> {
49                match values {
50                    MultiValues::$variant(v) => Ok(v.clone()),
51                    MultiValues::Empty(dt) if *dt == $data_type => Ok(Vec::new()),
52                    _ => Err(ValueError::TypeMismatch {
53                        expected: $data_type,
54                        actual: values.data_type(),
55                    }),
56                }
57            }
58        }
59    };
60}
61
62impl_multi_value_first_try_from_ref!(bool, Bool, DataType::Bool);
63impl_multi_value_first_try_from_ref!(char, Char, DataType::Char);
64impl_multi_value_first_try_from_ref!(i8, Int8, DataType::Int8);
65impl_multi_value_first_try_from_ref!(i16, Int16, DataType::Int16);
66impl_multi_value_first_try_from_ref!(i32, Int32, DataType::Int32);
67impl_multi_value_first_try_from_ref!(i64, Int64, DataType::Int64);
68impl_multi_value_first_try_from_ref!(i128, Int128, DataType::Int128);
69impl_multi_value_first_try_from_ref!(u8, UInt8, DataType::UInt8);
70impl_multi_value_first_try_from_ref!(u16, UInt16, DataType::UInt16);
71impl_multi_value_first_try_from_ref!(u32, UInt32, DataType::UInt32);
72impl_multi_value_first_try_from_ref!(u64, UInt64, DataType::UInt64);
73impl_multi_value_first_try_from_ref!(u128, UInt128, DataType::UInt128);
74impl_multi_value_first_try_from_ref!(f32, Float32, DataType::Float32);
75impl_multi_value_first_try_from_ref!(f64, Float64, DataType::Float64);
76impl_multi_value_first_try_from_ref!(String, String, DataType::String);
77impl_multi_value_first_try_from_ref!(chrono::NaiveDate, Date, DataType::Date);
78impl_multi_value_first_try_from_ref!(chrono::NaiveTime, Time, DataType::Time);
79impl_multi_value_first_try_from_ref!(chrono::NaiveDateTime, DateTime, DataType::DateTime);
80impl_multi_value_first_try_from_ref!(chrono::DateTime<chrono::Utc>, Instant, DataType::Instant);
81impl_multi_value_first_try_from_ref!(num_bigint::BigInt, BigInteger, DataType::BigInteger);
82impl_multi_value_first_try_from_ref!(bigdecimal::BigDecimal, BigDecimal, DataType::BigDecimal);
83impl_multi_value_first_try_from_ref!(isize, IntSize, DataType::IntSize);
84impl_multi_value_first_try_from_ref!(usize, UIntSize, DataType::UIntSize);
85impl_multi_value_first_try_from_ref!(std::time::Duration, Duration, DataType::Duration);
86impl_multi_value_first_try_from_ref!(url::Url, Url, DataType::Url);
87impl_multi_value_first_try_from_ref!(
88    std::collections::HashMap<String, String>,
89    StringMap,
90    DataType::StringMap
91);
92impl_multi_value_first_try_from_ref!(serde_json::Value, Json, DataType::Json);
93
94impl_multi_values_try_from_ref!(bool, Bool, DataType::Bool);
95impl_multi_values_try_from_ref!(char, Char, DataType::Char);
96impl_multi_values_try_from_ref!(i8, Int8, DataType::Int8);
97impl_multi_values_try_from_ref!(i16, Int16, DataType::Int16);
98impl_multi_values_try_from_ref!(i32, Int32, DataType::Int32);
99impl_multi_values_try_from_ref!(i64, Int64, DataType::Int64);
100impl_multi_values_try_from_ref!(i128, Int128, DataType::Int128);
101impl_multi_values_try_from_ref!(u8, UInt8, DataType::UInt8);
102impl_multi_values_try_from_ref!(u16, UInt16, DataType::UInt16);
103impl_multi_values_try_from_ref!(u32, UInt32, DataType::UInt32);
104impl_multi_values_try_from_ref!(u64, UInt64, DataType::UInt64);
105impl_multi_values_try_from_ref!(u128, UInt128, DataType::UInt128);
106impl_multi_values_try_from_ref!(f32, Float32, DataType::Float32);
107impl_multi_values_try_from_ref!(f64, Float64, DataType::Float64);
108impl_multi_values_try_from_ref!(String, String, DataType::String);
109impl_multi_values_try_from_ref!(chrono::NaiveDate, Date, DataType::Date);
110impl_multi_values_try_from_ref!(chrono::NaiveTime, Time, DataType::Time);
111impl_multi_values_try_from_ref!(chrono::NaiveDateTime, DateTime, DataType::DateTime);
112impl_multi_values_try_from_ref!(chrono::DateTime<chrono::Utc>, Instant, DataType::Instant);
113impl_multi_values_try_from_ref!(num_bigint::BigInt, BigInteger, DataType::BigInteger);
114impl_multi_values_try_from_ref!(bigdecimal::BigDecimal, BigDecimal, DataType::BigDecimal);
115impl_multi_values_try_from_ref!(isize, IntSize, DataType::IntSize);
116impl_multi_values_try_from_ref!(usize, UIntSize, DataType::UIntSize);
117impl_multi_values_try_from_ref!(std::time::Duration, Duration, DataType::Duration);
118impl_multi_values_try_from_ref!(url::Url, Url, DataType::Url);
119impl_multi_values_try_from_ref!(
120    std::collections::HashMap<String, String>,
121    StringMap,
122    DataType::StringMap
123);
124impl_multi_values_try_from_ref!(serde_json::Value, Json, DataType::Json);