Skip to main content

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