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