Skip to main content

schema_model/model/
key.rs

1use crate::model::types::KeyType;
2
3#[derive(Debug, Clone)]
4pub struct KeyColumn {
5    name: String,
6}
7
8impl KeyColumn {
9    pub fn new<S: Into<String>>(name: S) -> Self {
10        Self { name: name.into() }
11    }
12
13    pub fn name(&self) -> &str {
14        &self.name
15    }
16}
17
18#[derive(Debug, Clone)]
19pub struct Key {
20    key_type: KeyType,
21    columns: Vec<KeyColumn>,
22    cluster: bool,
23    compress: bool,
24    unique: bool,
25    include: Option<String>,
26}
27
28impl Key {
29    pub fn new(key_type: KeyType, columns: Vec<KeyColumn>) -> Self {
30        Self {
31            key_type,
32            columns,
33            cluster: false,
34            compress: false,
35            unique: false,
36            include: None,
37        }
38    }
39
40    pub fn new_full<S: Into<String>>(
41        key_type: KeyType,
42        columns: Vec<KeyColumn>,
43        cluster: bool,
44        compress: bool,
45        unique: bool,
46        include: Option<S>,
47    ) -> Self {
48        Self {
49            key_type,
50            columns,
51            cluster,
52            compress,
53            unique,
54            include: include.map(|s| s.into()),
55        }
56    }
57
58    pub fn key_type(&self) -> KeyType {
59        self.key_type
60    }
61
62    pub fn columns(&self) -> &Vec<KeyColumn> {
63        &self.columns
64    }
65
66    pub fn is_cluster(&self) -> bool {
67        self.cluster
68    }
69
70    pub fn is_compress(&self) -> bool {
71        self.compress
72    }
73
74    pub fn is_unique(&self) -> bool {
75        self.unique
76    }
77
78    pub fn include(&self) -> Option<&str> {
79        self.include.as_deref()
80    }
81
82    pub fn is_index(&self) -> bool {
83        self.key_type == KeyType::Index
84    }
85
86    pub fn contains_column(&self, column_name: &str) -> bool {
87        self.columns.iter().any(|c| c.name() == column_name)
88    }
89
90    pub fn columns_as_string(&self) -> String {
91        self.columns
92            .iter()
93            .map(|c| c.name())
94            .collect::<Vec<_>>()
95            .join(",")
96    }
97}
98
99#[cfg(test)]
100mod tests {
101    use super::*;
102    use crate::model::types::KeyType;
103
104    #[test]
105    fn key_column_and_key_basics() {
106        let cols = vec![KeyColumn::new("id"), KeyColumn::new("code")];
107        let k = Key::new(KeyType::Primary, cols.clone());
108        assert_eq!(k.key_type(), KeyType::Primary);
109        assert_eq!(k.columns().len(), 2);
110        assert!(!k.is_cluster());
111        assert!(!k.is_compress());
112        assert!(!k.is_unique());
113        assert_eq!(k.include(), None);
114        assert!(k.contains_column("id"));
115        assert_eq!(k.columns_as_string(), "id,code");
116
117        let k2 = Key::new_full(KeyType::Index, cols, true, true, true, Some("inc"));
118        assert!(k2.is_cluster());
119        assert!(k2.is_compress());
120        assert!(k2.is_unique());
121        assert_eq!(k2.include(), Some("inc"));
122    }
123}