multiio 0.2.3

A unified I/O orchestration library for CLI/server applications
Documentation
#![allow(unused_assignments)]

use miette::{Diagnostic, Severity};
use thiserror::Error;

use super::{AggregateError, SingleIoError};

#[derive(Debug, Error, Diagnostic)]
#[error("{message}")]
pub struct IoDiagnostic {
    pub message: String,

    #[source]
    pub source: Option<Box<dyn std::error::Error + Send + Sync>>,

    #[help]
    pub help: Option<String>,

    #[diagnostic(severity)]
    pub severity: Severity,
}

impl From<SingleIoError> for IoDiagnostic {
    fn from(e: SingleIoError) -> Self {
        IoDiagnostic {
            message: format!("[{}] on '{}'", e.stage, e.target),
            source: Some(e.error),
            help: Some("Check your I/O arguments and formats".into()),
            severity: Severity::Error,
        }
    }
}

impl From<AggregateError> for miette::Report {
    fn from(agg: AggregateError) -> Self {
        let first = agg.errors.into_iter().next();
        let diag = if let Some(e) = first {
            IoDiagnostic::from(e)
        } else {
            IoDiagnostic {
                message: "Unknown I/O error".into(),
                source: None,
                help: None,
                severity: Severity::Error,
            }
        };
        miette::Report::new(diag)
    }
}

impl From<AggregateError> for IoDiagnostic {
    fn from(agg: AggregateError) -> Self {
        let first = agg.errors.into_iter().next();
        if let Some(e) = first {
            IoDiagnostic::from(e)
        } else {
            IoDiagnostic {
                message: "Unknown I/O error".into(),
                source: None,
                help: None,
                severity: Severity::Error,
            }
        }
    }
}