schema_model/model/
key.rs1use 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}