omg_serde 0.1.0

Adds serde support to omg_core.
Documentation
use crate::data::math::selector::ColorSelectorSerde;
use anyhow::{Context, Result};
use omg_core::data::math::selector::ColorSelector;
use omg_core::interface::selector::SelectorStorage;
use std::fs;
use std::fs::File;
use std::io::Write;

#[derive(new)]
pub struct SelectorStorageWithSerde;

impl SelectorStorageWithSerde {
    pub fn inner_read(&self, path: &str) -> Result<ColorSelector> {
        let string = fs::read_to_string(path)?;
        let data: ColorSelectorSerde = serde_yaml::from_str(&string)?;
        data.try_convert()
    }

    pub fn inner_write(&self, selector: &ColorSelector, path: &str) -> Result<()> {
        let mut file = File::create(path)?;

        let data: ColorSelectorSerde = selector.into();
        let s = serde_yaml::to_string(&data)?;

        file.write_all(s.as_bytes())?;

        Ok(())
    }
}

impl SelectorStorage for SelectorStorageWithSerde {
    fn read(&self, path: &str) -> Result<ColorSelector> {
        self.inner_read(path)
            .with_context(|| format!("Failed to read selector from '{}'", path))
    }

    fn write(&self, selector: &ColorSelector, path: &str) -> Result<()> {
        self.inner_write(selector, path)
            .with_context(|| format!("Failed to write selector to '{}'", path))
    }
}