photonic-dynamic 0.1.1

Dynamic light controller and animator
Documentation
use serde::de::DeserializeOwned;

use photonic::attr::Bounded;
use photonic::{input, AttrValue};

use crate::factory::{BoundAttrFactory, FreeAttrFactory, NodeFactory, OutputFactory};

#[allow(unused_variables)]
pub trait Registry {
    fn node<Reg: Registry>(kind: &str) -> Option<NodeFactory<Reg>> {
        None
    }

    fn free_attr<Reg: Registry, V>(kind: &str) -> Option<FreeAttrFactory<Reg, V>>
    where V: AttrValue + DeserializeOwned + input::Coerced {
        None
    }

    fn bound_attr<Reg: Registry, V>(kind: &str) -> Option<BoundAttrFactory<Reg, V>>
    where V: AttrValue + DeserializeOwned + input::Coerced + Bounded {
        None
    }

    fn output<Reg: Registry>(kind: &str) -> Option<OutputFactory<Reg>> {
        None
    }
}

#[macro_export]
macro_rules! combine {
    ($f:ident, $kind:expr, ()) => { None };
    ($f:ident, $kind:expr, ($r1:ty)) => {
        <$r1>::$f($kind)
    };
    ($f:ident, $kind:expr, ($r1:ty, $($r2:ty),+)) => {
        ::core::option::Option::or_else(
            combine!($f, $kind, ($r1)),
            || combine!($f, $kind, ($($r2),+)))
    };
}