• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

qubit-ltd / rs-value / 7bb4a305-cab1-4f73-ae1d-45fd12406bed

02 May 2026 05:05PM UTC coverage: 98.991% (-0.5%) from 99.488%
7bb4a305-cab1-4f73-ae1d-45fd12406bed

push

circleci

Haixing-Hu
docs: expand value README examples

1177 of 1189 relevant lines covered (98.99%)

31.12 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.68
/src/multi_values/multi_values_accessors.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
use std::collections::HashMap;
12
use std::time::Duration;
13

14
use bigdecimal::BigDecimal;
15
use chrono::{
16
    DateTime,
17
    NaiveDate,
18
    NaiveDateTime,
19
    NaiveTime,
20
    Utc,
21
};
22
use num_bigint::BigInt;
23
use url::Url;
24

25
use qubit_datatype::DataType;
26

27
use crate::value_error::{
28
    ValueError,
29
    ValueResult,
30
};
31

32
use super::multi_values::MultiValues;
33
use super::multi_values_add_arg::MultiValuesAddArg;
34
use super::multi_values_adder::MultiValuesAdder;
35
use super::multi_values_constructor_arg::MultiValuesConstructorArg;
36
use super::multi_values_first_getter::MultiValuesFirstGetter;
37
use super::multi_values_getter::MultiValuesGetter;
38
use super::multi_values_multi_adder::MultiValuesMultiAdder;
39
use super::multi_values_set_arg::MultiValuesSetArg;
40
use super::multi_values_setter::MultiValuesSetter;
41
use super::multi_values_setter_slice::MultiValuesSetterSlice;
42
use super::multi_values_single_setter::MultiValuesSingleSetter;
43
use crate::IntoValueDefault;
44

45
impl MultiValues {
46
    /// Generic constructor method
47
    ///
48
    /// Creates `MultiValues` from `Vec<T>`, avoiding direct use of enum
49
    /// variants.
50
    ///
51
    /// # Type Parameters
52
    ///
53
    /// * `T` - Element type
54
    ///
55
    /// # Returns
56
    ///
57
    /// Returns `MultiValues` wrapping the given value list
58
    ///
59
    /// # Example
60
    ///
61
    /// ```rust
62
    /// use qubit_value::MultiValues;
63
    ///
64
    /// // Basic types
65
    /// let mv = MultiValues::new(vec![1, 2, 3]);
66
    /// assert_eq!(mv.count(), 3);
67
    ///
68
    /// // Strings
69
    /// let mv = MultiValues::new(vec!["a".to_string(), "b".to_string()]);
70
    /// assert_eq!(mv.count(), 2);
71
    /// ```
72
    #[inline]
73
    pub fn new<'a, S>(values: S) -> Self
21✔
74
    where
21✔
75
        S: MultiValuesConstructorArg<'a>,
21✔
76
    {
77
        values.into_multi_values()
21✔
78
    }
21✔
79

80
    /// Generic getter method for multiple values
81
    ///
82
    /// Automatically selects the correct getter method based on the target
83
    /// type, performing strict type checking.
84
    ///
85
    /// # Type Parameters
86
    ///
87
    /// * `T` - The target element type to retrieve.
88
    ///
89
    /// # Returns
90
    ///
91
    /// If types match, returns the list of values; otherwise returns an error.
92
    ///
93
    /// # Example
94
    ///
95
    /// ```rust
96
    /// use qubit_value::MultiValues;
97
    ///
98
    /// let multi = MultiValues::Int32(vec![1, 2, 3]);
99
    ///
100
    /// // Through type inference
101
    /// let nums: Vec<i32> = multi.get().unwrap();
102
    /// assert_eq!(nums, vec![1, 2, 3]);
103
    ///
104
    /// // Explicitly specify type parameter
105
    /// let nums = multi.get::<i32>().unwrap();
106
    /// assert_eq!(nums, vec![1, 2, 3]);
107
    /// ```
108
    #[inline]
109
    pub fn get<T>(&self) -> ValueResult<Vec<T>>
38✔
110
    where
38✔
111
        Self: MultiValuesGetter<T>,
38✔
112
    {
113
        <Self as MultiValuesGetter<T>>::get_values(self)
38✔
114
    }
38✔
115

116
    /// Generic getter method with a default value list.
117
    ///
118
    /// Returns the supplied default only when the stored list is empty. Type
119
    /// mismatches are still returned as errors.
120
    #[inline]
121
    pub fn get_or<T>(&self, default: impl IntoValueDefault<Vec<T>>) -> ValueResult<Vec<T>>
1✔
122
    where
1✔
123
        Self: MultiValuesGetter<T>,
1✔
124
    {
125
        let values = self.get()?;
1✔
126
        if values.is_empty() {
1✔
127
            Ok(default.into_value_default())
1✔
128
        } else {
129
            Ok(values)
×
130
        }
131
    }
1✔
132

133
    /// Generic getter method for the first value
134
    ///
135
    /// Automatically selects the correct getter method based on the target type,
136
    /// performing strict type checking.
137
    ///
138
    /// # Type Parameters
139
    ///
140
    /// * `T` - The target element type to retrieve.
141
    ///
142
    /// # Returns
143
    ///
144
    /// If types match and a value exists, returns the first value; otherwise
145
    /// returns an error.
146
    ///
147
    /// # Example
148
    ///
149
    /// ```rust
150
    /// use qubit_value::MultiValues;
151
    ///
152
    /// let multi = MultiValues::Int32(vec![42, 100, 200]);
153
    ///
154
    /// // Through type inference
155
    /// let first: i32 = multi.get_first().unwrap();
156
    /// assert_eq!(first, 42);
157
    ///
158
    /// // Explicitly specify type parameter
159
    /// let first = multi.get_first::<i32>().unwrap();
160
    /// assert_eq!(first, 42);
161
    ///
162
    /// // String type
163
    /// let multi = MultiValues::String(vec!["hello".to_string(), "world".to_string()]);
164
    /// let first: String = multi.get_first().unwrap();
165
    /// assert_eq!(first, "hello");
166
    /// ```
167
    #[inline]
168
    pub fn get_first<T>(&self) -> ValueResult<T>
27✔
169
    where
27✔
170
        Self: MultiValuesFirstGetter<T>,
27✔
171
    {
172
        <Self as MultiValuesFirstGetter<T>>::get_first_value(self)
27✔
173
    }
27✔
174

175
    /// Generic first-value getter with a default value.
176
    ///
177
    /// Returns the supplied default only when no first value exists. Type
178
    /// mismatches are still returned as errors.
179
    #[inline]
180
    pub fn get_first_or<T>(&self, default: impl IntoValueDefault<T>) -> ValueResult<T>
1✔
181
    where
1✔
182
        Self: MultiValuesFirstGetter<T>,
1✔
183
    {
184
        match self.get_first() {
1✔
185
            Err(ValueError::NoValue) => Ok(default.into_value_default()),
1✔
186
            result => result,
×
187
        }
188
    }
1✔
189

190
    /// Generic setter method
191
    ///
192
    /// Automatically selects the optimal setter path based on the input type,
193
    /// replacing the entire list.
194
    ///
195
    /// This operation updates the stored type to the input element type and
196
    /// does not validate runtime compatibility with the previous variant.
197
    ///
198
    /// Supports three input forms, all unified to this method via internal
199
    /// dispatch traits:
200
    ///
201
    /// - `Vec<T>`: Takes `set_values(Vec<T>)` path with zero additional allocation
202
    /// - `&[T]`: Takes `set_values_slice(&[T])` path
203
    /// - `T`: Takes `set_single_value(T)` path
204
    ///
205
    /// # Type Parameters
206
    ///
207
    /// * `S` - Input type, can be `Vec<T>`, `&[T]`, or a single `T`
208
    ///
209
    /// # Parameters
210
    ///
211
    /// * `values` - The value collection to set, can be `Vec<T>`, `&[T]`, or a
212
    ///   single `T`
213
    ///
214
    /// # Returns
215
    ///
216
    /// If setting succeeds, returns `Ok(())`; otherwise returns an error.
217
    ///
218
    /// # Example
219
    ///
220
    /// ```rust
221
    /// use qubit_datatype::DataType;
222
    /// use qubit_value::MultiValues;
223
    ///
224
    /// // 1) Vec<T>
225
    /// let mut mv = MultiValues::Empty(DataType::Int32);
226
    /// mv.set(vec![42, 100, 200]).unwrap();
227
    /// assert_eq!(mv.get_int32s().unwrap(), &[42, 100, 200]);
228
    ///
229
    /// // 2) &[T]
230
    /// let mut mv = MultiValues::Empty(DataType::Int32);
231
    /// let slice = &[7, 8, 9][..];
232
    /// mv.set(slice).unwrap();
233
    /// assert_eq!(mv.get_int32s().unwrap(), &[7, 8, 9]);
234
    ///
235
    /// // 3) Single T
236
    /// let mut mv = MultiValues::Empty(DataType::Int32);
237
    /// mv.set(42).unwrap();
238
    /// assert_eq!(mv.get_int32s().unwrap(), &[42]);
239
    ///
240
    /// // String example
241
    /// let mut mv = MultiValues::Empty(DataType::String);
242
    /// mv.set(vec!["hello".to_string(), "world".to_string()]).unwrap();
243
    /// assert_eq!(mv.get_strings().unwrap(), &["hello", "world"]);
244
    /// ```
245
    #[inline]
246
    pub fn set<'a, S>(&mut self, values: S) -> ValueResult<()>
70✔
247
    where
70✔
248
        S: MultiValuesSetArg<'a>,
70✔
249
        Self: MultiValuesSetter<S::Item>
70✔
250
            + MultiValuesSetterSlice<S::Item>
70✔
251
            + MultiValuesSingleSetter<S::Item>,
70✔
252
    {
253
        values.apply(self)
70✔
254
    }
70✔
255

256
    /// Generic add method
257
    ///
258
    /// Automatically selects the optimal add path based on the input type,
259
    /// appending elements to the existing list with strict type checking.
260
    ///
261
    /// Supports three input forms:
262
    ///
263
    /// - `T`: Takes `add_value(T)` path, appending a single element
264
    /// - `Vec<T>`: Takes `add_values(Vec<T>)` path, batch append (zero additional allocation)
265
    /// - `&[T]`: Takes `add_values_slice(&[T])` path, batch append (using slice)
266
    ///
267
    /// # Type Parameters
268
    ///
269
    /// * `S` - Input type, can be a single `T`, `Vec<T>`, or `&[T]`
270
    ///
271
    /// # Example
272
    ///
273
    /// ```rust
274
    /// use qubit_datatype::DataType;
275
    /// use qubit_value::MultiValues;
276
    ///
277
    /// // 1) Single T
278
    /// let mut mv = MultiValues::Int32(vec![42]);
279
    /// mv.add(100).unwrap();
280
    /// assert_eq!(mv.get_int32s().unwrap(), &[42, 100]);
281
    ///
282
    /// // 2) Vec<T>
283
    /// mv.add(vec![200, 300]).unwrap();
284
    /// assert_eq!(mv.get_int32s().unwrap(), &[42, 100, 200, 300]);
285
    ///
286
    /// // 3) &[T]
287
    /// let slice = &[400, 500][..];
288
    /// mv.add(slice).unwrap();
289
    /// assert_eq!(mv.get_int32s().unwrap(), &[42, 100, 200, 300, 400, 500]);
290
    /// ```
291
    #[inline]
292
    pub fn add<'a, S>(&mut self, values: S) -> ValueResult<()>
85✔
293
    where
85✔
294
        S: MultiValuesAddArg<'a>,
85✔
295
        Self: MultiValuesAdder<S::Item> + MultiValuesMultiAdder<S::Item>,
85✔
296
    {
297
        values.apply_add(self)
85✔
298
    }
85✔
299

300
    /// Get the data type of the values
301
    ///
302
    /// # Returns
303
    ///
304
    /// Returns the data type corresponding to these multiple values
305
    ///
306
    /// # Example
307
    ///
308
    /// ```rust
309
    /// use qubit_datatype::DataType;
310
    /// use qubit_value::MultiValues;
311
    ///
312
    /// let values = MultiValues::Int32(vec![1, 2, 3]);
313
    /// assert_eq!(values.data_type(), DataType::Int32);
314
    /// ```
315
    #[inline]
316
    pub fn data_type(&self) -> DataType {
447✔
317
        match self {
447✔
318
            MultiValues::Empty(dt) => *dt,
48✔
319
            MultiValues::Bool(_) => DataType::Bool,
11✔
320
            MultiValues::Char(_) => DataType::Char,
6✔
321
            MultiValues::Int8(_) => DataType::Int8,
9✔
322
            MultiValues::Int16(_) => DataType::Int16,
9✔
323
            MultiValues::Int32(_) => DataType::Int32,
178✔
324
            MultiValues::Int64(_) => DataType::Int64,
12✔
325
            MultiValues::Int128(_) => DataType::Int128,
9✔
326
            MultiValues::UInt8(_) => DataType::UInt8,
10✔
327
            MultiValues::UInt16(_) => DataType::UInt16,
9✔
328
            MultiValues::UInt32(_) => DataType::UInt32,
9✔
329
            MultiValues::UInt64(_) => DataType::UInt64,
9✔
330
            MultiValues::UInt128(_) => DataType::UInt128,
9✔
331
            MultiValues::Float32(_) => DataType::Float32,
10✔
332
            MultiValues::Float64(_) => DataType::Float64,
9✔
333
            MultiValues::String(_) => DataType::String,
24✔
334
            MultiValues::Date(_) => DataType::Date,
5✔
335
            MultiValues::Time(_) => DataType::Time,
5✔
336
            MultiValues::DateTime(_) => DataType::DateTime,
5✔
337
            MultiValues::Instant(_) => DataType::Instant,
5✔
338
            MultiValues::BigInteger(_) => DataType::BigInteger,
7✔
339
            MultiValues::BigDecimal(_) => DataType::BigDecimal,
7✔
340
            MultiValues::IntSize(_) => DataType::IntSize,
13✔
341
            MultiValues::UIntSize(_) => DataType::UIntSize,
5✔
342
            MultiValues::Duration(_) => DataType::Duration,
6✔
343
            MultiValues::Url(_) => DataType::Url,
6✔
344
            MultiValues::StringMap(_) => DataType::StringMap,
6✔
345
            MultiValues::Json(_) => DataType::Json,
6✔
346
        }
347
    }
447✔
348

349
    /// Get the number of values
350
    ///
351
    /// # Returns
352
    ///
353
    /// Returns the number of values contained in these multiple values
354
    ///
355
    /// # Example
356
    ///
357
    /// ```rust
358
    /// use qubit_datatype::DataType;
359
    /// use qubit_value::MultiValues;
360
    ///
361
    /// let values = MultiValues::Int32(vec![1, 2, 3]);
362
    /// assert_eq!(values.count(), 3);
363
    ///
364
    /// let empty = MultiValues::Empty(DataType::String);
365
    /// assert_eq!(empty.count(), 0);
366
    /// ```
367
    #[inline]
368
    pub fn count(&self) -> usize {
390✔
369
        match self {
390✔
370
            MultiValues::Empty(_) => 0,
15✔
371
            MultiValues::Bool(v) => v.len(),
19✔
372
            MultiValues::Char(v) => v.len(),
12✔
373
            MultiValues::Int8(v) => v.len(),
17✔
374
            MultiValues::Int16(v) => v.len(),
17✔
375
            MultiValues::Int32(v) => v.len(),
36✔
376
            MultiValues::Int64(v) => v.len(),
17✔
377
            MultiValues::Int128(v) => v.len(),
17✔
378
            MultiValues::UInt8(v) => v.len(),
18✔
379
            MultiValues::UInt16(v) => v.len(),
17✔
380
            MultiValues::UInt32(v) => v.len(),
17✔
381
            MultiValues::UInt64(v) => v.len(),
18✔
382
            MultiValues::UInt128(v) => v.len(),
17✔
383
            MultiValues::Float32(v) => v.len(),
17✔
384
            MultiValues::Float64(v) => v.len(),
18✔
385
            MultiValues::String(v) => v.len(),
33✔
386
            MultiValues::Date(v) => v.len(),
5✔
387
            MultiValues::Time(v) => v.len(),
5✔
388
            MultiValues::DateTime(v) => v.len(),
5✔
389
            MultiValues::Instant(v) => v.len(),
5✔
390
            MultiValues::BigInteger(v) => v.len(),
13✔
391
            MultiValues::BigDecimal(v) => v.len(),
13✔
392
            MultiValues::IntSize(v) => v.len(),
7✔
393
            MultiValues::UIntSize(v) => v.len(),
5✔
394
            MultiValues::Duration(v) => v.len(),
7✔
395
            MultiValues::Url(v) => v.len(),
7✔
396
            MultiValues::StringMap(v) => v.len(),
7✔
397
            MultiValues::Json(v) => v.len(),
6✔
398
        }
399
    }
390✔
400

401
    /// Check if empty
402
    ///
403
    /// # Returns
404
    ///
405
    /// Returns `true` if these multiple values do not contain any values
406
    ///
407
    /// # Example
408
    ///
409
    /// ```rust
410
    /// use qubit_datatype::DataType;
411
    /// use qubit_value::MultiValues;
412
    ///
413
    /// let values = MultiValues::Int32(vec![]);
414
    /// assert!(values.is_empty());
415
    ///
416
    /// let empty = MultiValues::Empty(DataType::String);
417
    /// assert!(empty.is_empty());
418
    /// ```
419
    #[inline]
420
    pub fn is_empty(&self) -> bool {
39✔
421
        self.count() == 0
39✔
422
    }
39✔
423

424
    /// Clear all values while preserving the type
425
    ///
426
    /// # Example
427
    ///
428
    /// ```rust
429
    /// use qubit_datatype::DataType;
430
    /// use qubit_value::MultiValues;
431
    ///
432
    /// let mut values = MultiValues::Int32(vec![1, 2, 3]);
433
    /// values.clear();
434
    /// assert!(values.is_empty());
435
    /// assert_eq!(values.data_type(), DataType::Int32);
436
    /// ```
437
    #[inline]
438
    pub fn clear(&mut self) {
30✔
439
        match self {
30✔
440
            MultiValues::Empty(_) => {}
1✔
441
            MultiValues::Bool(v) => v.clear(),
1✔
442
            MultiValues::Char(v) => v.clear(),
1✔
443
            MultiValues::Int8(v) => v.clear(),
1✔
444
            MultiValues::Int16(v) => v.clear(),
1✔
445
            MultiValues::Int32(v) => v.clear(),
3✔
446
            MultiValues::Int64(v) => v.clear(),
1✔
447
            MultiValues::Int128(v) => v.clear(),
1✔
448
            MultiValues::UInt8(v) => v.clear(),
1✔
449
            MultiValues::UInt16(v) => v.clear(),
1✔
450
            MultiValues::UInt32(v) => v.clear(),
1✔
451
            MultiValues::UInt64(v) => v.clear(),
1✔
452
            MultiValues::UInt128(v) => v.clear(),
1✔
453
            MultiValues::Float32(v) => v.clear(),
1✔
454
            MultiValues::Float64(v) => v.clear(),
1✔
455
            MultiValues::String(v) => v.clear(),
1✔
456
            MultiValues::Date(v) => v.clear(),
1✔
457
            MultiValues::Time(v) => v.clear(),
1✔
458
            MultiValues::DateTime(v) => v.clear(),
1✔
459
            MultiValues::Instant(v) => v.clear(),
1✔
460
            MultiValues::BigInteger(v) => v.clear(),
1✔
461
            MultiValues::BigDecimal(v) => v.clear(),
1✔
462
            MultiValues::IntSize(v) => v.clear(),
1✔
463
            MultiValues::UIntSize(v) => v.clear(),
1✔
464
            MultiValues::Duration(v) => v.clear(),
1✔
465
            MultiValues::Url(v) => v.clear(),
1✔
466
            MultiValues::StringMap(v) => v.clear(),
1✔
467
            MultiValues::Json(v) => v.clear(),
1✔
468
        }
469
    }
30✔
470

471
    /// Set the data type
472
    ///
473
    /// If the new type differs from the current type, clears all values and
474
    /// sets the new type.
475
    ///
476
    /// # Parameters
477
    ///
478
    /// * `data_type` - The data type to set
479
    ///
480
    /// # Example
481
    ///
482
    /// ```rust
483
    /// use qubit_datatype::DataType;
484
    /// use qubit_value::MultiValues;
485
    ///
486
    /// let mut values = MultiValues::Int32(vec![1, 2, 3]);
487
    /// values.set_type(DataType::String);
488
    /// assert!(values.is_empty());
489
    /// assert_eq!(values.data_type(), DataType::String);
490
    /// ```
491
    #[inline]
492
    pub fn set_type(&mut self, data_type: DataType) {
3✔
493
        if self.data_type() != data_type {
3✔
494
            *self = MultiValues::Empty(data_type);
2✔
495
        }
2✔
496
    }
3✔
497

498
    // ========================================================================
499
    // Get first value (as single value access)
500
    // ========================================================================
501

502
    impl_get_first_value! {
503
        /// Get the first boolean value.
504
        ///
505
        /// # Returns
506
        ///
507
        /// If types match and a value exists, returns the first boolean value;
508
        /// otherwise returns an error.
509
        ///
510
        /// # Example
511
        ///
512
        /// ```rust
513
        /// use qubit_value::MultiValues;
514
        ///
515
        /// let values = MultiValues::Bool(vec![true, false]);
516
        /// assert_eq!(values.get_first_bool().unwrap(), true);
517
        /// ```
518
        copy: get_first_bool, Bool, bool, DataType::Bool
519
    }
520

521
    impl_get_first_value! {
522
        /// Get the first character value
523
        ///
524
        /// # Returns
525
        ///
526
        /// If types match and a value exists, returns the first character value;
527
        /// otherwise returns an error.
528
        copy: get_first_char, Char, char, DataType::Char
529
    }
530

531
    impl_get_first_value! {
532
        /// Get the first int8 value
533
        ///
534
        /// # Returns
535
        ///
536
        /// If types match and a value exists, returns the first int8 value;
537
        /// otherwise returns an error
538
        copy: get_first_int8, Int8, i8, DataType::Int8
539
    }
540

541
    impl_get_first_value! {
542
        /// Get the first int16 value
543
        ///
544
        /// # Returns
545
        ///
546
        /// If types match and a value exists, returns the first int16 value;
547
        /// otherwise returns an error
548
        copy: get_first_int16, Int16, i16, DataType::Int16
549
    }
550

551
    impl_get_first_value! {
552
        /// Get the first int32 value
553
        ///
554
        /// # Returns
555
        ///
556
        /// If types match and a value exists, returns the first int32 value;
557
        /// otherwise returns an error
558
        copy: get_first_int32, Int32, i32, DataType::Int32
559
    }
560

561
    impl_get_first_value! {
562
        /// Get the first int64 value
563
        ///
564
        /// # Returns
565
        ///
566
        /// If types match and a value exists, returns the first int64 value;
567
        /// otherwise returns an error
568
        copy: get_first_int64, Int64, i64, DataType::Int64
569
    }
570

571
    impl_get_first_value! {
572
        /// Get the first int128 value
573
        ///
574
        /// # Returns
575
        ///
576
        /// If types match and a value exists, returns the first int128 value;
577
        /// otherwise returns an error
578
        copy: get_first_int128, Int128, i128, DataType::Int128
579
    }
580

581
    impl_get_first_value! {
582
        /// Get the first uint8 value
583
        ///
584
        /// # Returns
585
        ///
586
        /// If types match and a value exists, returns the first uint8 value;
587
        /// otherwise returns an error
588
        copy: get_first_uint8, UInt8, u8, DataType::UInt8
589
    }
590

591
    impl_get_first_value! {
592
        /// Get the first uint16 value
593
        ///
594
        /// # Returns
595
        ///
596
        /// If types match and a value exists, returns the first uint16 value;
597
        /// otherwise returns an error
598
        copy: get_first_uint16, UInt16, u16, DataType::UInt16
599
    }
600

601
    impl_get_first_value! {
602
        /// Get the first uint32 value
603
        ///
604
        /// # Returns
605
        ///
606
        /// If types match and a value exists, returns the first uint32 value;
607
        /// otherwise returns an error
608
        copy: get_first_uint32, UInt32, u32, DataType::UInt32
609
    }
610

611
    impl_get_first_value! {
612
        /// Get the first uint64 value
613
        ///
614
        /// # Returns
615
        ///
616
        /// If types match and a value exists, returns the first uint64 value;
617
        /// otherwise returns an error
618
        copy: get_first_uint64, UInt64, u64, DataType::UInt64
619
    }
620

621
    impl_get_first_value! {
622
        /// Get the first uint128 value
623
        ///
624
        /// # Returns
625
        ///
626
        /// If types match and a value exists, returns the first uint128 value;
627
        /// otherwise returns an error
628
        copy: get_first_uint128, UInt128, u128, DataType::UInt128
629
    }
630

631
    impl_get_first_value! {
632
        /// Get the first float32 value
633
        ///
634
        /// # Returns
635
        ///
636
        /// If types match and a value exists, returns the first float32 value;
637
        /// otherwise returns an error
638
        copy: get_first_float32, Float32, f32, DataType::Float32
639
    }
640

641
    impl_get_first_value! {
642
        /// Get the first float64 value
643
        ///
644
        /// # Returns
645
        ///
646
        /// If types match and a value exists, returns the first float64 value;
647
        /// otherwise returns an error
648
        copy: get_first_float64, Float64, f64, DataType::Float64
649
    }
650

651
    impl_get_first_value! {
652
        /// Get the first string reference
653
        ///
654
        /// # Returns
655
        ///
656
        /// If types match and a value exists, returns a reference to the first
657
        /// string; otherwise returns an error
658
        ref: get_first_string, String, &str, DataType::String, |s: &String| s.as_str()
4✔
659
    }
660

661
    impl_get_first_value! {
662
        /// Get the first date value
663
        ///
664
        /// # Returns
665
        ///
666
        /// If types match and a value exists, returns the first date value;
667
        /// otherwise returns an error
668
        copy: get_first_date, Date, NaiveDate, DataType::Date
669
    }
670

671
    impl_get_first_value! {
672
        /// Get the first time value
673
        ///
674
        /// # Returns
675
        ///
676
        /// If types match and a value exists, returns the first time value;
677
        /// otherwise returns an error
678
        copy: get_first_time, Time, NaiveTime, DataType::Time
679
    }
680

681
    impl_get_first_value! {
682
        /// Get the first datetime value
683
        ///
684
        /// # Returns
685
        ///
686
        /// If types match and a value exists, returns the first datetime value;
687
        /// otherwise returns an error
688
        copy: get_first_datetime, DateTime, NaiveDateTime, DataType::DateTime
689
    }
690

691
    impl_get_first_value! {
692
        /// Get the first UTC instant value
693
        ///
694
        /// # Returns
695
        ///
696
        /// If types match and a value exists, returns the first UTC instant
697
        /// value; otherwise returns an error
698
        copy: get_first_instant, Instant, DateTime<Utc>, DataType::Instant
699
    }
700

701
    impl_get_first_value! {
702
        /// Get the first big integer value
703
        ///
704
        /// # Returns
705
        ///
706
        /// If types match and a value exists, returns the first big integer
707
        /// value; otherwise returns an error
708
        ref: get_first_biginteger, BigInteger, BigInt, DataType::BigInteger, |v: &BigInt| v.clone()
6✔
709
    }
710

711
    impl_get_first_value! {
712
        /// Get the first big decimal value
713
        ///
714
        /// # Returns
715
        ///
716
        /// If types match and a value exists, returns the first big decimal
717
        /// value; otherwise returns an error
718
        ref: get_first_bigdecimal, BigDecimal, BigDecimal, DataType::BigDecimal, |v: &BigDecimal| v.clone()
6✔
719
    }
720

721
    impl_get_first_value! {
722
        /// Get the first isize value
723
        copy: get_first_intsize, IntSize, isize, DataType::IntSize
724
    }
725

726
    impl_get_first_value! {
727
        /// Get the first usize value
728
        copy: get_first_uintsize, UIntSize, usize, DataType::UIntSize
729
    }
730

731
    impl_get_first_value! {
732
        /// Get the first Duration value
733
        copy: get_first_duration, Duration, Duration, DataType::Duration
734
    }
735

736
    impl_get_first_value! {
737
        /// Get the first Url value
738
        ref: get_first_url, Url, Url, DataType::Url, |v: &Url| v.clone()
3✔
739
    }
740

741
    impl_get_first_value! {
742
        /// Get the first StringMap value
743
        ref: get_first_string_map, StringMap, HashMap<String, String>, DataType::StringMap, |v: &HashMap<String, String>| v.clone()
3✔
744
    }
745

746
    impl_get_first_value! {
747
        /// Get the first Json value
748
        ref: get_first_json, Json, serde_json::Value, DataType::Json, |v: &serde_json::Value| v.clone()
2✔
749
    }
750

751
    // ========================================================================
752
    // Get all values (type checking)
753
    // ========================================================================
754

755
    impl_get_multi_values! {
756
        /// Get reference to all boolean values
757
        ///
758
        /// # Returns
759
        ///
760
        /// If types match, returns a reference to the boolean value array;
761
        /// otherwise returns an error
762
        ///
763
        /// # Example
764
        ///
765
        /// ```rust
766
        /// use qubit_value::MultiValues;
767
        ///
768
        /// let values = MultiValues::Bool(vec![true, false, true]);
769
        /// assert_eq!(values.get_bools().unwrap(), &[true, false, true]);
770
        /// ```
771
        slice: get_bools, Bool, bool, DataType::Bool
772
    }
773

774
    impl_get_multi_values! {
775
        /// Get reference to all character values
776
        ///
777
        /// # Returns
778
        ///
779
        /// If types match, returns a reference to the character value array;
780
        /// otherwise returns an error
781
        slice: get_chars, Char, char, DataType::Char
782
    }
783

784
    impl_get_multi_values! {
785
        /// Get reference to all int8 values
786
        ///
787
        /// # Returns
788
        ///
789
        /// If types match, returns a reference to the int8 value array;
790
        /// otherwise returns an error
791
        slice: get_int8s, Int8, i8, DataType::Int8
792
    }
793

794
    impl_get_multi_values! {
795
        /// Get reference to all int16 values
796
        ///
797
        /// # Returns
798
        ///
799
        /// If types match, returns a reference to the int16 value array;
800
        /// otherwise returns an error
801
        slice: get_int16s, Int16, i16, DataType::Int16
802
    }
803

804
    impl_get_multi_values! {
805
        /// Get reference to all int32 values
806
        ///
807
        /// # Returns
808
        ///
809
        /// If types match, returns a reference to the int32 value array;
810
        /// otherwise returns an error
811
        slice: get_int32s, Int32, i32, DataType::Int32
812
    }
813

814
    impl_get_multi_values! {
815
        /// Get reference to all int64 values
816
        ///
817
        /// # Returns
818
        ///
819
        /// If types match, returns a reference to the int64 value array;
820
        /// otherwise returns an error
821
        slice: get_int64s, Int64, i64, DataType::Int64
822
    }
823

824
    impl_get_multi_values! {
825
        /// Get reference to all int128 values
826
        ///
827
        /// # Returns
828
        ///
829
        /// If types match, returns a reference to the int128 value array;
830
        /// otherwise returns an error
831
        slice: get_int128s, Int128, i128, DataType::Int128
832
    }
833

834
    impl_get_multi_values! {
835
        /// Get reference to all uint8 values
836
        ///
837
        /// # Returns
838
        ///
839
        /// If types match, returns a reference to the uint8 value array;
840
        /// otherwise returns an error
841
        slice: get_uint8s, UInt8, u8, DataType::UInt8
842
    }
843

844
    impl_get_multi_values! {
845
        /// Get reference to all uint16 values
846
        ///
847
        /// # Returns
848
        ///
849
        /// If types match, returns a reference to the uint16 value array;
850
        /// otherwise returns an error
851
        slice: get_uint16s, UInt16, u16, DataType::UInt16
852
    }
853

854
    impl_get_multi_values! {
855
        /// Get reference to all uint32 values
856
        ///
857
        /// # Returns
858
        ///
859
        /// If types match, returns a reference to the uint32 value array;
860
        /// otherwise returns an error
861
        slice: get_uint32s, UInt32, u32, DataType::UInt32
862
    }
863

864
    impl_get_multi_values! {
865
        /// Get reference to all uint64 values
866
        ///
867
        /// # Returns
868
        ///
869
        /// If types match, returns a reference to the uint64 value array;
870
        /// otherwise returns an error
871
        slice: get_uint64s, UInt64, u64, DataType::UInt64
872
    }
873

874
    impl_get_multi_values! {
875
        /// Get reference to all uint128 values
876
        ///
877
        /// # Returns
878
        ///
879
        /// If types match, returns a reference to the uint128 value array;
880
        /// otherwise returns an error
881
        slice: get_uint128s, UInt128, u128, DataType::UInt128
882
    }
883

884
    impl_get_multi_values! {
885
        /// Get reference to all float32 values
886
        ///
887
        /// # Returns
888
        ///
889
        /// If types match, returns a reference to the float32 value array;
890
        /// otherwise returns an error
891
        slice: get_float32s, Float32, f32, DataType::Float32
892
    }
893

894
    impl_get_multi_values! {
895
        /// Get reference to all float64 values
896
        ///
897
        /// # Returns
898
        ///
899
        /// If types match, returns a reference to the float64 value array;
900
        /// otherwise returns an error
901
        slice: get_float64s, Float64, f64, DataType::Float64
902
    }
903

904
    impl_get_multi_values! {
905
        /// Get reference to all strings
906
        ///
907
        /// # Returns
908
        ///
909
        /// If types match, returns a reference to the string array; otherwise
910
        /// returns an error
911
        vec: get_strings, String, String, DataType::String
912
    }
913

914
    impl_get_multi_values! {
915
        /// Get reference to all date values
916
        ///
917
        /// # Returns
918
        ///
919
        /// If types match, returns a reference to the date value array;
920
        /// otherwise returns an error
921
        slice: get_dates, Date, NaiveDate, DataType::Date
922
    }
923

924
    impl_get_multi_values! {
925
        /// Get reference to all time values
926
        ///
927
        /// # Returns
928
        ///
929
        /// If types match, returns a reference to the time value array;
930
        /// otherwise returns an error
931
        slice: get_times, Time, NaiveTime, DataType::Time
932
    }
933

934
    impl_get_multi_values! {
935
        /// Get reference to all datetime values
936
        ///
937
        /// # Returns
938
        ///
939
        /// If types match, returns a reference to the datetime value array;
940
        /// otherwise returns an error
941
        slice: get_datetimes, DateTime, NaiveDateTime, DataType::DateTime
942
    }
943

944
    impl_get_multi_values! {
945
        /// Get reference to all UTC instant values
946
        ///
947
        /// # Returns
948
        ///
949
        /// If types match, returns a reference to the UTC instant value array;
950
        /// otherwise returns an error
951
        slice: get_instants, Instant, DateTime<Utc>, DataType::Instant
952
    }
953

954
    impl_get_multi_values! {
955
        /// Get reference to all big integers
956
        ///
957
        /// # Returns
958
        ///
959
        /// If types match, returns a reference to the big integer array;
960
        /// otherwise returns an error
961
        vec: get_bigintegers, BigInteger, BigInt, DataType::BigInteger
962
    }
963

964
    impl_get_multi_values! {
965
        /// Get reference to all big decimals
966
        ///
967
        /// # Returns
968
        ///
969
        /// If types match, returns a reference to the big decimal array;
970
        /// otherwise returns an error
971
        vec: get_bigdecimals, BigDecimal, BigDecimal, DataType::BigDecimal
972
    }
973

974
    impl_get_multi_values! {
975
        /// Get reference to all isize values
976
        slice: get_intsizes, IntSize, isize, DataType::IntSize
977
    }
978

979
    impl_get_multi_values! {
980
        /// Get reference to all usize values
981
        slice: get_uintsizes, UIntSize, usize, DataType::UIntSize
982
    }
983

984
    impl_get_multi_values! {
985
        /// Get reference to all Duration values
986
        slice: get_durations, Duration, Duration, DataType::Duration
987
    }
988

989
    impl_get_multi_values! {
990
        /// Get reference to all Url values
991
        vec: get_urls, Url, Url, DataType::Url
992
    }
993

994
    impl_get_multi_values! {
995
        /// Get reference to all StringMap values
996
        vec: get_string_maps, StringMap, HashMap<String, String>, DataType::StringMap
997
    }
998

999
    impl_get_multi_values! {
1000
        /// Get reference to all Json values
1001
        vec: get_jsons, Json, serde_json::Value, DataType::Json
1002
    }
1003

1004
    // ========================================================================
1005
    // Set value operations
1006
    // ========================================================================
1007

1008
    impl_set_multi_values! {
1009
        /// Set all boolean values
1010
        ///
1011
        /// # Parameters
1012
        ///
1013
        /// * `values` - The list of boolean values to set
1014
        ///
1015
        /// # Returns
1016
        ///
1017
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1018
        ///
1019
        /// # Example
1020
        ///
1021
        /// ```rust
1022
        /// use qubit_datatype::DataType;
1023
        /// use qubit_value::MultiValues;
1024
        ///
1025
        /// let mut values = MultiValues::Empty(DataType::Bool);
1026
        /// values.set_bools(vec![true, false, true]).unwrap();
1027
        /// assert_eq!(values.get_bools().unwrap(), &[true, false, true]);
1028
        /// ```
1029
        set_bools, Bool, bool, DataType::Bool
1030
    }
1031

1032
    impl_set_multi_values! {
1033
        /// Set all character values
1034
        ///
1035
        /// # Parameters
1036
        ///
1037
        /// * `values` - The list of character values to set
1038
        ///
1039
        /// # Returns
1040
        ///
1041
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1042
        set_chars, Char, char, DataType::Char
1043
    }
1044

1045
    impl_set_multi_values! {
1046
        /// Set all int8 values
1047
        ///
1048
        /// # Parameters
1049
        ///
1050
        /// * `values` - The list of int8 values to set
1051
        ///
1052
        /// # Returns
1053
        ///
1054
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1055
        set_int8s, Int8, i8, DataType::Int8
1056
    }
1057

1058
    impl_set_multi_values! {
1059
        /// Set all int16 values
1060
        ///
1061
        /// # Parameters
1062
        ///
1063
        /// * `values` - The list of int16 values to set
1064
        ///
1065
        /// # Returns
1066
        ///
1067
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1068
        set_int16s, Int16, i16, DataType::Int16
1069
    }
1070

1071
    impl_set_multi_values! {
1072
        /// Set all int32 values
1073
        ///
1074
        /// # Parameters
1075
        ///
1076
        /// * `values` - The list of int32 values to set
1077
        ///
1078
        /// # Returns
1079
        ///
1080
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1081
        set_int32s, Int32, i32, DataType::Int32
1082
    }
1083

1084
    impl_set_multi_values! {
1085
        /// Set all int64 values
1086
        ///
1087
        /// # Parameters
1088
        ///
1089
        /// * `values` - The list of int64 values to set
1090
        ///
1091
        /// # Returns
1092
        ///
1093
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1094
        set_int64s, Int64, i64, DataType::Int64
1095
    }
1096

1097
    impl_set_multi_values! {
1098
        /// Set all int128 values
1099
        ///
1100
        /// # Parameters
1101
        ///
1102
        /// * `values` - The list of int128 values to set
1103
        ///
1104
        /// # Returns
1105
        ///
1106
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1107
        set_int128s, Int128, i128, DataType::Int128
1108
    }
1109

1110
    impl_set_multi_values! {
1111
        /// Set all uint8 values
1112
        ///
1113
        /// # Parameters
1114
        ///
1115
        /// * `values` - The list of uint8 values to set
1116
        ///
1117
        /// # Returns
1118
        ///
1119
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1120
        set_uint8s, UInt8, u8, DataType::UInt8
1121
    }
1122

1123
    impl_set_multi_values! {
1124
        /// Set all uint16 values
1125
        ///
1126
        /// # Parameters
1127
        ///
1128
        /// * `values` - The list of uint16 values to set
1129
        ///
1130
        /// # Returns
1131
        ///
1132
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1133
        set_uint16s, UInt16, u16, DataType::UInt16
1134
    }
1135

1136
    impl_set_multi_values! {
1137
        /// Set all uint32 values
1138
        ///
1139
        /// # Parameters
1140
        ///
1141
        /// * `values` - The list of uint32 values to set
1142
        ///
1143
        /// # Returns
1144
        ///
1145
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1146
        set_uint32s, UInt32, u32, DataType::UInt32
1147
    }
1148

1149
    impl_set_multi_values! {
1150
        /// Set all uint64 values
1151
        ///
1152
        /// # Parameters
1153
        ///
1154
        /// * `values` - The list of uint64 values to set
1155
        ///
1156
        /// # Returns
1157
        ///
1158
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1159
        set_uint64s, UInt64, u64, DataType::UInt64
1160
    }
1161

1162
    impl_set_multi_values! {
1163
        /// Set all uint128 values
1164
        ///
1165
        /// # Parameters
1166
        ///
1167
        /// * `values` - The list of uint128 values to set
1168
        ///
1169
        /// # Returns
1170
        ///
1171
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1172
        set_uint128s, UInt128, u128, DataType::UInt128
1173
    }
1174

1175
    impl_set_multi_values! {
1176
        /// Set all float32 values
1177
        ///
1178
        /// # Parameters
1179
        ///
1180
        /// * `values` - The list of float32 values to set
1181
        ///
1182
        /// # Returns
1183
        ///
1184
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1185
        set_float32s, Float32, f32, DataType::Float32
1186
    }
1187

1188
    impl_set_multi_values! {
1189
        /// Set all float64 values
1190
        ///
1191
        /// # Parameters
1192
        ///
1193
        /// * `values` - The list of float64 values to set
1194
        ///
1195
        /// # Returns
1196
        ///
1197
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1198
        set_float64s, Float64, f64, DataType::Float64
1199
    }
1200

1201
    impl_set_multi_values! {
1202
        /// Set all string values
1203
        ///
1204
        /// # Parameters
1205
        ///
1206
        /// * `values` - The list of string values to set
1207
        ///
1208
        /// # Returns
1209
        ///
1210
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1211
        ///
1212
        /// # Example
1213
        ///
1214
        /// ```rust
1215
        /// use qubit_datatype::DataType;
1216
        /// use qubit_value::MultiValues;
1217
        ///
1218
        /// let mut values = MultiValues::Empty(DataType::String);
1219
        /// values.set_strings(vec!["hello".to_string(), "world".to_string()]).unwrap();
1220
        /// assert_eq!(values.get_strings().unwrap(), &["hello", "world"]);
1221
        /// ```
1222
        set_strings, String, String, DataType::String
1223
    }
1224

1225
    impl_set_multi_values! {
1226
        /// Set all date values
1227
        ///
1228
        /// # Parameters
1229
        ///
1230
        /// * `values` - The list of date values to set
1231
        ///
1232
        /// # Returns
1233
        ///
1234
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1235
        set_dates, Date, NaiveDate, DataType::Date
1236
    }
1237

1238
    impl_set_multi_values! {
1239
        /// Set all time values
1240
        ///
1241
        /// # Parameters
1242
        ///
1243
        /// * `values` - The list of time values to set
1244
        ///
1245
        /// # Returns
1246
        ///
1247
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1248
        set_times, Time, NaiveTime, DataType::Time
1249
    }
1250

1251
    impl_set_multi_values! {
1252
        /// Set all datetime values
1253
        ///
1254
        /// # Parameters
1255
        ///
1256
        /// * `values` - The list of datetime values to set
1257
        ///
1258
        /// # Returns
1259
        ///
1260
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1261
        set_datetimes, DateTime, NaiveDateTime, DataType::DateTime
1262
    }
1263

1264
    impl_set_multi_values! {
1265
        /// Set all UTC instant values
1266
        ///
1267
        /// # Parameters
1268
        ///
1269
        /// * `values` - The list of UTC instant values to set
1270
        ///
1271
        /// # Returns
1272
        ///
1273
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1274
        set_instants, Instant, DateTime<Utc>, DataType::Instant
1275
    }
1276

1277
    impl_set_multi_values! {
1278
        /// Set all big integer values
1279
        ///
1280
        /// # Parameters
1281
        ///
1282
        /// * `values` - The list of big integer values to set
1283
        ///
1284
        /// # Returns
1285
        ///
1286
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1287
        set_bigintegers, BigInteger, BigInt, DataType::BigInteger
1288
    }
1289

1290
    impl_set_multi_values! {
1291
        /// Set all big decimal values
1292
        ///
1293
        /// # Parameters
1294
        ///
1295
        /// * `values` - The list of big decimal values to set
1296
        ///
1297
        /// # Returns
1298
        ///
1299
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1300
        set_bigdecimals, BigDecimal, BigDecimal, DataType::BigDecimal
1301
    }
1302

1303
    impl_set_multi_values! {
1304
        /// Set all isize values
1305
        set_intsizes, IntSize, isize, DataType::IntSize
1306
    }
1307

1308
    impl_set_multi_values! {
1309
        /// Set all usize values
1310
        set_uintsizes, UIntSize, usize, DataType::UIntSize
1311
    }
1312

1313
    impl_set_multi_values! {
1314
        /// Set all Duration values
1315
        set_durations, Duration, Duration, DataType::Duration
1316
    }
1317

1318
    impl_set_multi_values! {
1319
        /// Set all Url values
1320
        set_urls, Url, Url, DataType::Url
1321
    }
1322

1323
    impl_set_multi_values! {
1324
        /// Set all StringMap values
1325
        set_string_maps, StringMap, HashMap<String, String>, DataType::StringMap
1326
    }
1327

1328
    impl_set_multi_values! {
1329
        /// Set all Json values
1330
        set_jsons, Json, serde_json::Value, DataType::Json
1331
    }
1332

1333
    // ========================================================================
1334
    // Set all values via slice operations
1335
    // ========================================================================
1336

1337
    impl_set_multi_values_slice! {
1338
        /// Set all boolean values via slice
1339
        ///
1340
        /// # Parameters
1341
        ///
1342
        /// * `values` - The boolean value slice to set
1343
        ///
1344
        /// # Returns
1345
        ///
1346
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1347
        set_bools_slice, Bool, bool, DataType::Bool
1348
    }
1349

1350
    impl_set_multi_values_slice! {
1351
        /// Set all character values via slice
1352
        ///
1353
        /// # Parameters
1354
        ///
1355
        /// * `values` - The character value slice to set
1356
        ///
1357
        /// # Returns
1358
        ///
1359
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1360
        set_chars_slice, Char, char, DataType::Char
1361
    }
1362

1363
    impl_set_multi_values_slice! {
1364
        /// Set all int8 values via slice
1365
        ///
1366
        /// # Parameters
1367
        ///
1368
        /// * `values` - The int8 value slice to set
1369
        ///
1370
        /// # Returns
1371
        ///
1372
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1373
        set_int8s_slice, Int8, i8, DataType::Int8
1374
    }
1375

1376
    impl_set_multi_values_slice! {
1377
        /// Set all int16 values via slice
1378
        ///
1379
        /// # Parameters
1380
        ///
1381
        /// * `values` - The int16 value slice to set
1382
        ///
1383
        /// # Returns
1384
        ///
1385
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1386
        set_int16s_slice, Int16, i16, DataType::Int16
1387
    }
1388

1389
    impl_set_multi_values_slice! {
1390
        /// Set all int32 values via slice
1391
        ///
1392
        /// # Parameters
1393
        ///
1394
        /// * `values` - The int32 value slice to set
1395
        ///
1396
        /// # Returns
1397
        ///
1398
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1399
        set_int32s_slice, Int32, i32, DataType::Int32
1400
    }
1401

1402
    impl_set_multi_values_slice! {
1403
        /// Set all int64 values via slice
1404
        ///
1405
        /// # Parameters
1406
        ///
1407
        /// * `values` - The int64 value slice to set
1408
        ///
1409
        /// # Returns
1410
        ///
1411
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1412
        set_int64s_slice, Int64, i64, DataType::Int64
1413
    }
1414

1415
    impl_set_multi_values_slice! {
1416
        /// Set all int128 values via slice
1417
        ///
1418
        /// # Parameters
1419
        ///
1420
        /// * `values` - The int128 value slice to set
1421
        ///
1422
        /// # Returns
1423
        ///
1424
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1425
        set_int128s_slice, Int128, i128, DataType::Int128
1426
    }
1427

1428
    impl_set_multi_values_slice! {
1429
        /// Set all uint8 values via slice
1430
        ///
1431
        /// # Parameters
1432
        ///
1433
        /// * `values` - The uint8 value slice to set
1434
        ///
1435
        /// # Returns
1436
        ///
1437
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1438
        set_uint8s_slice, UInt8, u8, DataType::UInt8
1439
    }
1440

1441
    impl_set_multi_values_slice! {
1442
        /// Set all uint16 values via slice
1443
        ///
1444
        /// # Parameters
1445
        ///
1446
        /// * `values` - The uint16 value slice to set
1447
        ///
1448
        /// # Returns
1449
        ///
1450
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1451
        set_uint16s_slice, UInt16, u16, DataType::UInt16
1452
    }
1453

1454
    impl_set_multi_values_slice! {
1455
        /// Set all uint32 values via slice
1456
        ///
1457
        /// # Parameters
1458
        ///
1459
        /// * `values` - The uint32 value slice to set
1460
        ///
1461
        /// # Returns
1462
        ///
1463
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1464
        set_uint32s_slice, UInt32, u32, DataType::UInt32
1465
    }
1466

1467
    impl_set_multi_values_slice! {
1468
        /// Set all uint64 values via slice
1469
        ///
1470
        /// # Parameters
1471
        ///
1472
        /// * `values` - The uint64 value slice to set
1473
        ///
1474
        /// # Returns
1475
        ///
1476
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1477
        set_uint64s_slice, UInt64, u64, DataType::UInt64
1478
    }
1479

1480
    impl_set_multi_values_slice! {
1481
        /// Set all uint128 values via slice
1482
        ///
1483
        /// # Parameters
1484
        ///
1485
        /// * `values` - The uint128 value slice to set
1486
        ///
1487
        /// # Returns
1488
        ///
1489
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1490
        set_uint128s_slice, UInt128, u128, DataType::UInt128
1491
    }
1492

1493
    impl_set_multi_values_slice! {
1494
        /// Set all float32 values via slice
1495
        ///
1496
        /// # Parameters
1497
        ///
1498
        /// * `values` - The float32 value slice to set
1499
        ///
1500
        /// # Returns
1501
        ///
1502
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1503
        set_float32s_slice, Float32, f32, DataType::Float32
1504
    }
1505

1506
    impl_set_multi_values_slice! {
1507
        /// Set all float64 values via slice
1508
        ///
1509
        /// # Parameters
1510
        ///
1511
        /// * `values` - The float64 value slice to set
1512
        ///
1513
        /// # Returns
1514
        ///
1515
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1516
        set_float64s_slice, Float64, f64, DataType::Float64
1517
    }
1518

1519
    impl_set_multi_values_slice! {
1520
        /// Set all string values via slice
1521
        ///
1522
        /// # Parameters
1523
        ///
1524
        /// * `values` - The string value slice to set
1525
        ///
1526
        /// # Returns
1527
        ///
1528
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1529
        set_strings_slice, String, String, DataType::String
1530
    }
1531

1532
    impl_set_multi_values_slice! {
1533
        /// Set all date values via slice
1534
        ///
1535
        /// # Parameters
1536
        ///
1537
        /// * `values` - The date value slice to set
1538
        ///
1539
        /// # Returns
1540
        ///
1541
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1542
        set_dates_slice, Date, NaiveDate, DataType::Date
1543
    }
1544

1545
    impl_set_multi_values_slice! {
1546
        /// Set all time values via slice
1547
        ///
1548
        /// # Parameters
1549
        ///
1550
        /// * `values` - The time value slice to set
1551
        ///
1552
        /// # Returns
1553
        ///
1554
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1555
        set_times_slice, Time, NaiveTime, DataType::Time
1556
    }
1557

1558
    impl_set_multi_values_slice! {
1559
        /// Set all datetime values via slice
1560
        ///
1561
        /// # Parameters
1562
        ///
1563
        /// * `values` - The datetime value slice to set
1564
        ///
1565
        /// # Returns
1566
        ///
1567
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1568
        set_datetimes_slice, DateTime, NaiveDateTime, DataType::DateTime
1569
    }
1570

1571
    impl_set_multi_values_slice! {
1572
        /// Set all UTC instant values via slice
1573
        ///
1574
        /// # Parameters
1575
        ///
1576
        /// * `values` - The UTC instant value slice to set
1577
        ///
1578
        /// # Returns
1579
        ///
1580
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1581
        set_instants_slice, Instant, DateTime<Utc>, DataType::Instant
1582
    }
1583

1584
    impl_set_multi_values_slice! {
1585
        /// Set all big integer values via slice
1586
        ///
1587
        /// # Parameters
1588
        ///
1589
        /// * `values` - The big integer value slice to set
1590
        ///
1591
        /// # Returns
1592
        ///
1593
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1594
        set_bigintegers_slice, BigInteger, BigInt, DataType::BigInteger
1595
    }
1596

1597
    impl_set_multi_values_slice! {
1598
        /// Set all big decimal values via slice
1599
        ///
1600
        /// # Parameters
1601
        ///
1602
        /// * `values` - The big decimal value slice to set
1603
        ///
1604
        /// # Returns
1605
        ///
1606
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1607
        set_bigdecimals_slice, BigDecimal, BigDecimal, DataType::BigDecimal
1608
    }
1609

1610
    impl_set_multi_values_slice! {
1611
        /// Set all isize values via slice
1612
        set_intsizes_slice, IntSize, isize, DataType::IntSize
1613
    }
1614

1615
    impl_set_multi_values_slice! {
1616
        /// Set all usize values via slice
1617
        set_uintsizes_slice, UIntSize, usize, DataType::UIntSize
1618
    }
1619

1620
    impl_set_multi_values_slice! {
1621
        /// Set all Duration values via slice
1622
        set_durations_slice, Duration, Duration, DataType::Duration
1623
    }
1624

1625
    impl_set_multi_values_slice! {
1626
        /// Set all Url values via slice
1627
        set_urls_slice, Url, Url, DataType::Url
1628
    }
1629

1630
    impl_set_multi_values_slice! {
1631
        /// Set all StringMap values via slice
1632
        set_string_maps_slice, StringMap, HashMap<String, String>, DataType::StringMap
1633
    }
1634

1635
    impl_set_multi_values_slice! {
1636
        /// Set all Json values via slice
1637
        set_jsons_slice, Json, serde_json::Value, DataType::Json
1638
    }
1639

1640
    // ========================================================================
1641
    // Set single value operations
1642
    // ========================================================================
1643

1644
    impl_set_single_value! {
1645
        /// Set single boolean value
1646
        ///
1647
        /// # Parameters
1648
        ///
1649
        /// * `value` - The boolean value to set
1650
        ///
1651
        /// # Returns
1652
        ///
1653
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1654
        ///
1655
        /// # Example
1656
        ///
1657
        /// ```rust
1658
        /// use qubit_datatype::DataType;
1659
        /// use qubit_value::MultiValues;
1660
        ///
1661
        /// let mut values = MultiValues::Empty(DataType::Bool);
1662
        /// values.set_bool(true).unwrap();
1663
        /// assert_eq!(values.get_bools().unwrap(), &[true]);
1664
        /// ```
1665
        set_bool, Bool, bool, DataType::Bool
1666
    }
1667

1668
    impl_set_single_value! {
1669
        /// Set single character value
1670
        ///
1671
        /// # Parameters
1672
        ///
1673
        /// * `value` - The character value to set
1674
        ///
1675
        /// # Returns
1676
        ///
1677
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1678
        set_char, Char, char, DataType::Char
1679
    }
1680

1681
    impl_set_single_value! {
1682
        /// Set single int8 value
1683
        ///
1684
        /// # Parameters
1685
        ///
1686
        /// * `value` - The int8 value to set
1687
        ///
1688
        /// # Returns
1689
        ///
1690
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1691
        set_int8, Int8, i8, DataType::Int8
1692
    }
1693

1694
    impl_set_single_value! {
1695
        /// Set single int16 value
1696
        ///
1697
        /// # Parameters
1698
        ///
1699
        /// * `value` - The int16 value to set
1700
        ///
1701
        /// # Returns
1702
        ///
1703
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1704
        set_int16, Int16, i16, DataType::Int16
1705
    }
1706

1707
    impl_set_single_value! {
1708
        /// Set single int32 value
1709
        ///
1710
        /// # Parameters
1711
        ///
1712
        /// * `value` - The int32 value to set
1713
        ///
1714
        /// # Returns
1715
        ///
1716
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1717
        set_int32, Int32, i32, DataType::Int32
1718
    }
1719

1720
    impl_set_single_value! {
1721
        /// Set single int64 value
1722
        ///
1723
        /// # Parameters
1724
        ///
1725
        /// * `value` - The int64 value to set
1726
        ///
1727
        /// # Returns
1728
        ///
1729
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1730
        set_int64, Int64, i64, DataType::Int64
1731
    }
1732

1733
    impl_set_single_value! {
1734
        /// Set single int128 value
1735
        ///
1736
        /// # Parameters
1737
        ///
1738
        /// * `value` - The int128 value to set
1739
        ///
1740
        /// # Returns
1741
        ///
1742
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1743
        set_int128, Int128, i128, DataType::Int128
1744
    }
1745

1746
    impl_set_single_value! {
1747
        /// Set single uint8 value
1748
        ///
1749
        /// # Parameters
1750
        ///
1751
        /// * `value` - The uint8 value to set
1752
        ///
1753
        /// # Returns
1754
        ///
1755
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1756
        set_uint8, UInt8, u8, DataType::UInt8
1757
    }
1758

1759
    impl_set_single_value! {
1760
        /// Set single uint16 value
1761
        ///
1762
        /// # Parameters
1763
        ///
1764
        /// * `value` - The uint16 value to set
1765
        ///
1766
        /// # Returns
1767
        ///
1768
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1769
        set_uint16, UInt16, u16, DataType::UInt16
1770
    }
1771

1772
    impl_set_single_value! {
1773
        /// Set single uint32 value
1774
        ///
1775
        /// # Parameters
1776
        ///
1777
        /// * `value` - The uint32 value to set
1778
        ///
1779
        /// # Returns
1780
        ///
1781
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1782
        set_uint32, UInt32, u32, DataType::UInt32
1783
    }
1784

1785
    impl_set_single_value! {
1786
        /// Set single uint64 value
1787
        ///
1788
        /// # Parameters
1789
        ///
1790
        /// * `value` - The uint64 value to set
1791
        ///
1792
        /// # Returns
1793
        ///
1794
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1795
        set_uint64, UInt64, u64, DataType::UInt64
1796
    }
1797

1798
    impl_set_single_value! {
1799
        /// Set single uint128 value
1800
        ///
1801
        /// # Parameters
1802
        ///
1803
        /// * `value` - The uint128 value to set
1804
        ///
1805
        /// # Returns
1806
        ///
1807
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1808
        set_uint128, UInt128, u128, DataType::UInt128
1809
    }
1810

1811
    impl_set_single_value! {
1812
        /// Set single float32 value
1813
        ///
1814
        /// # Parameters
1815
        ///
1816
        /// * `value` - The float32 value to set
1817
        ///
1818
        /// # Returns
1819
        ///
1820
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1821
        set_float32, Float32, f32, DataType::Float32
1822
    }
1823

1824
    impl_set_single_value! {
1825
        /// Set single float64 value
1826
        ///
1827
        /// # Parameters
1828
        ///
1829
        /// * `value` - The float64 value to set
1830
        ///
1831
        /// # Returns
1832
        ///
1833
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1834
        set_float64, Float64, f64, DataType::Float64
1835
    }
1836

1837
    impl_set_single_value! {
1838
        /// Set single string value
1839
        ///
1840
        /// # Parameters
1841
        ///
1842
        /// * `value` - The string value to set
1843
        ///
1844
        /// # Returns
1845
        ///
1846
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1847
        ///
1848
        /// # Example
1849
        ///
1850
        /// ```rust
1851
        /// use qubit_datatype::DataType;
1852
        /// use qubit_value::MultiValues;
1853
        ///
1854
        /// let mut values = MultiValues::Empty(DataType::String);
1855
        /// values.set_string("hello".to_string()).unwrap();
1856
        /// assert_eq!(values.get_strings().unwrap(), &["hello"]);
1857
        /// ```
1858
        set_string, String, String, DataType::String
1859
    }
1860

1861
    impl_set_single_value! {
1862
        /// Set single date value
1863
        ///
1864
        /// # Parameters
1865
        ///
1866
        /// * `value` - The date value to set
1867
        ///
1868
        /// # Returns
1869
        ///
1870
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1871
        set_date, Date, NaiveDate, DataType::Date
1872
    }
1873

1874
    impl_set_single_value! {
1875
        /// Set single time value
1876
        ///
1877
        /// # Parameters
1878
        ///
1879
        /// * `value` - The time value to set
1880
        ///
1881
        /// # Returns
1882
        ///
1883
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1884
        set_time, Time, NaiveTime, DataType::Time
1885
    }
1886

1887
    impl_set_single_value! {
1888
        /// Set single datetime value
1889
        ///
1890
        /// # Parameters
1891
        ///
1892
        /// * `value` - The datetime value to set
1893
        ///
1894
        /// # Returns
1895
        ///
1896
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1897
        set_datetime, DateTime, NaiveDateTime, DataType::DateTime
1898
    }
1899

1900
    impl_set_single_value! {
1901
        /// Set single UTC instant value
1902
        ///
1903
        /// # Parameters
1904
        ///
1905
        /// * `value` - The UTC instant value to set
1906
        ///
1907
        /// # Returns
1908
        ///
1909
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1910
        set_instant, Instant, DateTime<Utc>, DataType::Instant
1911
    }
1912

1913
    impl_set_single_value! {
1914
        /// Set single big integer value
1915
        ///
1916
        /// # Parameters
1917
        ///
1918
        /// * `value` - The big integer value to set
1919
        ///
1920
        /// # Returns
1921
        ///
1922
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1923
        set_biginteger, BigInteger, BigInt, DataType::BigInteger
1924
    }
1925

1926
    impl_set_single_value! {
1927
        /// Set single big decimal value
1928
        ///
1929
        /// # Parameters
1930
        ///
1931
        /// * `value` - The big decimal value to set
1932
        ///
1933
        /// # Returns
1934
        ///
1935
        /// If setting succeeds, returns `Ok(())`; otherwise returns an error
1936
        set_bigdecimal, BigDecimal, BigDecimal, DataType::BigDecimal
1937
    }
1938

1939
    impl_set_single_value! {
1940
        /// Set single isize value
1941
        set_intsize, IntSize, isize, DataType::IntSize
1942
    }
1943

1944
    impl_set_single_value! {
1945
        /// Set single usize value
1946
        set_uintsize, UIntSize, usize, DataType::UIntSize
1947
    }
1948

1949
    impl_set_single_value! {
1950
        /// Set single Duration value
1951
        set_duration, Duration, Duration, DataType::Duration
1952
    }
1953

1954
    impl_set_single_value! {
1955
        /// Set single Url value
1956
        set_url, Url, Url, DataType::Url
1957
    }
1958

1959
    impl_set_single_value! {
1960
        /// Set single StringMap value
1961
        set_string_map, StringMap, HashMap<String, String>, DataType::StringMap
1962
    }
1963

1964
    impl_set_single_value! {
1965
        /// Set single Json value
1966
        set_json, Json, serde_json::Value, DataType::Json
1967
    }
1968

1969
    // ========================================================================
1970
    // Add value operations
1971
    // ========================================================================
1972

1973
    impl_add_single_value! {
1974
        /// Add a boolean value
1975
        ///
1976
        /// # Parameters
1977
        ///
1978
        /// * `value` - The boolean value to add
1979
        ///
1980
        /// # Returns
1981
        ///
1982
        /// If types match, returns `Ok(())`; otherwise returns an error
1983
        ///
1984
        /// # Example
1985
        ///
1986
        /// ```rust
1987
        /// use qubit_value::MultiValues;
1988
        ///
1989
        /// let mut values = MultiValues::Bool(vec![true]);
1990
        /// values.add_bool(false).unwrap();
1991
        /// assert_eq!(values.count(), 2);
1992
        /// ```
1993
        add_bool, Bool, bool, DataType::Bool
1994
    }
1995

1996
    impl_add_single_value! {
1997
        /// Add a character value
1998
        ///
1999
        /// # Parameters
2000
        ///
2001
        /// * `value` - The character value to add
2002
        ///
2003
        /// # Returns
2004
        ///
2005
        /// If types match, returns `Ok(())`; otherwise returns an error
2006
        add_char, Char, char, DataType::Char
2007
    }
2008

2009
    impl_add_single_value! {
2010
        /// Add an int8 value
2011
        ///
2012
        /// # Parameters
2013
        ///
2014
        /// * `value` - The int8 value to add
2015
        ///
2016
        /// # Returns
2017
        ///
2018
        /// If types match, returns `Ok(())`; otherwise returns an error
2019
        add_int8, Int8, i8, DataType::Int8
2020
    }
2021

2022
    impl_add_single_value! {
2023
        /// Add an int16 value
2024
        ///
2025
        /// # Parameters
2026
        ///
2027
        /// * `value` - The int16 value to add
2028
        ///
2029
        /// # Returns
2030
        ///
2031
        /// If types match, returns `Ok(())`; otherwise returns an error
2032
        add_int16, Int16, i16, DataType::Int16
2033
    }
2034

2035
    impl_add_single_value! {
2036
        /// Add an int32 value
2037
        ///
2038
        /// # Parameters
2039
        ///
2040
        /// * `value` - The int32 value to add
2041
        ///
2042
        /// # Returns
2043
        ///
2044
        /// If types match, returns `Ok(())`; otherwise returns an error
2045
        add_int32, Int32, i32, DataType::Int32
2046
    }
2047

2048
    impl_add_single_value! {
2049
        /// Add an int64 value
2050
        ///
2051
        /// # Parameters
2052
        ///
2053
        /// * `value` - The int64 value to add
2054
        ///
2055
        /// # Returns
2056
        ///
2057
        /// If types match, returns `Ok(())`; otherwise returns an error
2058
        add_int64, Int64, i64, DataType::Int64
2059
    }
2060

2061
    impl_add_single_value! {
2062
        /// Add an int128 value
2063
        ///
2064
        /// # Parameters
2065
        ///
2066
        /// * `value` - The int128 value to add
2067
        ///
2068
        /// # Returns
2069
        ///
2070
        /// If types match, returns `Ok(())`; otherwise returns an error
2071
        add_int128, Int128, i128, DataType::Int128
2072
    }
2073

2074
    impl_add_single_value! {
2075
        /// Add a uint8 value
2076
        ///
2077
        /// # Parameters
2078
        ///
2079
        /// * `value` - The uint8 value to add
2080
        ///
2081
        /// # Returns
2082
        ///
2083
        /// If types match, returns `Ok(())`; otherwise returns an error
2084
        add_uint8, UInt8, u8, DataType::UInt8
2085
    }
2086

2087
    impl_add_single_value! {
2088
        /// Add a uint16 value
2089
        ///
2090
        /// # Parameters
2091
        ///
2092
        /// * `value` - The uint16 value to add
2093
        ///
2094
        /// # Returns
2095
        ///
2096
        /// If types match, returns `Ok(())`; otherwise returns an error
2097
        add_uint16, UInt16, u16, DataType::UInt16
2098
    }
2099

2100
    impl_add_single_value! {
2101
        /// Add a uint32 value
2102
        ///
2103
        /// # Parameters
2104
        ///
2105
        /// * `value` - The uint32 value to add
2106
        ///
2107
        /// # Returns
2108
        ///
2109
        /// If types match, returns `Ok(())`; otherwise returns an error
2110
        add_uint32, UInt32, u32, DataType::UInt32
2111
    }
2112

2113
    impl_add_single_value! {
2114
        /// Add a uint64 value
2115
        ///
2116
        /// # Parameters
2117
        ///
2118
        /// * `value` - The uint64 value to add
2119
        ///
2120
        /// # Returns
2121
        ///
2122
        /// If types match, returns `Ok(())`; otherwise returns an error
2123
        add_uint64, UInt64, u64, DataType::UInt64
2124
    }
2125

2126
    impl_add_single_value! {
2127
        /// Add a uint128 value
2128
        ///
2129
        /// # Parameters
2130
        ///
2131
        /// * `value` - The uint128 value to add
2132
        ///
2133
        /// # Returns
2134
        ///
2135
        /// If types match, returns `Ok(())`; otherwise returns an error
2136
        add_uint128, UInt128, u128, DataType::UInt128
2137
    }
2138

2139
    impl_add_single_value! {
2140
        /// Add a float32 value
2141
        ///
2142
        /// # Parameters
2143
        ///
2144
        /// * `value` - The float32 value to add
2145
        ///
2146
        /// # Returns
2147
        ///
2148
        /// If types match, returns `Ok(())`; otherwise returns an error
2149
        add_float32, Float32, f32, DataType::Float32
2150
    }
2151

2152
    impl_add_single_value! {
2153
        /// Add a float64 value
2154
        ///
2155
        /// # Parameters
2156
        ///
2157
        /// * `value` - The float64 value to add
2158
        ///
2159
        /// # Returns
2160
        ///
2161
        /// If types match, returns `Ok(())`; otherwise returns an error
2162
        add_float64, Float64, f64, DataType::Float64
2163
    }
2164

2165
    impl_add_single_value! {
2166
        /// Add a string
2167
        ///
2168
        /// # Parameters
2169
        ///
2170
        /// * `value` - The string to add
2171
        ///
2172
        /// # Returns
2173
        ///
2174
        /// If types match, returns `Ok(())`; otherwise returns an error
2175
        add_string, String, String, DataType::String
2176
    }
2177

2178
    impl_add_single_value! {
2179
        /// Add a date value
2180
        ///
2181
        /// # Parameters
2182
        ///
2183
        /// * `value` - The date value to add
2184
        ///
2185
        /// # Returns
2186
        ///
2187
        /// If types match, returns `Ok(())`; otherwise returns an error
2188
        add_date, Date, NaiveDate, DataType::Date
2189
    }
2190

2191
    impl_add_single_value! {
2192
        /// Add a time value
2193
        ///
2194
        /// # Parameters
2195
        ///
2196
        /// * `value` - The time value to add
2197
        ///
2198
        /// # Returns
2199
        ///
2200
        /// If types match, returns `Ok(())`; otherwise returns an error
2201
        add_time, Time, NaiveTime, DataType::Time
2202
    }
2203

2204
    impl_add_single_value! {
2205
        /// Add a datetime value
2206
        ///
2207
        /// # Parameters
2208
        ///
2209
        /// * `value` - The datetime value to add
2210
        ///
2211
        /// # Returns
2212
        ///
2213
        /// If types match, returns `Ok(())`; otherwise returns an error
2214
        add_datetime, DateTime, NaiveDateTime, DataType::DateTime
2215
    }
2216

2217
    impl_add_single_value! {
2218
        /// Add a UTC instant value
2219
        ///
2220
        /// # Parameters
2221
        ///
2222
        /// * `value` - The UTC instant value to add
2223
        ///
2224
        /// # Returns
2225
        ///
2226
        /// If types match, returns `Ok(())`; otherwise returns an error
2227
        add_instant, Instant, DateTime<Utc>, DataType::Instant
2228
    }
2229

2230
    impl_add_single_value! {
2231
        /// Add a big integer value
2232
        ///
2233
        /// # Parameters
2234
        ///
2235
        /// * `value` - The big integer value to add
2236
        ///
2237
        /// # Returns
2238
        ///
2239
        /// If types match, returns `Ok(())`; otherwise returns an error
2240
        add_biginteger, BigInteger, BigInt, DataType::BigInteger
2241
    }
2242

2243
    impl_add_single_value! {
2244
        /// Add a big decimal value
2245
        ///
2246
        /// # Parameters
2247
        ///
2248
        /// * `value` - The big decimal value to add
2249
        ///
2250
        /// # Returns
2251
        ///
2252
        /// If types match, returns `Ok(())`; otherwise returns an error
2253
        add_bigdecimal, BigDecimal, BigDecimal, DataType::BigDecimal
2254
    }
2255

2256
    impl_add_single_value! {
2257
        /// Add an isize value
2258
        add_intsize, IntSize, isize, DataType::IntSize
2259
    }
2260

2261
    impl_add_single_value! {
2262
        /// Add a usize value
2263
        add_uintsize, UIntSize, usize, DataType::UIntSize
2264
    }
2265

2266
    impl_add_single_value! {
2267
        /// Add a Duration value
2268
        add_duration, Duration, Duration, DataType::Duration
2269
    }
2270

2271
    impl_add_single_value! {
2272
        /// Add a Url value
2273
        add_url, Url, Url, DataType::Url
2274
    }
2275

2276
    impl_add_single_value! {
2277
        /// Add a StringMap value
2278
        add_string_map, StringMap, HashMap<String, String>, DataType::StringMap
2279
    }
2280

2281
    impl_add_single_value! {
2282
        /// Add a Json value
2283
        add_json, Json, serde_json::Value, DataType::Json
2284
    }
2285

2286
    // ========================================================================
2287
    // Add multiple values operations
2288
    // ========================================================================
2289

2290
    impl_add_multi_values! {
2291
        /// Add multiple boolean values
2292
        ///
2293
        /// # Parameters
2294
        ///
2295
        /// * `values` - The list of boolean values to add
2296
        ///
2297
        /// # Returns
2298
        ///
2299
        /// If types match, returns `Ok(())`; otherwise returns an error
2300
        ///
2301
        /// # Example
2302
        ///
2303
        /// ```rust
2304
        /// use qubit_value::MultiValues;
2305
        ///
2306
        /// let mut values = MultiValues::Bool(vec![true]);
2307
        /// values.add_bools(vec![false, true]).unwrap();
2308
        /// assert_eq!(values.get_bools().unwrap(), &[true, false, true]);
2309
        /// ```
2310
        add_bools, Bool, bool, DataType::Bool
2311
    }
2312

2313
    impl_add_multi_values! {
2314
        /// Add multiple character values
2315
        ///
2316
        /// # Parameters
2317
        ///
2318
        /// * `values` - The list of character values to add
2319
        ///
2320
        /// # Returns
2321
        ///
2322
        /// If types match, returns `Ok(())`; otherwise returns an error
2323
        add_chars, Char, char, DataType::Char
2324
    }
2325

2326
    impl_add_multi_values! {
2327
        /// Add multiple int8 values
2328
        ///
2329
        /// # Parameters
2330
        ///
2331
        /// * `values` - The list of int8 values to add
2332
        ///
2333
        /// # Returns
2334
        ///
2335
        /// If types match, returns `Ok(())`; otherwise returns an error
2336
        add_int8s, Int8, i8, DataType::Int8
2337
    }
2338

2339
    impl_add_multi_values! {
2340
        /// Add multiple int16 values
2341
        ///
2342
        /// # Parameters
2343
        ///
2344
        /// * `values` - The list of int16 values to add
2345
        ///
2346
        /// # Returns
2347
        ///
2348
        /// If types match, returns `Ok(())`; otherwise returns an error
2349
        add_int16s, Int16, i16, DataType::Int16
2350
    }
2351

2352
    impl_add_multi_values! {
2353
        /// Add multiple int32 values
2354
        ///
2355
        /// # Parameters
2356
        ///
2357
        /// * `values` - The list of int32 values to add
2358
        ///
2359
        /// # Returns
2360
        ///
2361
        /// If types match, returns `Ok(())`; otherwise returns an error
2362
        add_int32s, Int32, i32, DataType::Int32
2363
    }
2364

2365
    impl_add_multi_values! {
2366
        /// Add multiple int64 values
2367
        ///
2368
        /// # Parameters
2369
        ///
2370
        /// * `values` - The list of int64 values to add
2371
        ///
2372
        /// # Returns
2373
        ///
2374
        /// If types match, returns `Ok(())`; otherwise returns an error
2375
        add_int64s, Int64, i64, DataType::Int64
2376
    }
2377

2378
    impl_add_multi_values! {
2379
        /// Add multiple int128 values
2380
        ///
2381
        /// # Parameters
2382
        ///
2383
        /// * `values` - The list of int128 values to add
2384
        ///
2385
        /// # Returns
2386
        ///
2387
        /// If types match, returns `Ok(())`; otherwise returns an error
2388
        add_int128s, Int128, i128, DataType::Int128
2389
    }
2390

2391
    impl_add_multi_values! {
2392
        /// Add multiple uint8 values
2393
        ///
2394
        /// # Parameters
2395
        ///
2396
        /// * `values` - The list of uint8 values to add
2397
        ///
2398
        /// # Returns
2399
        ///
2400
        /// If types match, returns `Ok(())`; otherwise returns an error
2401
        add_uint8s, UInt8, u8, DataType::UInt8
2402
    }
2403

2404
    impl_add_multi_values! {
2405
        /// Add multiple uint16 values
2406
        ///
2407
        /// # Parameters
2408
        ///
2409
        /// * `values` - The list of uint16 values to add
2410
        ///
2411
        /// # Returns
2412
        ///
2413
        /// If types match, returns `Ok(())`; otherwise returns an error
2414
        add_uint16s, UInt16, u16, DataType::UInt16
2415
    }
2416

2417
    impl_add_multi_values! {
2418
        /// Add multiple uint32 values
2419
        ///
2420
        /// # Parameters
2421
        ///
2422
        /// * `values` - The list of uint32 values to add
2423
        ///
2424
        /// # Returns
2425
        ///
2426
        /// If types match, returns `Ok(())`; otherwise returns an error
2427
        add_uint32s, UInt32, u32, DataType::UInt32
2428
    }
2429

2430
    impl_add_multi_values! {
2431
        /// Add multiple uint64 values
2432
        ///
2433
        /// # Parameters
2434
        ///
2435
        /// * `values` - The list of uint64 values to add
2436
        ///
2437
        /// # Returns
2438
        ///
2439
        /// If types match, returns `Ok(())`; otherwise returns an error
2440
        add_uint64s, UInt64, u64, DataType::UInt64
2441
    }
2442

2443
    impl_add_multi_values! {
2444
        /// Add multiple uint128 values
2445
        ///
2446
        /// # Parameters
2447
        ///
2448
        /// * `values` - The list of uint128 values to add
2449
        ///
2450
        /// # Returns
2451
        ///
2452
        /// If types match, returns `Ok(())`; otherwise returns an error
2453
        add_uint128s, UInt128, u128, DataType::UInt128
2454
    }
2455

2456
    impl_add_multi_values! {
2457
        /// Add multiple float32 values
2458
        ///
2459
        /// # Parameters
2460
        ///
2461
        /// * `values` - The list of float32 values to add
2462
        ///
2463
        /// # Returns
2464
        ///
2465
        /// If types match, returns `Ok(())`; otherwise returns an error
2466
        add_float32s, Float32, f32, DataType::Float32
2467
    }
2468

2469
    impl_add_multi_values! {
2470
        /// Add multiple float64 values
2471
        ///
2472
        /// # Parameters
2473
        ///
2474
        /// * `values` - The list of float64 values to add
2475
        ///
2476
        /// # Returns
2477
        ///
2478
        /// If types match, returns `Ok(())`; otherwise returns an error
2479
        add_float64s, Float64, f64, DataType::Float64
2480
    }
2481

2482
    impl_add_multi_values! {
2483
        /// Add multiple string values
2484
        ///
2485
        /// # Parameters
2486
        ///
2487
        /// * `values` - The list of string values to add
2488
        ///
2489
        /// # Returns
2490
        ///
2491
        /// If types match, returns `Ok(())`; otherwise returns an error
2492
        ///
2493
        /// # Example
2494
        ///
2495
        /// ```rust
2496
        /// use qubit_value::MultiValues;
2497
        ///
2498
        /// let mut values = MultiValues::String(vec!["hello".to_string()]);
2499
        /// values.add_strings(vec!["world".to_string(), "rust".to_string()]).unwrap();
2500
        /// assert_eq!(values.get_strings().unwrap(), &["hello", "world", "rust"]);
2501
        /// ```
2502
        add_strings, String, String, DataType::String
2503
    }
2504

2505
    impl_add_multi_values! {
2506
        /// Add multiple date values
2507
        ///
2508
        /// # Parameters
2509
        ///
2510
        /// * `values` - The list of date values to add
2511
        ///
2512
        /// # Returns
2513
        ///
2514
        /// If types match, returns `Ok(())`; otherwise returns an error
2515
        add_dates, Date, NaiveDate, DataType::Date
2516
    }
2517

2518
    impl_add_multi_values! {
2519
        /// Add multiple time values
2520
        ///
2521
        /// # Parameters
2522
        ///
2523
        /// * `values` - The list of time values to add
2524
        ///
2525
        /// # Returns
2526
        ///
2527
        /// If types match, returns `Ok(())`; otherwise returns an error
2528
        add_times, Time, NaiveTime, DataType::Time
2529
    }
2530

2531
    impl_add_multi_values! {
2532
        /// Add multiple datetime values
2533
        ///
2534
        /// # Parameters
2535
        ///
2536
        /// * `values` - The list of datetime values to add
2537
        ///
2538
        /// # Returns
2539
        ///
2540
        /// If types match, returns `Ok(())`; otherwise returns an error
2541
        add_datetimes, DateTime, NaiveDateTime, DataType::DateTime
2542
    }
2543

2544
    impl_add_multi_values! {
2545
        /// Add multiple UTC instant values
2546
        ///
2547
        /// # Parameters
2548
        ///
2549
        /// * `values` - The list of UTC instant values to add
2550
        ///
2551
        /// # Returns
2552
        ///
2553
        /// If types match, returns `Ok(())`; otherwise returns an error
2554
        add_instants, Instant, DateTime<Utc>, DataType::Instant
2555
    }
2556

2557
    impl_add_multi_values! {
2558
        /// Add multiple big integer values
2559
        ///
2560
        /// # Parameters
2561
        ///
2562
        /// * `values` - The list of big integer values to add
2563
        ///
2564
        /// # Returns
2565
        ///
2566
        /// If types match, returns `Ok(())`; otherwise returns an error
2567
        add_bigintegers, BigInteger, BigInt, DataType::BigInteger
2568
    }
2569

2570
    impl_add_multi_values! {
2571
        /// Add multiple big decimal values
2572
        ///
2573
        /// # Parameters
2574
        ///
2575
        /// * `values` - The list of big decimal values to add
2576
        ///
2577
        /// # Returns
2578
        ///
2579
        /// If types match, returns `Ok(())`; otherwise returns an error
2580
        add_bigdecimals, BigDecimal, BigDecimal, DataType::BigDecimal
2581
    }
2582

2583
    impl_add_multi_values! {
2584
        /// Add multiple isize values
2585
        add_intsizes, IntSize, isize, DataType::IntSize
2586
    }
2587

2588
    impl_add_multi_values! {
2589
        /// Add multiple usize values
2590
        add_uintsizes, UIntSize, usize, DataType::UIntSize
2591
    }
2592

2593
    impl_add_multi_values! {
2594
        /// Add multiple Duration values
2595
        add_durations, Duration, Duration, DataType::Duration
2596
    }
2597

2598
    impl_add_multi_values! {
2599
        /// Add multiple Url values
2600
        add_urls, Url, Url, DataType::Url
2601
    }
2602

2603
    impl_add_multi_values! {
2604
        /// Add multiple StringMap values
2605
        add_string_maps, StringMap, HashMap<String, String>, DataType::StringMap
2606
    }
2607

2608
    impl_add_multi_values! {
2609
        /// Add multiple Json values
2610
        add_jsons, Json, serde_json::Value, DataType::Json
2611
    }
2612

2613
    // ========================================================================
2614
    // Add multiple values via slice operations
2615
    // ========================================================================
2616

2617
    impl_add_multi_values_slice! {
2618
        /// Add multiple boolean values via slice
2619
        ///
2620
        /// # Parameters
2621
        ///
2622
        /// * `values` - The boolean value slice to add
2623
        ///
2624
        /// # Returns
2625
        ///
2626
        /// If types match, returns `Ok(())`; otherwise returns an error
2627
        add_bools_slice, Bool, bool, DataType::Bool
2628
    }
2629

2630
    impl_add_multi_values_slice! {
2631
        /// Add multiple character values via slice
2632
        ///
2633
        /// # Parameters
2634
        ///
2635
        /// * `values` - The character value slice to add
2636
        ///
2637
        /// # Returns
2638
        ///
2639
        /// If types match, returns `Ok(())`; otherwise returns an error
2640
        add_chars_slice, Char, char, DataType::Char
2641
    }
2642

2643
    impl_add_multi_values_slice! {
2644
        /// Add multiple int8 values via slice
2645
        ///
2646
        /// # Parameters
2647
        ///
2648
        /// * `values` - The int8 value slice to add
2649
        ///
2650
        /// # Returns
2651
        ///
2652
        /// If types match, returns `Ok(())`; otherwise returns an error
2653
        add_int8s_slice, Int8, i8, DataType::Int8
2654
    }
2655

2656
    impl_add_multi_values_slice! {
2657
        /// Add multiple int16 values via slice
2658
        ///
2659
        /// # Parameters
2660
        ///
2661
        /// * `values` - The int16 value slice to add
2662
        ///
2663
        /// # Returns
2664
        ///
2665
        /// If types match, returns `Ok(())`; otherwise returns an error
2666
        add_int16s_slice, Int16, i16, DataType::Int16
2667
    }
2668

2669
    impl_add_multi_values_slice! {
2670
        /// Add multiple int32 values via slice
2671
        ///
2672
        /// # Parameters
2673
        ///
2674
        /// * `values` - The int32 value slice to add
2675
        ///
2676
        /// # Returns
2677
        ///
2678
        /// If types match, returns `Ok(())`; otherwise returns an error
2679
        add_int32s_slice, Int32, i32, DataType::Int32
2680
    }
2681

2682
    impl_add_multi_values_slice! {
2683
        /// Add multiple int64 values via slice
2684
        ///
2685
        /// # Parameters
2686
        ///
2687
        /// * `values` - The int64 value slice to add
2688
        ///
2689
        /// # Returns
2690
        ///
2691
        /// If types match, returns `Ok(())`; otherwise returns an error
2692
        add_int64s_slice, Int64, i64, DataType::Int64
2693
    }
2694

2695
    impl_add_multi_values_slice! {
2696
        /// Add multiple int128 values via slice
2697
        ///
2698
        /// # Parameters
2699
        ///
2700
        /// * `values` - The int128 value slice to add
2701
        ///
2702
        /// # Returns
2703
        ///
2704
        /// If types match, returns `Ok(())`; otherwise returns an error
2705
        add_int128s_slice, Int128, i128, DataType::Int128
2706
    }
2707

2708
    impl_add_multi_values_slice! {
2709
        /// Add multiple uint8 values via slice
2710
        ///
2711
        /// # Parameters
2712
        ///
2713
        /// * `values` - The uint8 value slice to add
2714
        ///
2715
        /// # Returns
2716
        ///
2717
        /// If types match, returns `Ok(())`; otherwise returns an error
2718
        add_uint8s_slice, UInt8, u8, DataType::UInt8
2719
    }
2720

2721
    impl_add_multi_values_slice! {
2722
        /// Add multiple uint16 values via slice
2723
        ///
2724
        /// # Parameters
2725
        ///
2726
        /// * `values` - The uint16 value slice to add
2727
        ///
2728
        /// # Returns
2729
        ///
2730
        /// If types match, returns `Ok(())`; otherwise returns an error
2731
        add_uint16s_slice, UInt16, u16, DataType::UInt16
2732
    }
2733

2734
    impl_add_multi_values_slice! {
2735
        /// Add multiple uint32 values via slice
2736
        ///
2737
        /// # Parameters
2738
        ///
2739
        /// * `values` - The uint32 value slice to add
2740
        ///
2741
        /// # Returns
2742
        ///
2743
        /// If types match, returns `Ok(())`; otherwise returns an error
2744
        add_uint32s_slice, UInt32, u32, DataType::UInt32
2745
    }
2746

2747
    impl_add_multi_values_slice! {
2748
        /// Add multiple uint64 values via slice
2749
        ///
2750
        /// # Parameters
2751
        ///
2752
        /// * `values` - The uint64 value slice to add
2753
        ///
2754
        /// # Returns
2755
        ///
2756
        /// If types match, returns `Ok(())`; otherwise returns an error
2757
        add_uint64s_slice, UInt64, u64, DataType::UInt64
2758
    }
2759

2760
    impl_add_multi_values_slice! {
2761
        /// Add multiple uint128 values via slice
2762
        ///
2763
        /// # Parameters
2764
        ///
2765
        /// * `values` - The uint128 value slice to add
2766
        ///
2767
        /// # Returns
2768
        ///
2769
        /// If types match, returns `Ok(())`; otherwise returns an error
2770
        add_uint128s_slice, UInt128, u128, DataType::UInt128
2771
    }
2772

2773
    impl_add_multi_values_slice! {
2774
        /// Add multiple float32 values via slice
2775
        ///
2776
        /// # Parameters
2777
        ///
2778
        /// * `values` - The float32 value slice to add
2779
        ///
2780
        /// # Returns
2781
        ///
2782
        /// If types match, returns `Ok(())`; otherwise returns an error
2783
        add_float32s_slice, Float32, f32, DataType::Float32
2784
    }
2785

2786
    impl_add_multi_values_slice! {
2787
        /// Add multiple float64 values via slice
2788
        ///
2789
        /// # Parameters
2790
        ///
2791
        /// * `values` - The float64 value slice to add
2792
        ///
2793
        /// # Returns
2794
        ///
2795
        /// If types match, returns `Ok(())`; otherwise returns an error
2796
        add_float64s_slice, Float64, f64, DataType::Float64
2797
    }
2798

2799
    impl_add_multi_values_slice! {
2800
        /// Add multiple strings via slice
2801
        ///
2802
        /// # Parameters
2803
        ///
2804
        /// * `values` - The string slice to add
2805
        ///
2806
        /// # Returns
2807
        ///
2808
        /// If types match, returns `Ok(())`; otherwise returns an error
2809
        add_strings_slice, String, String, DataType::String
2810
    }
2811

2812
    impl_add_multi_values_slice! {
2813
        /// Add multiple date values via slice
2814
        ///
2815
        /// # Parameters
2816
        ///
2817
        /// * `values` - The date value slice to add
2818
        ///
2819
        /// # Returns
2820
        ///
2821
        /// If types match, returns `Ok(())`; otherwise returns an error
2822
        add_dates_slice, Date, NaiveDate, DataType::Date
2823
    }
2824

2825
    impl_add_multi_values_slice! {
2826
        /// Add multiple time values via slice
2827
        ///
2828
        /// # Parameters
2829
        ///
2830
        /// * `values` - The time value slice to add
2831
        ///
2832
        /// # Returns
2833
        ///
2834
        /// If types match, returns `Ok(())`; otherwise returns an error
2835
        add_times_slice, Time, NaiveTime, DataType::Time
2836
    }
2837

2838
    impl_add_multi_values_slice! {
2839
        /// Add multiple datetime values via slice
2840
        ///
2841
        /// # Parameters
2842
        ///
2843
        /// * `values` - The datetime value slice to add
2844
        ///
2845
        /// # Returns
2846
        ///
2847
        /// If types match, returns `Ok(())`; otherwise returns an error
2848
        add_datetimes_slice, DateTime, NaiveDateTime, DataType::DateTime
2849
    }
2850

2851
    impl_add_multi_values_slice! {
2852
        /// Add multiple UTC instant values via slice
2853
        ///
2854
        /// # Parameters
2855
        ///
2856
        /// * `values` - The UTC instant value slice to add
2857
        ///
2858
        /// # Returns
2859
        ///
2860
        /// If types match, returns `Ok(())`; otherwise returns an error
2861
        add_instants_slice, Instant, DateTime<Utc>, DataType::Instant
2862
    }
2863

2864
    impl_add_multi_values_slice! {
2865
        /// Add multiple big integer values via slice
2866
        ///
2867
        /// # Parameters
2868
        ///
2869
        /// * `values` - The big integer value slice to add
2870
        ///
2871
        /// # Returns
2872
        ///
2873
        /// If types match, returns `Ok(())`; otherwise returns an error
2874
        add_bigintegers_slice, BigInteger, BigInt, DataType::BigInteger
2875
    }
2876

2877
    impl_add_multi_values_slice! {
2878
        /// Add multiple big decimal values via slice
2879
        ///
2880
        /// # Parameters
2881
        ///
2882
        /// * `values` - The big decimal value slice to add
2883
        ///
2884
        /// # Returns
2885
        ///
2886
        /// If types match, returns `Ok(())`; otherwise returns an error
2887
        add_bigdecimals_slice, BigDecimal, BigDecimal, DataType::BigDecimal
2888
    }
2889

2890
    impl_add_multi_values_slice! {
2891
        /// Add multiple isize values via slice
2892
        add_intsizes_slice, IntSize, isize, DataType::IntSize
2893
    }
2894

2895
    impl_add_multi_values_slice! {
2896
        /// Add multiple usize values via slice
2897
        add_uintsizes_slice, UIntSize, usize, DataType::UIntSize
2898
    }
2899

2900
    impl_add_multi_values_slice! {
2901
        /// Add multiple Duration values via slice
2902
        add_durations_slice, Duration, Duration, DataType::Duration
2903
    }
2904

2905
    impl_add_multi_values_slice! {
2906
        /// Add multiple Url values via slice
2907
        add_urls_slice, Url, Url, DataType::Url
2908
    }
2909

2910
    impl_add_multi_values_slice! {
2911
        /// Add multiple StringMap values via slice
2912
        add_string_maps_slice, StringMap, HashMap<String, String>, DataType::StringMap
2913
    }
2914

2915
    impl_add_multi_values_slice! {
2916
        /// Add multiple Json values via slice
2917
        add_jsons_slice, Json, serde_json::Value, DataType::Json
2918
    }
2919
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc