Skip to main content

gen_memory/
db.rs

1use std::hash::Hash;
2use std::io;
3
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5#[derive(Clone, Debug, Eq, PartialEq, Hash)]
6pub struct Db {
7    name: String,
8}
9
10impl Db {
11    pub fn try_from(name: &str) -> io::Result<Db> {
12        if name.is_empty() {
13            return Err(io::Error::new(io::ErrorKind::InvalidInput, "Db name is empty"));
14        }
15
16        let ok_chars: bool = name
17            .chars()
18            .all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_');
19
20        if !ok_chars {
21            return Err(io::Error::new(
22                io::ErrorKind::InvalidInput,
23                "Db name must match [A-Za-z0-9_-]+",
24            ));
25        }
26
27        Ok(Db {
28            name: name.to_ascii_lowercase(),
29        })
30    }
31}
32
33#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
34#[derive(Clone, Debug, Eq, PartialEq, Hash)]
35pub struct DbKey {
36    pub db: Db,
37    pub name: String,
38}
39
40impl DbKey {
41    pub fn from(db: &Db, name: &str) -> DbKey {
42        DbKey { db: db.clone(), name: name.to_string() }
43    }
44}
45
46#[cfg(test)]
47#[path = "../tests/unit_tests/db.rs"]
48pub mod tests;