pub struct Property<T: Default + AsProperty>
{
value: T,
changed: bool,
config: T::PropertyConfig
}
impl<T: Default + AsProperty> Property<T>
{
pub fn new(config: T::PropertyConfig) -> Property<T, T::PropertyConfig>
{
return Property {
value: T::default(),
changed: false,
config
};
}
pub fn get(&self) -> &T
{
return &self.value;
}
pub fn config(&self) -> &T::PropertyConfig
{
return &self.config;
}
pub fn set(&mut self, new_value: T)
{
self.value = new_value;
self.changed = true;
}
pub fn poll(&mut self) -> Option<&T>
{
if !self.changed {
return None;
} else {
self.changed = false;
return Some(&self.value);
}
}
}
pub trait Serializable
{
fn serialize(&self) -> bpx::sd::Value;
}
pub trait Deserializable
{
fn deserialize(&mut self, val: &bpx::sd::Value);
}
pub trait AsProperty : Serializable + Deserializable
{
type PropConfig : Serializable;
const PROP_TYPE_NAME: &'static str;
}
pub struct NumericProperty<T>
{
pub min: T,
pub max: T,
pub step: T
}
pub struct StringProperty
{
max_chars: u32
}
macro_rules! impl_numeric_prop_provider {
($t: ty) => {
impl AsProperty for $t
{
type PropConfig = NumericProperty<$t>;
const PROP_TYPE_NAME: &'static str = stringify!($t);
}
};
}
impl_numeric_prop_provider!(i8);
impl_numeric_prop_provider!(i16);
impl_numeric_prop_provider!(i32);
impl_numeric_prop_provider!(i64);
impl_numeric_prop_provider!(u8);
impl_numeric_prop_provider!(u16);
impl_numeric_prop_provider!(u32);
impl_numeric_prop_provider!(u64);
impl_numeric_prop_provider!(f32);
impl_numeric_prop_provider!(f64);
impl AsProperty for bool
{
type PropConfig = ();
const PROP_TYPE_NAME: &'static str = "bool";
}
impl AsProperty for String
{
type PropConfig = StringProperty;
const PROP_TYPE_NAME: &'static str = "String";
}
pub trait PropertyGroup : Serializable + Deserializable
{
fn list_properties(&self) -> Vec<(&'static str, String, bpx::sd::Value)>;
}