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//! Internal getter trait implementations for `MultiValues`.
12
13use qubit_datatype::DataType;
14
15use crate::value_error::{
16    ValueError,
17    ValueResult,
18};
19
20use super::multi_values::MultiValues;
21
22/// Private marker trait used to prevent downstream implementations.
23trait MultiValuesGetterSealed<T> {}
24
25/// Internal trait used to extract multiple values from `MultiValues`.
26///
27/// This trait backs `MultiValues::get<T>()`; downstream code should call the
28/// inherent method instead of implementing or naming this trait directly.
29#[allow(private_bounds)]
30pub trait MultiValuesGetter<T>: MultiValuesGetterSealed<T> {
31    /// Gets all stored values as `Vec<T>`.
32    ///
33    /// # Returns
34    ///
35    /// Returns a cloned vector when the stored variant matches `T`, or a
36    /// `ValueError` describing the mismatch.
37    fn get_values(&self) -> ValueResult<Vec<T>>;
38}
39
40macro_rules! impl_multi_values_getter {
41    ($type:ty, $variant:ident, $data_type:expr) => {
42        impl MultiValuesGetterSealed<$type> for MultiValues {}
43
44        impl MultiValuesGetter<$type> for MultiValues {
45            #[inline]
46            fn get_values(&self) -> ValueResult<Vec<$type>> {
47                match self {
48                    MultiValues::$variant(v) => Ok(v.clone()),
49                    MultiValues::Empty(dt) if *dt == $data_type => Ok(Vec::new()),
50                    _ => Err(ValueError::TypeMismatch {
51                        expected: $data_type,
52                        actual: self.data_type(),
53                    }),
54                }
55            }
56        }
57    };
58}
59
60impl_multi_values_getter!(bool, Bool, DataType::Bool);
61impl_multi_values_getter!(char, Char, DataType::Char);
62impl_multi_values_getter!(i8, Int8, DataType::Int8);
63impl_multi_values_getter!(i16, Int16, DataType::Int16);
64impl_multi_values_getter!(i32, Int32, DataType::Int32);
65impl_multi_values_getter!(i64, Int64, DataType::Int64);
66impl_multi_values_getter!(i128, Int128, DataType::Int128);
67impl_multi_values_getter!(u8, UInt8, DataType::UInt8);
68impl_multi_values_getter!(u16, UInt16, DataType::UInt16);
69impl_multi_values_getter!(u32, UInt32, DataType::UInt32);
70impl_multi_values_getter!(u64, UInt64, DataType::UInt64);
71impl_multi_values_getter!(u128, UInt128, DataType::UInt128);
72impl_multi_values_getter!(f32, Float32, DataType::Float32);
73impl_multi_values_getter!(f64, Float64, DataType::Float64);
74impl_multi_values_getter!(String, String, DataType::String);
75impl_multi_values_getter!(chrono::NaiveDate, Date, DataType::Date);
76impl_multi_values_getter!(chrono::NaiveTime, Time, DataType::Time);
77impl_multi_values_getter!(chrono::NaiveDateTime, DateTime, DataType::DateTime);
78impl_multi_values_getter!(chrono::DateTime<chrono::Utc>, Instant, DataType::Instant);
79impl_multi_values_getter!(num_bigint::BigInt, BigInteger, DataType::BigInteger);
80impl_multi_values_getter!(bigdecimal::BigDecimal, BigDecimal, DataType::BigDecimal);
81impl_multi_values_getter!(isize, IntSize, DataType::IntSize);
82impl_multi_values_getter!(usize, UIntSize, DataType::UIntSize);
83impl_multi_values_getter!(std::time::Duration, Duration, DataType::Duration);
84impl_multi_values_getter!(url::Url, Url, DataType::Url);
85impl_multi_values_getter!(std::collections::HashMap<String, String>, StringMap, DataType::StringMap);
86impl_multi_values_getter!(serde_json::Value, Json, DataType::Json);