maverick_os 0.1.3

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

use serde::{Serialize, Deserialize};

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

#[derive(Debug, Hash, Eq, PartialEq)]
enum Key {
    Raw(String),
    Id(TypeId)
}

#[derive(Debug, Default)]
pub struct State(HashMap<Key, Vec<u8>>);
impl State {
    pub fn set_raw(&mut self, key: String, value: Vec<u8>) {
        self.0.insert(Key::Raw(key), value);
    }
    pub fn set<F: Field + 'static>(&mut self, item: &F) {
        self.0.insert(Key::Id(TypeId::of::<F>()), serde_json::to_vec(&item).unwrap());
    }

    pub fn get_raw(&mut self, key: &str) -> Option<&Vec<u8>> {
        self.0.get(&Key::Raw(key.to_string()))
    }
    pub fn get<F: Field + 'static>(&self) -> F {
        self.0.get(&Key::Id(TypeId::of::<F>())).and_then(|b| serde_json::from_slice(b).ok()).unwrap_or_default()
    }
}