Skip to main content

qubit_value/
into_value_default.rs

1// =============================================================================
2//    Copyright (c) 2025 - 2026 Haixing Hu.
3//
4//    SPDX-License-Identifier: Apache-2.0
5//
6//    Licensed under the Apache License, Version 2.0.
7// =============================================================================
8
9//! Default value adapters for value access APIs.
10
11/// Collects borrowed string values into owned strings.
12///
13/// # Type Parameters
14///
15/// * `I` - Iterator source yielding borrowed UTF-8 strings.
16///
17/// # Parameters
18///
19/// * `values` - Borrowed strings to copy into the returned collection.
20///
21/// # Returns
22///
23/// Owned strings in the source iteration order.
24#[inline]
25fn collect_strings<'a, I>(values: I) -> Vec<String>
26where
27    I: IntoIterator<Item = &'a str>,
28{
29    values.into_iter().map(str::to_owned).collect()
30}
31
32/// Converts ergonomic default arguments into the value type expected by a read
33/// API.
34///
35/// # Type Parameters
36///
37/// * `T` - Owned default type required by the read operation.
38///
39/// # Examples
40///
41/// ```
42/// use qubit_value::IntoValueDefault;
43///
44/// let owned: String = "fallback".into_value_default();
45/// assert_eq!(owned, "fallback");
46/// ```
47pub trait IntoValueDefault<T> {
48    /// Converts this argument into the default value.
49    ///
50    /// # Returns
51    ///
52    /// The owned default value expected by the read API.
53    #[must_use]
54    fn into_value_default(self) -> T;
55}
56
57impl<T> IntoValueDefault<T> for T {
58    #[inline(always)]
59    fn into_value_default(self) -> T {
60        self
61    }
62}
63
64impl IntoValueDefault<String> for &str {
65    #[inline]
66    fn into_value_default(self) -> String {
67        self.to_string()
68    }
69}
70
71impl IntoValueDefault<String> for &String {
72    #[inline]
73    fn into_value_default(self) -> String {
74        self.clone()
75    }
76}
77
78impl<T> IntoValueDefault<Vec<T>> for &[T]
79where
80    T: Clone,
81{
82    #[inline]
83    fn into_value_default(self) -> Vec<T> {
84        self.to_vec()
85    }
86}
87
88impl<T> IntoValueDefault<Vec<T>> for &Vec<T>
89where
90    T: Clone,
91{
92    #[inline]
93    fn into_value_default(self) -> Vec<T> {
94        self.clone()
95    }
96}
97
98impl<T, const N: usize> IntoValueDefault<Vec<T>> for [T; N] {
99    #[inline]
100    fn into_value_default(self) -> Vec<T> {
101        Vec::from(self)
102    }
103}
104
105impl<T, const N: usize> IntoValueDefault<Vec<T>> for &[T; N]
106where
107    T: Clone,
108{
109    #[inline]
110    fn into_value_default(self) -> Vec<T> {
111        self.to_vec()
112    }
113}
114
115impl IntoValueDefault<Vec<String>> for Vec<&str> {
116    #[inline]
117    fn into_value_default(self) -> Vec<String> {
118        collect_strings(self)
119    }
120}
121
122impl IntoValueDefault<Vec<String>> for &[&str] {
123    #[inline]
124    fn into_value_default(self) -> Vec<String> {
125        collect_strings(self.iter().copied())
126    }
127}
128
129impl IntoValueDefault<Vec<String>> for &Vec<&str> {
130    #[inline]
131    fn into_value_default(self) -> Vec<String> {
132        collect_strings(self.iter().copied())
133    }
134}
135
136impl<const N: usize> IntoValueDefault<Vec<String>> for [&str; N] {
137    #[inline]
138    fn into_value_default(self) -> Vec<String> {
139        collect_strings(self)
140    }
141}
142
143impl<const N: usize> IntoValueDefault<Vec<String>> for &[&str; N] {
144    #[inline]
145    fn into_value_default(self) -> Vec<String> {
146        collect_strings(self.iter().copied())
147    }
148}