omg_serde 0.1.0

Adds serde support to omg_core.
Documentation
use crate::data::math::generator::generator2d::Generator2dSerde;
use crate::generation::step::{get_attribute_id, FromStep, ToStep};
use anyhow::{Context, Result};
use omg_core::generation::attributes::distortion2d::Distortion2dStep;
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
pub struct Distortion2dStepSerde {
    attribute: String,
    generator_x: Generator2dSerde,
    generator_y: Generator2dSerde,
}

impl ToStep<Distortion2dStep> for Distortion2dStepSerde {
    fn try_convert(self, attributes: &mut Vec<String>) -> Result<Distortion2dStep> {
        let id = get_attribute_id(&self.attribute, attributes)
            .context("Failed to convert attribute of Distortion2dStep!")?;
        let generator_x = self
            .generator_x
            .try_convert()
            .context("Failed to convert generator_x of Distortion2dStep!")?;
        let generator_y = self
            .generator_y
            .try_convert()
            .context("Failed to convert generator_y of Distortion2dStep!")?;

        Ok(Distortion2dStep::new(id, generator_x, generator_y))
    }
}

impl FromStep<Distortion2dStepSerde> for Distortion2dStep {
    fn convert(&self, attributes: &mut Vec<String>) -> Distortion2dStepSerde {
        let attribute = attributes[self.attribute_id()].clone();
        Distortion2dStepSerde {
            attribute,
            generator_x: self.generator_x().into(),
            generator_y: self.generator_y().into(),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::generation::step::assert_eq;
    use omg_core::data::math::generator::generator2d::Generator2d::IndexGenerator;
    use omg_core::data::math::size2d::Size2d;

    #[test]
    fn test_conversion() {
        let mut attributes = vec!["test".to_string()];
        let generator_x = IndexGenerator(Size2d::unchecked(1, 2));
        let generator_y = IndexGenerator(Size2d::unchecked(3, 4));
        let step = Distortion2dStep::new(0, generator_x, generator_y);

        assert_eq(step, &mut attributes);
    }
}