Skip to main content

schema_model/model/
view.rs

1use crate::model::types::DatabaseType;
2use std::fmt;
3
4#[derive(Debug, Clone)]
5pub struct View {
6    schema_name: Option<String>,
7    name: String,
8    sql: String,
9    database_type: Option<DatabaseType>,
10}
11impl View {
12    pub fn new<S: Into<String>>(
13        schema_name: Option<S>,
14        name: S,
15        sql: S,
16        database_type: Option<DatabaseType>,
17    ) -> Self {
18        Self {
19            schema_name: schema_name.map(|s| s.into()),
20            name: name.into(),
21            sql: sql.into(),
22            database_type,
23        }
24    }
25    pub fn schema_name(&self) -> Option<&str> {
26        self.schema_name.as_deref()
27    }
28
29    pub fn name(&self) -> &str {
30        &self.name
31    }
32
33    pub fn sql(&self) -> &str {
34        &self.sql
35    }
36
37    pub fn database_type(&self) -> Option<DatabaseType> {
38        self.database_type
39    }
40
41    pub fn fully_qualified_view_name(&self) -> String {
42        match self.schema_name() {
43            Some(schema_name) => format!("{}.{}", schema_name, self.name()),
44            None => self.name().to_string(),
45        }
46    }
47}
48
49impl fmt::Display for View {
50    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
51        match &self.schema_name {
52            Some(schema) => write!(f, "{}.{}", schema, self.name),
53            None => write!(f, "{}", self.name),
54        }
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61
62    #[test]
63    fn constructor_and_getters_and_display() {
64        let v = View::new(Some("s"), "v1", "select *", Some(DatabaseType::Postgresql));
65        assert_eq!(v.schema_name().unwrap(), "s");
66        assert_eq!(v.name(), "v1");
67        assert_eq!(v.sql(), "select *");
68        assert_eq!(v.database_type().unwrap(), DatabaseType::Postgresql);
69        assert_eq!(format!("{}", v), "s.v1");
70    }
71}