willdo 0.0.1

Task manager with DAG
Documentation
use serde_content::Value;

use crate::{config::ConfigurationEntry, job::Relation};

#[derive(Debug, Default)]
pub struct CfgDump {
    pub dump: Vec<CfgDumpEntry>,
}

impl CfgDump {
    pub fn dump<E: ConfigurationEntry>(entry: E) -> Vec<CfgDumpEntry> {
        let mut dump = CfgDump::default();
        entry.configure(&mut dump).expect("dumped");
        dump.dump
    }
}

#[derive(Debug, PartialEq, PartialOrd)]
pub enum CfgDumpEntry {
    Project {
        namespace: Vec<Box<str>>,
        name: Box<str>,
        source: url::Url,
    },
    Interpretter {
        namespace: Vec<Box<str>>,
        name: Box<str>,
        source: Box<str>,
        provider: Box<str>,
        spec: Value<'static>,
    },
    Job {
        namespace: Vec<Box<str>>,
        name: Box<str>,
        source: Box<str>,
        script: Vec<Box<str>>,
        interpretter: Option<Box<str>>,
        relations: Vec<Relation>,
    },
}

impl crate::config::Configuration for CfgDump {
    type Error = Never;

    fn configure_project(
        &mut self,
        namespace: &[Box<str>],
        name: Box<str>,
        source: url::Url,
    ) -> Result<(), Self::Error> {
        self.dump.push(CfgDumpEntry::Project {
            namespace: namespace.to_vec(),
            name,
            source,
        });
        Ok(())
    }

    fn configure_interpretter(
        &mut self,
        namespace: &[Box<str>],
        name: Box<str>,
        source: Box<str>,
        provider: Box<str>,
        spec: Value<'static>,
    ) -> Result<(), Self::Error> {
        self.dump.push(CfgDumpEntry::Interpretter {
            namespace: namespace.to_vec(),
            name,
            source,
            provider,
            spec,
        });
        Ok(())
    }

    fn configure_job(
        &mut self,
        namespace: &[Box<str>],
        name: Box<str>,
        source: Box<str>,
        script: Vec<Box<str>>,
        interpretter: Option<Box<str>>,
        relations: Vec<Relation>,
    ) -> Result<(), Self::Error> {
        self.dump.push(CfgDumpEntry::Job {
            namespace: namespace.to_vec(),
            name,
            source,
            script,
            interpretter,
            relations,
        });
        Ok(())
    }
}

#[derive(Debug)]
pub enum Never {}
impl core::error::Error for Never {}
impl core::fmt::Display for Never {
    fn fmt(&self, _f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        unreachable!()
    }
}