clap_builder/builder/
possible_value.rs1use crate::builder::IntoResettable;
2use crate::builder::Str;
3use crate::builder::StyledStr;
4#[cfg(feature = "help")]
5use crate::util::Escape;
6use crate::util::eq_ignore_case;
7
8#[derive(#[automatically_derived]
impl ::core::fmt::Debug for PossibleValue {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f, "PossibleValue",
"name", &self.name, "help", &self.help, "aliases", &self.aliases,
"hide", &&self.hide)
}
}Debug, #[automatically_derived]
impl ::core::default::Default for PossibleValue {
#[inline]
fn default() -> PossibleValue {
PossibleValue {
name: ::core::default::Default::default(),
help: ::core::default::Default::default(),
aliases: ::core::default::Default::default(),
hide: ::core::default::Default::default(),
}
}
}Default, #[automatically_derived]
impl ::core::clone::Clone for PossibleValue {
#[inline]
fn clone(&self) -> PossibleValue {
PossibleValue {
name: ::core::clone::Clone::clone(&self.name),
help: ::core::clone::Clone::clone(&self.help),
aliases: ::core::clone::Clone::clone(&self.aliases),
hide: ::core::clone::Clone::clone(&self.hide),
}
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for PossibleValue {
#[inline]
fn eq(&self, other: &PossibleValue) -> bool {
self.hide == other.hide && self.name == other.name &&
self.help == other.help && self.aliases == other.aliases
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for PossibleValue {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Str>;
let _: ::core::cmp::AssertParamIsEq<Option<StyledStr>>;
let _: ::core::cmp::AssertParamIsEq<Vec<Str>>;
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq)]
42pub struct PossibleValue {
43 name: Str,
44 help: Option<StyledStr>,
45 aliases: Vec<Str>, hide: bool,
47}
48
49impl PossibleValue {
50 pub fn new(name: impl Into<Str>) -> Self {
73 PossibleValue {
74 name: name.into(),
75 ..Default::default()
76 }
77 }
78
79 #[inline]
94 #[must_use]
95 pub fn help(mut self, help: impl IntoResettable<StyledStr>) -> Self {
96 self.help = help.into_resettable().into_option();
97 self
98 }
99
100 #[inline]
116 #[must_use]
117 pub fn hide(mut self, yes: bool) -> Self {
118 self.hide = yes;
119 self
120 }
121
122 #[must_use]
134 pub fn alias(mut self, name: impl IntoResettable<Str>) -> Self {
135 if let Some(name) = name.into_resettable().into_option() {
136 self.aliases.push(name);
137 } else {
138 self.aliases.clear();
139 }
140 self
141 }
142
143 #[must_use]
155 pub fn aliases(mut self, names: impl IntoIterator<Item = impl Into<Str>>) -> Self {
156 self.aliases.extend(names.into_iter().map(|a| a.into()));
157 self
158 }
159}
160
161impl PossibleValue {
163 #[inline]
165 pub fn get_name(&self) -> &str {
166 self.name.as_str()
167 }
168
169 #[inline]
171 pub fn get_help(&self) -> Option<&StyledStr> {
172 self.help.as_ref()
173 }
174
175 #[inline]
177 pub fn is_hide_set(&self) -> bool {
178 self.hide
179 }
180
181 pub(crate) fn should_show_help(&self) -> bool {
183 !self.hide && self.help.is_some()
184 }
185
186 #[cfg(feature = "help")]
189 pub(crate) fn get_visible_quoted_name(&self) -> Option<std::borrow::Cow<'_, str>> {
190 if !self.hide {
191 Some(Escape(self.name.as_str()).to_cow())
192 } else {
193 None
194 }
195 }
196
197 pub fn get_name_and_aliases(&self) -> impl Iterator<Item = &str> + '_ {
201 std::iter::once(self.get_name()).chain(self.aliases.iter().map(|s| s.as_str()))
202 }
203
204 pub fn matches(&self, value: &str, ignore_case: bool) -> bool {
222 if ignore_case {
223 self.get_name_and_aliases()
224 .any(|name| eq_ignore_case(name, value))
225 } else {
226 self.get_name_and_aliases().any(|name| name == value)
227 }
228 }
229}
230
231impl<S: Into<Str>> From<S> for PossibleValue {
232 fn from(s: S) -> Self {
233 Self::new(s)
234 }
235}