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!()
}
}