envshield 0.0.2

Define a schema for your .env files.
use serde::{Deserialize, Serialize};

#[derive(Debug, Deserialize, Serialize, thiserror::Error)]
pub enum ShieldError {
    #[error("unresolved reference")]
    UnresolvedReference,

    #[error("key [{0}] contains a reference which points to itself")]
    CyclicReference(String),

    #[error("key [{0}] contains a reference that doesn't exist")]
    MissingReference(String),

    #[error("key [{0}] contains reference '{1}' that doesn't exist")]
    MissingReferenceExtended(String, String),

    #[error("key [{0}] contains a reference to '{1}', but '{1}' can't resolve that reference")]
    DeadEndReference(String, String),

    #[error("parsing: {0}")]
    ReferenceParsing(String),

    #[error("with schema: {0}")]
    Unrecoverable(String),

    #[error("could not find schema file: {0}")]
    MissingSchema(String),

    #[error("invalid schema: {0}")]
    InvalidSchema(String),

    #[error("toml validation: {0}")]
    TomlValidation(String),
}

impl From<std::io::Error> for ShieldError {
    fn from(value: std::io::Error) -> Self {
        match value.kind() {
            std::io::ErrorKind::NotFound => ShieldError::MissingSchema(value.to_string()),
            _ => ShieldError::Unrecoverable(value.to_string()),
        }
    }
}

impl From<toml::de::Error> for ShieldError {
    fn from(value: toml::de::Error) -> Self {
        ShieldError::TomlValidation(value.to_string())
    }
}