Skip to main content

qubit_value/multi_values/
multi_values_constructor_arg.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 dispatch implementations for `MultiValues::new<S>()` arguments.
12
13use std::collections::HashMap;
14use std::time::Duration;
15
16use bigdecimal::BigDecimal;
17use chrono::{
18    DateTime,
19    NaiveDate,
20    NaiveDateTime,
21    NaiveTime,
22    Utc,
23};
24use num_bigint::BigInt;
25use url::Url;
26
27use super::multi_values::MultiValues;
28use super::multi_values_constructor::MultiValuesConstructor;
29
30/// Collects borrowed string values into owned strings.
31#[inline]
32fn collect_strings<'a, I>(values: I) -> Vec<String>
33where
34    I: IntoIterator<Item = &'a str>,
35{
36    let mut result = Vec::new();
37    for value in values {
38        result.push(value.to_string());
39    }
40    result
41}
42
43/// Internal dispatch trait for `MultiValues::new<S>()` arguments.
44pub trait MultiValuesConstructorArg<'a>: super::sealed::MultiValuesConstructorArgSealed {
45    /// Builds a `MultiValues` instance from this argument.
46    fn into_multi_values(self) -> MultiValues;
47}
48
49macro_rules! impl_multi_values_constructor_arg {
50    ($type:ty) => {
51        impl super::sealed::MultiValuesConstructorArgSealed for Vec<$type> {}
52
53        impl<'a> MultiValuesConstructorArg<'a> for Vec<$type> {
54            #[inline]
55            fn into_multi_values(self) -> MultiValues {
56                <MultiValues as MultiValuesConstructor<$type>>::from_vec(self)
57            }
58        }
59
60        impl<'a> super::sealed::MultiValuesConstructorArgSealed for &'a [$type] {}
61
62        impl<'a> MultiValuesConstructorArg<'a> for &'a [$type]
63        where
64            $type: Clone,
65        {
66            #[inline]
67            fn into_multi_values(self) -> MultiValues {
68                <MultiValues as MultiValuesConstructor<$type>>::from_vec(self.to_vec())
69            }
70        }
71
72        impl<'a> super::sealed::MultiValuesConstructorArgSealed for &'a Vec<$type> {}
73
74        impl<'a> MultiValuesConstructorArg<'a> for &'a Vec<$type>
75        where
76            $type: Clone,
77        {
78            #[inline]
79            fn into_multi_values(self) -> MultiValues {
80                <MultiValues as MultiValuesConstructor<$type>>::from_vec(self.clone())
81            }
82        }
83
84        impl<const N: usize> super::sealed::MultiValuesConstructorArgSealed for [$type; N] {}
85
86        impl<'a, const N: usize> MultiValuesConstructorArg<'a> for [$type; N] {
87            #[inline]
88            fn into_multi_values(self) -> MultiValues {
89                <MultiValues as MultiValuesConstructor<$type>>::from_vec(Vec::from(self))
90            }
91        }
92
93        impl<'a, const N: usize> super::sealed::MultiValuesConstructorArgSealed for &'a [$type; N] {}
94
95        impl<'a, const N: usize> MultiValuesConstructorArg<'a> for &'a [$type; N]
96        where
97            $type: Clone,
98        {
99            #[inline]
100            fn into_multi_values(self) -> MultiValues {
101                <MultiValues as MultiValuesConstructor<$type>>::from_vec(self.to_vec())
102            }
103        }
104    };
105}
106
107impl_multi_values_constructor_arg!(bool);
108impl_multi_values_constructor_arg!(char);
109impl_multi_values_constructor_arg!(i8);
110impl_multi_values_constructor_arg!(i16);
111impl_multi_values_constructor_arg!(i32);
112impl_multi_values_constructor_arg!(i64);
113impl_multi_values_constructor_arg!(i128);
114impl_multi_values_constructor_arg!(u8);
115impl_multi_values_constructor_arg!(u16);
116impl_multi_values_constructor_arg!(u32);
117impl_multi_values_constructor_arg!(u64);
118impl_multi_values_constructor_arg!(u128);
119impl_multi_values_constructor_arg!(isize);
120impl_multi_values_constructor_arg!(usize);
121impl_multi_values_constructor_arg!(f32);
122impl_multi_values_constructor_arg!(f64);
123impl_multi_values_constructor_arg!(String);
124impl_multi_values_constructor_arg!(NaiveDate);
125impl_multi_values_constructor_arg!(NaiveTime);
126impl_multi_values_constructor_arg!(NaiveDateTime);
127impl_multi_values_constructor_arg!(DateTime<Utc>);
128impl_multi_values_constructor_arg!(BigInt);
129impl_multi_values_constructor_arg!(BigDecimal);
130impl_multi_values_constructor_arg!(Duration);
131impl_multi_values_constructor_arg!(Url);
132impl_multi_values_constructor_arg!(HashMap<String, String>);
133impl_multi_values_constructor_arg!(serde_json::Value);
134
135impl super::sealed::MultiValuesConstructorArgSealed for Vec<&str> {}
136
137impl MultiValuesConstructorArg<'_> for Vec<&str> {
138    #[inline]
139    fn into_multi_values(self) -> MultiValues {
140        MultiValues::String(collect_strings(self))
141    }
142}
143
144impl super::sealed::MultiValuesConstructorArgSealed for &[&str] {}
145
146impl MultiValuesConstructorArg<'_> for &[&str] {
147    #[inline]
148    fn into_multi_values(self) -> MultiValues {
149        MultiValues::String(collect_strings(self.iter().copied()))
150    }
151}
152
153impl super::sealed::MultiValuesConstructorArgSealed for &Vec<&str> {}
154
155impl MultiValuesConstructorArg<'_> for &Vec<&str> {
156    #[inline]
157    fn into_multi_values(self) -> MultiValues {
158        MultiValues::String(collect_strings(self.iter().copied()))
159    }
160}
161
162impl<const N: usize> super::sealed::MultiValuesConstructorArgSealed for [&str; N] {}
163
164impl<const N: usize> MultiValuesConstructorArg<'_> for [&str; N] {
165    #[inline]
166    fn into_multi_values(self) -> MultiValues {
167        MultiValues::String(collect_strings(self))
168    }
169}
170
171impl<const N: usize> super::sealed::MultiValuesConstructorArgSealed for &[&str; N] {}
172
173impl<const N: usize> MultiValuesConstructorArg<'_> for &[&str; N] {
174    #[inline]
175    fn into_multi_values(self) -> MultiValues {
176        MultiValues::String(collect_strings(self.iter().copied()))
177    }
178}