1use std::{
2 borrow::Borrow,
3 fmt::{Display, Formatter, Result as FmtResult},
4 hash::{Hash, Hasher},
5 ops::Deref,
6};
7
8use serde::{Serialize, Deserialize};
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
14#[serde(untagged)]
15pub enum Identifier {
16 Owned(String),
17 Refer(&'static str),
18}
19
20impl Default for Identifier {
21 fn default() -> Self {
22 Identifier::Refer("")
23 }
24}
25
26impl Display for Identifier {
27 fn fmt(&self, f: &mut Formatter) -> FmtResult {
28 f.write_str(&self)
29 }
30}
31
32impl Eq for Identifier {}
33
34impl PartialEq for Identifier {
35 fn eq(&self, other: &Self) -> bool {
36 self.as_ref() == other.as_ref()
37 }
38}
39
40impl Hash for Identifier {
41 fn hash<H: Hasher>(&self, state: &mut H) {
42 use self::Identifier::*;
43 match self {
44 Owned(s) => s.hash(state),
45 Refer(s) => s.hash(state),
46 }
47 }
48}
49
50impl AsRef<str> for Identifier {
51 fn as_ref(&self) -> &str {
52 use self::Identifier::*;
53 match self {
54 Owned(s) => &s,
55 Refer(s) => s,
56 }
57 }
58}
59
60impl Borrow<str> for Identifier {
61 #[inline]
62 fn borrow(&self) -> &str {
63 self.as_ref()
64 }
65}
66
67impl Deref for Identifier {
68 type Target = str;
69
70 fn deref(&self) -> &str {
71 self.as_ref()
72 }
73}
74
75impl From<&'static str> for Identifier {
76 fn from(s: &'static str) -> Self {
77 Identifier::Refer(s)
78 }
79}
80
81impl From<String> for Identifier {
82 fn from(s: String) -> Self {
83 Identifier::Owned(s)
84 }
85}
86
87impl<'a> From<&'a String> for Identifier {
88 fn from(s: &String) -> Self {
89 Identifier::Owned(s.clone())
90 }
91}