veloq-vis 0.4.1

Source-neutral visualization scene and SVG rendering helpers for VeloQ.
Documentation
use thiserror::Error;
use veloq_core::{ErrorCode, VeloqDiagnostic};

#[derive(Debug, Error)]
pub enum VisualizationError {
    #[error("visualization time window must be positive (start_ns={start_ns}, end_ns={end_ns})")]
    NonPositiveWindow { start_ns: i64, end_ns: i64 },

    #[error("visualization artifact path must be relative and stay under the artifact root")]
    UnsafeRelativePath,

    #[error("visualization artifact filename must be a plain `.svg` filename")]
    UnsafeSvgFileName,

    #[error("failed to create visualization artifact directory `{path}`")]
    CreateArtifactDir {
        path: String,
        #[source]
        source: std::io::Error,
    },

    #[error("failed to write visualization artifact `{path}`")]
    WriteArtifact {
        path: String,
        #[source]
        source: std::io::Error,
    },

    #[error("failed to publish visualization artifact `{path}`")]
    PublishArtifact {
        path: String,
        #[source]
        source: std::io::Error,
    },
}

impl VeloqDiagnostic for VisualizationError {
    fn code(&self) -> ErrorCode {
        match self {
            Self::NonPositiveWindow { .. } => ErrorCode::new("viz.non-positive-window"),
            Self::UnsafeRelativePath => ErrorCode::new("viz.unsafe-relative-path"),
            Self::UnsafeSvgFileName => ErrorCode::new("viz.unsafe-svg-filename"),
            Self::CreateArtifactDir { .. } => ErrorCode::new("viz.artifact-dir-create"),
            Self::WriteArtifact { .. } => ErrorCode::new("viz.artifact-write"),
            Self::PublishArtifact { .. } => ErrorCode::new("viz.artifact-publish"),
        }
    }
}