chroma_types/
database_name.rs1use serde::Deserialize;
2
3#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, serde::Serialize)]
4#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
5pub struct DatabaseName(String);
6
7impl<'de> Deserialize<'de> for DatabaseName {
8 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
9 where
10 D: serde::Deserializer<'de>,
11 {
12 let s = String::deserialize(deserializer)?;
13 DatabaseName::new(s)
14 .ok_or_else(|| serde::de::Error::custom("database name must be at least 3 characters"))
15 }
16}
17
18impl DatabaseName {
19 pub fn new(dbname: impl Into<String>) -> Option<Self> {
21 let dbname = dbname.into();
22 if dbname.len() >= 3 {
23 Some(DatabaseName(dbname))
24 } else {
25 None
26 }
27 }
28
29 pub fn into_string(self) -> String {
30 self.0
31 }
32
33 pub fn topology(&self) -> Option<String> {
34 self.0.split_once('+').map(|x| x.0.to_string())
35 }
36}
37
38impl AsRef<str> for DatabaseName {
39 fn as_ref(&self) -> &str {
40 &self.0
41 }
42}
43
44impl PartialEq<str> for DatabaseName {
45 fn eq(&self, other: &str) -> bool {
46 self.0 == other
47 }
48}
49
50impl PartialEq<DatabaseName> for str {
51 fn eq(&self, other: &DatabaseName) -> bool {
52 self == other.0
53 }
54}
55
56impl PartialEq<String> for DatabaseName {
57 fn eq(&self, other: &String) -> bool {
58 self.0 == *other
59 }
60}
61
62impl PartialEq<DatabaseName> for String {
63 fn eq(&self, other: &DatabaseName) -> bool {
64 *self == other.0
65 }
66}