Skip to main content

ledb_types/
identifier.rs

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/// Generic string indentifier
11///
12/// This type is used as name for collections and fields
13#[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}