omg_serde 0.1.0

Adds serde support to omg_core.
Documentation
use crate::generation::step::{get_attribute_id, FromStep, ToStep};
use anyhow::{Context, Result};
use omg_core::generation::attributes::modify::ModifyWithAttributeStep;
use serde::{Deserialize, Serialize};

#[derive(new, Debug, Serialize, Deserialize)]
pub struct ModifyWithAttributeStepSerde {
    source: String,
    target: String,
    percentage: i32,
    minimum: u8,
}

impl ToStep<ModifyWithAttributeStep> for ModifyWithAttributeStepSerde {
    fn try_convert(self, attributes: &mut Vec<String>) -> Result<ModifyWithAttributeStep> {
        let source_id = get_attribute_id(&self.source, attributes)
            .context("Failed to convert source of ModifyWithAttributeStep!")?;
        let target_id = get_attribute_id(&self.target, attributes)
            .context("Failed to convert target of ModifyWithAttributeStep!")?;

        Ok(ModifyWithAttributeStep::new(
            source_id,
            target_id,
            self.percentage,
            self.minimum,
        ))
    }
}

impl FromStep<ModifyWithAttributeStepSerde> for ModifyWithAttributeStep {
    fn convert(&self, attributes: &mut Vec<String>) -> ModifyWithAttributeStepSerde {
        let source = attributes[self.source_id()].clone();
        let target = attributes[self.target_id()].clone();
        ModifyWithAttributeStepSerde {
            source,
            target,
            percentage: self.percentage(),
            minimum: self.minimum(),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::generation::step::assert_eq;

    #[test]
    fn test_conversion() {
        let mut attributes = vec!["a".to_string(), "b".to_string()];
        let step = ModifyWithAttributeStep::new(1, 0, 50, 10);

        assert_eq(step, &mut attributes);
    }
}