fcomm 0.2.0

Functional commitments with Lurk
Documentation
use std::fs::create_dir_all;
use std::io::Error;
use std::marker::PhantomData;
use std::path::{Path, PathBuf};

use crate::FileStore;

pub fn data_dir() -> PathBuf {
    match std::env::var("FCOMM_DATA_PATH") {
        Ok(name) => name.into(),
        Err(_) => PathBuf::from("/var/tmp/fcomm_data/"),
    }
}

pub struct FileMap<K: ToString, V: FileStore> {
    dir: PathBuf,
    _t: PhantomData<(K, V)>,
}

impl<K: ToString, V: FileStore> FileMap<K, V> {
    pub fn new<P: AsRef<Path>>(name: P) -> Result<Self, Error> {
        let data_dir = data_dir();
        let dir = PathBuf::from(&data_dir).join(name.as_ref());
        create_dir_all(&dir)?;

        Ok(Self {
            dir,
            _t: Default::default(),
        })
    }

    fn key_path(&self, key: &K) -> PathBuf {
        self.dir.join(PathBuf::from(key.to_string()))
    }

    pub fn get(&self, key: &K) -> Option<V> {
        self.key_path(key);
        V::read_from_path(self.key_path(key)).ok()
    }

    pub fn set(&self, key: K, data: &V) -> Result<(), Error> {
        data.write_to_path(self.key_path(&key));
        Ok(())
    }
}