teo-parser 0.3.0

Parser for Teo schema language
Documentation
use std::fmt::{Display, Formatter};
use serde::Serialize;

static NO_DATABASE: u32 = 1;
static MONGO: u32 = 1 << 1;
static MYSQL: u32 = 1 << 2;
static POSTGRES: u32 = 1 << 3;
static SQLITE: u32 = 1 << 4;
static SQL: u32 = MYSQL | POSTGRES | SQLITE;
static DATABASE: u32 = MONGO | SQL;
static ALL: u32 = DATABASE | NO_DATABASE;

#[repr(transparent)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize)]
pub struct Availability(u32);

impl Availability {

    pub fn no_database() -> Self {
        Self(NO_DATABASE)
    }

    pub fn none() -> Self {
        Self(0)
    }

    pub fn database() -> Self {
        Self(DATABASE)
    }

    pub fn mongo() -> Self {
        Self(MONGO)
    }

    pub fn sql() -> Self {
        Self(SQL)
    }

    pub fn mysql() -> Self {
        Self(MYSQL)
    }

    pub fn postgres() -> Self {
        Self(POSTGRES)
    }

    pub fn sqlite() -> Self {
        Self(SQLITE)
    }

    pub fn contains(&self, actual: Availability) -> bool {
        self.0 & actual.0 != 0
    }

    pub fn is_none(&self) -> bool {
        self.0 == 0
    }

    pub fn bi_and(&self, other: Availability) -> Availability {
        Self(self.0 & other.0)
    }
}

impl Default for Availability {

    fn default() -> Self {
        Self(ALL)
    }
}

impl Display for Availability {

    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        let mut to_join = vec![];
        if self.0 & NO_DATABASE > 0 {
            to_join.push("noDatabase");
        }
        if self.0 & MYSQL > 0 {
            to_join.push("mysql");
        }
        if self.0 & POSTGRES > 0 {
            to_join.push("postgres");
        }
        if self.0 & SQLITE > 0 {
            to_join.push("sqlite");
        }
        if self.0 & MONGO > 0 {
            to_join.push("mongo");
        }
        if to_join.is_empty() {
            f.write_str(&"none")
        } else {
            f.write_str(&to_join.join(" | "))
        }
    }
}