//! Dynamic data storage and transfer types /// Owned data type, for use mostly in outputs and storage #[derive(Clone, Debug)] pub enum OwnedData { String(String), Int(i32), } impl From for OwnedData { fn from(value: String) -> Self { Self::String(value) } } impl From for OwnedData { fn from(value: i32) -> Self { Self::Int(value) } } /// Unowned data type, for inputs into runner functions #[derive(Clone, Copy)] pub enum Data<'a> { String(&'a str), Int(i32), } impl Data<'_> { /// converts itself to `OwnedData` pub fn to_owned_data(&self) -> OwnedData { match self { Data::String(s) => (*s).to_owned().into(), Data::Int(i) => (*i).into(), } } } impl<'a> From<&'a str> for Data<'a> { fn from(value: &'a str) -> Self { Self::String(value) } } impl From for Data<'_> { fn from(value: i32) -> Self { Self::Int(value) } } impl<'a> From<&'a OwnedData> for Data<'a> { fn from(value: &'a OwnedData) -> Self { match value { OwnedData::String(s) => Data::String(s), OwnedData::Int(i) => Data::Int(*i), } } }