Skip to main content

chroma_types/
database_name.rs

1use 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    /// Creates a new DatabaseName if the name is at least 3 characters long.
20    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}