aiscript-runtime 0.2.0

The web runtime of AIScript programming language interpreter
Documentation
use serde::Deserialize;

use super::EnvString;

#[derive(Debug, Deserialize, Default)]
pub struct DatabaseConfig {
    pub sqlite: Option<SqliteConfig>,
    pub postgresql: Option<PostgresConfig>,
    pub mysql: Option<MySqlConfig>,
    pub redis: Option<RedisConfig>,
}

#[derive(Debug, Deserialize)]
pub struct SqliteConfig {
    pub url: Option<EnvString>,
    pub database: Option<EnvString>,
}

#[derive(Debug, Deserialize)]
pub struct PostgresConfig {
    pub url: Option<EnvString>,
    pub host: Option<EnvString>,
    pub port: Option<u16>,
    pub user: Option<EnvString>,
    pub password: Option<EnvString>,
    pub database: Option<EnvString>,
}

#[derive(Debug, Deserialize)]
pub struct MySqlConfig {
    pub url: Option<EnvString>,
    pub host: Option<EnvString>,
    pub port: Option<u16>,
    pub user: Option<EnvString>,
    pub password: Option<EnvString>,
    pub database: Option<EnvString>,
}

#[derive(Debug, Deserialize)]
pub struct RedisConfig {
    pub url: Option<EnvString>,
    pub host: Option<EnvString>,
    pub port: Option<u16>,
    pub password: Option<EnvString>,
}

impl DatabaseConfig {
    pub fn get_sqlite_url(&self) -> Option<String> {
        self.sqlite.as_ref().and_then(|c| {
            c.url
                .clone()
                .map(Into::into)
                .or_else(|| c.database.as_ref().map(|db| format!("sqlite://{}", db)))
        })
    }

    pub fn get_postgres_url(&self) -> Option<String> {
        self.postgresql.as_ref().and_then(|c| {
            c.url.clone().map(Into::into).or_else(|| {
                match (&c.host, &c.port, &c.user, &c.password, &c.database) {
                    (Some(host), Some(port), Some(user), Some(password), Some(database)) => {
                        Some(format!(
                            "postgres://{}:{}@{}:{}/{}",
                            user, password, host, port, database
                        ))
                    }
                    _ => None,
                }
            })
        })
    }

    pub fn get_mysql_url(&self) -> Option<String> {
        self.mysql.as_ref().and_then(|c| {
            c.url.clone().map(Into::into).or_else(|| {
                match (&c.host, &c.port, &c.user, &c.password, &c.database) {
                    (Some(host), Some(port), Some(user), Some(password), Some(database)) => {
                        Some(format!(
                            "mysql://{}:{}@{}:{}/{}",
                            user, password, host, port, database
                        ))
                    }
                    _ => None,
                }
            })
        })
    }

    pub fn get_redis_url(&self) -> Option<String> {
        self.redis.as_ref().and_then(|c| {
            c.url
                .clone()
                .map(Into::into)
                .or_else(|| match (&c.host, &c.port, &c.password) {
                    (Some(host), Some(port), Some(password)) => {
                        Some(format!("redis://:{}@{}:{}", password, host, port))
                    }
                    _ => None,
                })
        })
    }
}