use serde::Deserialize;
use log::debug;
pub mod buddhabrot;
pub mod debug;
pub mod julia_set;
pub mod util;
use crate::buddhabrot::Buddhabrot;
use crate::debug::ColorMap1dRenderer;
use crate::julia_set::JuliaSet;
#[derive(Deserialize)]
pub struct Algorithm {
#[serde(flatten)]
algorithm: AlgorithmInner,
filename: String,
}
#[derive(Deserialize)]
#[serde(tag = "algorithm")]
#[serde(rename_all = "snake_case")]
pub enum AlgorithmInner {
JuliaSet(JuliaSet),
Buddhabrot(Buddhabrot),
#[serde(rename = "debug.color_map_1d")]
ColorMap1dRenderer(ColorMap1dRenderer),
}
impl Algorithm {
#[must_use]
pub fn julia_set(julia_set: JuliaSet, filename: String) -> Self {
Self {
algorithm: AlgorithmInner::JuliaSet(julia_set),
filename,
}
}
#[must_use]
pub fn buddhabrot(
buddhabrot: Buddhabrot,
filename: String,
) -> Self {
Self {
algorithm: AlgorithmInner::Buddhabrot(buddhabrot),
filename,
}
}
#[must_use]
pub fn color_map_1d_renderer(
color_map_1d_renderer: ColorMap1dRenderer,
filename: String,
) -> Self {
Self {
algorithm: AlgorithmInner::ColorMap1dRenderer(
color_map_1d_renderer,
),
filename,
}
}
pub fn create(self) {
match self.algorithm {
AlgorithmInner::JuliaSet(j) => {
debug!("generating julia:\n{}", j);
j.creator().create().save_as_image(&self.filename);
}
AlgorithmInner::Buddhabrot(b) => {
debug!("generating buddhabrot: \n{}", b);
b.creator().create().save_as_image(&self.filename);
}
AlgorithmInner::ColorMap1dRenderer(c) => {
debug!("generating 1d color map:\n{}", c);
c.creator().create().save_as_image(&self.filename);
}
}
}
}
#[derive(Deserialize)]
pub struct Algorithms(Vec<Algorithm>);
impl Algorithms {
#[must_use]
pub fn new(algorithms: Vec<Algorithm>) -> Self {
Self(algorithms)
}
pub fn create(self) {
for cmd in self.0 {
cmd.create();
}
}
}