regecs 2.0.0-alpha-1

Rust Extended Generic ECS (REGECS)
Documentation
// Copyright (c) 2021, BlockProject 3D
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//     * Redistributions of source code must retain the above copyright notice,
//       this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright notice,
//       this list of conditions and the following disclaimer in the documentation
//       and/or other materials provided with the distribution.
//     * Neither the name of BlockProject 3D nor the names of its contributors
//       may be used to endorse or promote products derived from this software
//       without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

use bpx::sd::Object;

use crate::reflection::property1::{AsProperty, PropertyType};

pub trait PropertyConfig: CloneBox
{
    fn serialize(&self, obj: &mut bpx::sd::Object);
}

pub trait CloneBox
{
    fn clone_box(&self) -> Box<dyn PropertyConfig>;
}

impl<T: 'static + Clone + PropertyConfig> CloneBox for T
{
    fn clone_box(&self) -> Box<dyn PropertyConfig>
    {
        return Box::new(self.clone());
    }
}

#[derive(Clone)]
pub struct NumericProperty<T: 'static + Clone>
{
    pub min: T,
    pub max: T,
    pub step: T
}

impl<T: Clone + Into<bpx::sd::Value>> PropertyConfig for NumericProperty<T>
{
    fn serialize(&self, obj: &mut Object)
    {
        obj.set("min", self.min.clone().into());
        obj.set("max", self.max.clone().into());
        obj.set("step", self.step.clone().into());
    }
}

#[derive(Copy, Clone)]
pub struct StringProperty
{
    pub max_chars: u32
}

impl PropertyConfig for StringProperty
{
    fn serialize(&self, obj: &mut Object)
    {
        obj.set("max_chars", self.max_chars.into());
    }
}

impl AsProperty for String
{
    type ConfigType = StringProperty;

    fn prop_type() -> PropertyType
    {
        return PropertyType {
            type_name: "String",
            class: None
        };
    }
}

macro_rules! impl_numeric_prop_provider {
    ($($t: ty) *) => {
        $(
            impl AsProperty for $t
            {
                type ConfigType = NumericProperty<$t>;

                fn prop_type() -> PropertyType
                {
                    return PropertyType
                    {
                        type_name: stringify!($t),
                        class: None
                    }
                }
            }
        )*
    };
}

impl_numeric_prop_provider!(
    i64 u64
    i32 u32
    i16 u16
    i8 u8
    f32 f64
);