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;