use std::collections::HashMap; use serde_json::{json, Value}; use crate::{ parameter::Parameter, PResult, perr }; #[derive(Debug, PartialEq, Eq, Clone, Hash)] pub struct EntityType(pub String); #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] pub enum SaveOption { Default, False, Always } #[derive(Debug, Clone, PartialEq)] pub struct Template { pub name: EntityType, pub args: Vec, pub kwargs: HashMap, pub save: SaveOption, } impl Template { pub fn new(name: &str, kwargs: HashMap) -> Self { Self { name: EntityType(name.to_string()), args: Vec::new(), kwargs, save: SaveOption::Default } } pub fn empty(name: &str) -> Self { Self::new(name, HashMap::new()) } pub fn should_save(&self) -> bool { match self.save { SaveOption::Default | SaveOption::Always => true, SaveOption::False => false } } pub fn from_entity_type(typ: EntityType) -> Self { Self { name: typ, args: Vec::new(), kwargs: HashMap::new(), save: SaveOption::Default } } pub fn unsaved(mut self) -> Self { if self.save == SaveOption::Default { self.save = SaveOption::False } self } pub fn merge(mut self, other: Template) -> Self { if self.save == SaveOption::Default { self.save = other.save; } for (key, value) in other.kwargs { self.kwargs.entry(key).or_insert(value); } self } pub fn from_json(v: &Value) -> PResult