1use crate::builder::Str;
2
3/// [`Arg`][crate::Arg] or [`ArgGroup`][crate::ArgGroup] identifier
4///
5/// This is used for accessing the value in [`ArgMatches`][crate::ArgMatches] or defining
6/// relationships between `Arg`s and `ArgGroup`s with functions like
7/// [`Arg::conflicts_with`][crate::Arg::conflicts_with].
8#[derive(Default, Clone, Eq, PartialEq, PartialOrd, Ord, Hash)]
9pub struct Id(Str);
10
11impl Id {
12 pub(crate) const HELP: &'static str = "help";
13 pub(crate) const VERSION: &'static str = "version";
14 pub(crate) const EXTERNAL: &'static str = "";
15
16 pub(crate) fn from_static_ref(name: &'static str) -> Self {
17 Self(Str::from_static_ref(name))
18 }
19
20 /// Get the raw string of the `Id`
21 pub fn as_str(&self) -> &str {
22 self.0.as_str()
23 }
24
25 pub(crate) fn as_internal_str(&self) -> &Str {
26 &self.0
27 }
28}
29
30impl From<&'_ Id> for Id {
31 fn from(id: &'_ Id) -> Self {
32 id.clone()
33 }
34}
35
36impl From<Str> for Id {
37 fn from(name: Str) -> Self {
38 Self(name)
39 }
40}
41
42impl From<&'_ Str> for Id {
43 fn from(name: &'_ Str) -> Self {
44 Self(name.into())
45 }
46}
47
48#[cfg(feature = "string")]
49impl From<std::string::String> for Id {
50 fn from(name: std::string::String) -> Self {
51 Self(name.into())
52 }
53}
54
55#[cfg(feature = "string")]
56impl From<&'_ std::string::String> for Id {
57 fn from(name: &'_ std::string::String) -> Self {
58 Self(name.into())
59 }
60}
61
62impl From<&'static str> for Id {
63 fn from(name: &'static str) -> Self {
64 Self(name.into())
65 }
66}
67
68impl From<&'_ &'static str> for Id {
69 fn from(name: &'_ &'static str) -> Self {
70 Self(name.into())
71 }
72}
73
74impl From<Id> for Str {
75 fn from(name: Id) -> Self {
76 name.0
77 }
78}
79
80impl From<Id> for String {
81 fn from(name: Id) -> Self {
82 Str::from(name).into()
83 }
84}
85
86impl std::fmt::Display for Id {
87 #[inline]
88 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
89 std::fmt::Display::fmt(self.as_str(), f)
90 }
91}
92
93impl std::fmt::Debug for Id {
94 #[inline]
95 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
96 std::fmt::Debug::fmt(self.as_str(), f)
97 }
98}
99
100impl AsRef<str> for Id {
101 #[inline]
102 fn as_ref(&self) -> &str {
103 self.as_str()
104 }
105}
106
107impl std::borrow::Borrow<str> for Id {
108 #[inline]
109 fn borrow(&self) -> &str {
110 self.as_str()
111 }
112}
113
114impl PartialEq<str> for Id {
115 #[inline]
116 fn eq(&self, other: &str) -> bool {
117 PartialEq::eq(self.as_str(), other)
118 }
119}
120impl PartialEq<Id> for str {
121 #[inline]
122 fn eq(&self, other: &Id) -> bool {
123 PartialEq::eq(self, other:other.as_str())
124 }
125}
126
127impl PartialEq<&'_ str> for Id {
128 #[inline]
129 fn eq(&self, other: &&str) -> bool {
130 PartialEq::eq(self.as_str(), *other)
131 }
132}
133impl PartialEq<Id> for &'_ str {
134 #[inline]
135 fn eq(&self, other: &Id) -> bool {
136 PartialEq::eq(*self, other:other.as_str())
137 }
138}
139
140impl PartialEq<Str> for Id {
141 #[inline]
142 fn eq(&self, other: &Str) -> bool {
143 PartialEq::eq(self.as_str(), other:other.as_str())
144 }
145}
146impl PartialEq<Id> for Str {
147 #[inline]
148 fn eq(&self, other: &Id) -> bool {
149 PartialEq::eq(self.as_str(), other:other.as_str())
150 }
151}
152
153impl PartialEq<std::string::String> for Id {
154 #[inline]
155 fn eq(&self, other: &std::string::String) -> bool {
156 PartialEq::eq(self.as_str(), other:other.as_str())
157 }
158}
159impl PartialEq<Id> for std::string::String {
160 #[inline]
161 fn eq(&self, other: &Id) -> bool {
162 PartialEq::eq(self:other, self)
163 }
164}
165