loalang 0.1.15

Loa is a general-purpose, purely immutable, object-oriented programming language.
Documentation
use crate::pkg::APIResult;
use serde::de::DeserializeOwned;
use serde::export::PhantomData;
use serde::Serialize;
use std::fs::File;
use std::io::Write;

pub struct ManifestFile<T> {
    file_name: String,
    phantom: PhantomData<T>,
}

impl<T> ManifestFile<T> {
    pub fn new(file_name: &str) -> ManifestFile<T> {
        ManifestFile {
            file_name: file_name.into(),
            phantom: PhantomData,
        }
    }
}

impl<T> ManifestFile<T>
where
    T: Serialize + DeserializeOwned + Default,
{
    pub fn load(&self) -> APIResult<T> {
        match File::open(&self.file_name) {
            Ok(file) => Ok(serde_yaml::from_reader(file)?),
            _ => Ok(T::default()),
        }
    }

    pub fn save(&self, value: T) -> APIResult<()> {
        let mut file = File::create(&self.file_name)?;
        serde_yaml::to_writer(&mut file, &value)?;
        write!(file, "\n")?;
        Ok(())
    }

    pub fn update<R, F: FnOnce(&mut T) -> APIResult<R>>(&self, f: F) -> APIResult<R> {
        let mut value = self.load()?;
        let result = f(&mut value)?;
        self.save(value)?;
        Ok(result)
    }
}