Skip to main content

qubit_value/multi_values/
multi_values_constructor.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 implementations for constructing `MultiValues` from `Vec<T>`.
12
13/// Private marker trait used to prevent downstream implementations.
14trait MultiValuesConstructorSealed<T> {}
15
16/// Internal trait used to create `MultiValues` from `Vec<T>`.
17///
18/// This trait backs `MultiValues::new<T>()`; downstream code should call the
19/// inherent method instead of implementing or naming this trait directly.
20#[allow(private_bounds)]
21pub trait MultiValuesConstructor<T>: MultiValuesConstructorSealed<T> {
22    /// Builds a `MultiValues` instance from `values`.
23    ///
24    /// # Returns
25    ///
26    /// Returns the enum variant corresponding to `T`.
27    fn from_vec(values: Vec<T>) -> Self;
28}
29
30use std::collections::HashMap;
31use std::time::Duration;
32
33use bigdecimal::BigDecimal;
34use chrono::{
35    DateTime,
36    NaiveDate,
37    NaiveDateTime,
38    NaiveTime,
39    Utc,
40};
41use num_bigint::BigInt;
42use url::Url;
43
44use super::multi_values::MultiValues;
45
46macro_rules! impl_multi_values_constructor {
47    ($type:ty, $variant:ident) => {
48        impl MultiValuesConstructorSealed<$type> for MultiValues {}
49
50        impl MultiValuesConstructor<$type> for MultiValues {
51            #[inline]
52            fn from_vec(values: Vec<$type>) -> Self {
53                MultiValues::$variant(values)
54            }
55        }
56    };
57}
58
59impl_multi_values_constructor!(bool, Bool);
60impl_multi_values_constructor!(char, Char);
61impl_multi_values_constructor!(i8, Int8);
62impl_multi_values_constructor!(i16, Int16);
63impl_multi_values_constructor!(i32, Int32);
64impl_multi_values_constructor!(i64, Int64);
65impl_multi_values_constructor!(i128, Int128);
66impl_multi_values_constructor!(u8, UInt8);
67impl_multi_values_constructor!(u16, UInt16);
68impl_multi_values_constructor!(u32, UInt32);
69impl_multi_values_constructor!(u64, UInt64);
70impl_multi_values_constructor!(u128, UInt128);
71impl_multi_values_constructor!(isize, IntSize);
72impl_multi_values_constructor!(usize, UIntSize);
73impl_multi_values_constructor!(f32, Float32);
74impl_multi_values_constructor!(f64, Float64);
75impl_multi_values_constructor!(String, String);
76impl_multi_values_constructor!(NaiveDate, Date);
77impl_multi_values_constructor!(NaiveTime, Time);
78impl_multi_values_constructor!(NaiveDateTime, DateTime);
79impl_multi_values_constructor!(DateTime<Utc>, Instant);
80impl_multi_values_constructor!(BigInt, BigInteger);
81impl_multi_values_constructor!(BigDecimal, BigDecimal);
82impl_multi_values_constructor!(Duration, Duration);
83impl_multi_values_constructor!(Url, Url);
84impl_multi_values_constructor!(HashMap<String, String>, StringMap);
85impl_multi_values_constructor!(serde_json::Value, Json);