rototo 0.1.0-alpha.2

Control plane for runtime configuration in application code.
Documentation
use std::path::PathBuf;

use crate::diagnostics::{Diagnostic, DiagnosticCatalogEntry};

#[derive(Debug)]
pub struct WorkspaceInspection {
    pub root: PathBuf,
    pub environments: Vec<String>,
    pub qualifiers: Vec<QualifierInspection>,
    pub variables: Vec<VariableInspection>,
}

#[derive(Clone, Debug)]
pub struct QualifierInspection {
    pub id: String,
    pub uri: String,
    pub path: PathBuf,
}

#[derive(Clone, Debug)]
pub struct VariableInspection {
    pub id: String,
    pub uri: String,
    pub path: PathBuf,
}

#[derive(Debug)]
pub struct QualifierConfig {
    pub id: String,
    pub uri: String,
    pub path: PathBuf,
    pub value: serde_json::Value,
}

#[derive(Debug)]
pub struct VariableConfig {
    pub id: String,
    pub uri: String,
    pub path: PathBuf,
    pub value: serde_json::Value,
}

#[derive(Debug)]
pub struct WorkspaceLint {
    pub root: PathBuf,
    pub diagnostics: Vec<Diagnostic>,
}

#[derive(Debug)]
pub struct QualifierLint {
    pub root: PathBuf,
    pub id: String,
    pub diagnostics: Vec<Diagnostic>,
}

#[derive(Debug)]
pub struct VariableLint {
    pub root: PathBuf,
    pub id: String,
    pub diagnostics: Vec<Diagnostic>,
}

#[derive(Debug, serde::Serialize)]
pub struct QualifierResolution {
    pub id: String,
    pub value: bool,
}

#[derive(Debug, serde::Serialize)]
pub struct VariableResolution {
    pub id: String,
    pub environment: String,
    pub value_key: String,
    pub value: serde_json::Value,
}

#[derive(Clone, Debug)]
pub struct VariableResolutionTrace {
    pub id: String,
    pub requested_environment: String,
    pub environment_block: String,
    pub environment_fallback: bool,
    pub rules: Vec<VariableRuleResolutionTrace>,
    pub default_value: Option<String>,
    pub selected_value: String,
    pub selected_by: VariableSelectionTrace,
}

#[derive(Clone, Debug)]
pub struct VariableRuleResolutionTrace {
    pub index: usize,
    pub qualifier: String,
    pub description: Option<String>,
    pub value: Option<String>,
    pub qualifier_value: bool,
    pub selected: bool,
    pub qualifier_trace: QualifierResolutionTrace,
}

#[derive(Clone, Debug)]
pub enum VariableSelectionTrace {
    Rule { index: usize, qualifier: String },
    Default,
}

#[derive(Clone, Debug)]
pub struct QualifierResolutionTrace {
    pub id: String,
    pub description: Option<String>,
    pub cached: bool,
    pub predicates: Vec<PredicateResolutionTrace>,
    pub value: bool,
}

#[derive(Clone, Debug)]
pub struct PredicateResolutionTrace {
    pub index: usize,
    pub attribute: String,
    pub op: String,
    pub description: Option<String>,
    pub expected: Option<serde_json::Value>,
    pub actual: PredicateActualTrace,
    pub value: bool,
}

#[derive(Clone, Debug)]
pub enum PredicateActualTrace {
    Context {
        path: String,
        value: Option<serde_json::Value>,
    },
    Qualifier {
        id: String,
        trace: Box<QualifierResolutionTrace>,
    },
    Bucket {
        path: String,
        value: Option<serde_json::Value>,
        salt: String,
        start: i64,
        end: i64,
        bucket: Option<u16>,
    },
}

#[derive(Debug)]
pub struct DiagnosticCatalog {
    pub scope: DiagnosticCatalogScope,
    pub subject: String,
    pub diagnostics: Vec<DiagnosticCatalogEntry>,
}

#[derive(Debug, serde::Serialize)]
#[serde(rename_all = "lowercase")]
pub enum DiagnosticCatalogScope {
    Global,
    Workspace,
}