cco 0.2.0

cascading configuration
Documentation
mod err;
mod eval;
mod expression;
mod value;

pub use crate::eval::Cco;
pub use err::{Error, ErrorKind};
pub use value::{Value, ValueKind};

#[derive(Clone)]
pub struct Document {
    pub source: String,
    pub file_name: FileName,
}

impl Document {
    pub fn new(source: String) -> Self {
        Self {
            file_name: FileName::HclExpression,
            source,
        }
    }

    pub fn new_file(source: String, file_path: std::path::PathBuf) -> Self {
        Self {
            file_name: FileName::File(file_path),
            source,
        }
    }

    pub fn name(&self) -> String {
        match &self.file_name {
            FileName::File(path) => path.to_str().unwrap_or("<invalid utf-8>").to_string(),
            FileName::HclExpression => "hcl expression".to_string(),
        }
    }
}

impl PartialEq for Document {
    fn eq(&self, other: &Self) -> bool {
        match (&self.file_name, &other.file_name) {
            (FileName::File(a), FileName::File(b)) => a == b,
            (FileName::HclExpression, FileName::HclExpression) => true,
            _ => false,
        }
    }
}

#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum FileName {
    HclExpression,
    File(std::path::PathBuf),
}

#[derive(Default, Debug)]
pub struct LoadOptions {
    pub format: LoadFormat,
    pub mode: LoadMode,
}

#[derive(Default, Debug)]
pub enum LoadFormat {
    #[default]
    Hcl,
}

#[derive(Default, Debug)]
pub enum LoadMode {
    #[default]
    Root,
    SubKey(String),
}