terrazzo-terminal 0.2.8

A simple web-based terminal emulator built on Terrazzo.
use std::fmt::Debug;
use std::ops::Deref;
use std::sync::Arc;

use serde::Deserialize;
use serde::Serialize;
use trz_gateway_common::dynamic_config::DynamicConfig;
use trz_gateway_common::dynamic_config::has_diff::DiffArc;
use trz_gateway_common::dynamic_config::has_diff::DiffOption;
use trz_gateway_common::dynamic_config::mode::RO;
use trz_gateway_server::server::acme::AcmeConfig;
use trz_gateway_server::server::acme::DynamicAcmeConfig;

use self::mesh::DynamicMeshConfig;
use self::mesh::MeshConfig;
use self::server::DynamicServerConfig;
use self::server::ServerConfig;
use self::types::ConfigFileTypes;
use self::types::ConfigTypes;
use self::types::RuntimeTypes;

mod into_dyn;
pub(in crate::backend) mod io;
pub(in crate::backend) mod kill;
mod merge;
pub mod mesh;
pub(in crate::backend) mod password;
pub(in crate::backend) mod pidfile;
pub mod server;
pub(in crate::backend) mod types;

#[derive(Debug, Default, Serialize, Deserialize)]
#[serde(transparent)]
pub struct ConfigFile(ConfigImpl<ConfigFileTypes>);

impl Deref for ConfigFile {
    type Target = ConfigImpl<ConfigFileTypes>;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

pub struct DynConfig {
    config: Arc<DynamicConfig<DiffArc<Config>>>,
    pub server: DynamicServerConfig,
    pub mesh: DynamicMeshConfig,
    pub letsencrypt: DynamicAcmeConfig,

    #[expect(unused)]
    dyn_config_file: Arc<DynamicConfig<(), RO>>,
}

impl Deref for DynConfig {
    type Target = Arc<DynamicConfig<DiffArc<Config>>>;

    fn deref(&self) -> &Self::Target {
        &self.config
    }
}

#[derive(Clone, Debug)]
pub struct Config(ConfigImpl<RuntimeTypes>);

impl Deref for Config {
    type Target = ConfigImpl<RuntimeTypes>;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

impl From<ConfigImpl<RuntimeTypes>> for Config {
    fn from(value: ConfigImpl<RuntimeTypes>) -> Self {
        Self(value)
    }
}

#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(default)]
pub struct ConfigImpl<T: ConfigTypes> {
    pub server: DiffArc<ServerConfig<T>>,
    pub mesh: DiffOption<DiffArc<MeshConfig<T>>>,
    pub letsencrypt: DiffOption<DiffArc<AcmeConfig>>,
}

impl Default for ConfigImpl<ConfigFileTypes> {
    fn default() -> Self {
        Self {
            server: Default::default(),
            mesh: Default::default(),
            letsencrypt: Default::default(),
        }
    }
}