Skip to main content

qubit_value/
into_value_default.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//! Default value adapters for value access APIs.
12
13/// Collects borrowed string values into owned strings.
14#[inline]
15fn collect_strings<'a, I>(values: I) -> Vec<String>
16where
17    I: IntoIterator<Item = &'a str>,
18{
19    let mut result = Vec::new();
20    for value in values {
21        result.push(value.to_string());
22    }
23    result
24}
25
26/// Converts ergonomic default arguments into the value type expected by a read
27/// API.
28pub trait IntoValueDefault<T> {
29    /// Converts this argument into the default value.
30    fn into_value_default(self) -> T;
31}
32
33impl<T> IntoValueDefault<T> for T {
34    #[inline]
35    fn into_value_default(self) -> T {
36        self
37    }
38}
39
40impl IntoValueDefault<String> for &str {
41    #[inline]
42    fn into_value_default(self) -> String {
43        self.to_string()
44    }
45}
46
47impl IntoValueDefault<String> for &String {
48    #[inline]
49    fn into_value_default(self) -> String {
50        self.clone()
51    }
52}
53
54impl<T> IntoValueDefault<Vec<T>> for &[T]
55where
56    T: Clone,
57{
58    #[inline]
59    fn into_value_default(self) -> Vec<T> {
60        self.to_vec()
61    }
62}
63
64impl<T> IntoValueDefault<Vec<T>> for &Vec<T>
65where
66    T: Clone,
67{
68    #[inline]
69    fn into_value_default(self) -> Vec<T> {
70        self.clone()
71    }
72}
73
74impl<T, const N: usize> IntoValueDefault<Vec<T>> for [T; N] {
75    #[inline]
76    fn into_value_default(self) -> Vec<T> {
77        Vec::from(self)
78    }
79}
80
81impl<T, const N: usize> IntoValueDefault<Vec<T>> for &[T; N]
82where
83    T: Clone,
84{
85    #[inline]
86    fn into_value_default(self) -> Vec<T> {
87        self.to_vec()
88    }
89}
90
91impl IntoValueDefault<Vec<String>> for Vec<&str> {
92    #[inline]
93    fn into_value_default(self) -> Vec<String> {
94        collect_strings(self)
95    }
96}
97
98impl IntoValueDefault<Vec<String>> for &[&str] {
99    #[inline]
100    fn into_value_default(self) -> Vec<String> {
101        collect_strings(self.iter().copied())
102    }
103}
104
105impl IntoValueDefault<Vec<String>> for &Vec<&str> {
106    #[inline]
107    fn into_value_default(self) -> Vec<String> {
108        collect_strings(self.iter().copied())
109    }
110}
111
112impl<const N: usize> IntoValueDefault<Vec<String>> for [&str; N] {
113    #[inline]
114    fn into_value_default(self) -> Vec<String> {
115        collect_strings(self)
116    }
117}
118
119impl<const N: usize> IntoValueDefault<Vec<String>> for &[&str; N] {
120    #[inline]
121    fn into_value_default(self) -> Vec<String> {
122        collect_strings(self.iter().copied())
123    }
124}