maverick_os 0.1.1

Maverick OS
use std::collections::HashMap;
use std::fmt::Debug;

use serde::{Serialize, Deserialize};

pub trait Field: Serialize + for<'a> Deserialize <'a> + Default + Debug {
    fn ident() -> String where Self: Sized + 'static {
        std::any::type_name::<Self>().to_string()
    }
    fn to_bytes(&self) -> Vec<u8> {serde_json::to_vec(self).unwrap()}
    fn from_bytes(bytes: &[u8]) -> Self where Self: Sized {
        serde_json::from_slice(bytes).unwrap_or_default()
    }
}

impl<I: Serialize + for<'a> Deserialize <'a> + Default + Debug> Field for I {}


#[derive(Debug, Default, Serialize, Deserialize)]
pub struct State(HashMap<String, Vec<u8>>);
impl State {
    pub fn set<F: Field + 'static>(&mut self, item: &F) {
        self.0.insert(F::ident(), item.to_bytes());
    }
    pub fn get<F: Field + 'static>(&self) -> F {
        self.0.get(&F::ident()).map(|b| F::from_bytes(b)).unwrap_or_default()
    }
}