Skip to main content

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