Skip to main content

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