pub use callback::Callback;
mod callback;
#[derive(Debug, Clone, PartialEq)]
pub struct Attribute<NS, ATT, VAL, EVENT, MSG> {
pub(crate) namespace: Option<NS>,
pub(crate) name: ATT,
pub(crate) value: AttValue<VAL, EVENT, MSG>,
}
#[derive(Debug, Clone)]
pub enum AttValue<VAL, EVENT, MSG> {
Plain(VAL),
Callback(Callback<EVENT, MSG>),
}
impl<VAL, EVENT, MSG> PartialEq for AttValue<VAL, EVENT, MSG>
where
VAL: PartialEq,
{
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(AttValue::Plain(val), AttValue::Plain(other)) => *val == *other,
_ => true,
}
}
}
impl<VAL, EVENT, MSG> From<VAL> for AttValue<VAL, EVENT, MSG> {
fn from(value: VAL) -> Self {
AttValue::Plain(value)
}
}
impl<NS, ATT, VAL, EVENT, MSG> Attribute<NS, ATT, VAL, EVENT, MSG> {
pub fn new(namespace: Option<NS>, name: ATT, value: VAL) -> Self {
Attribute {
name,
value: AttValue::from(value),
namespace,
}
}
pub fn name(&self) -> &ATT {
&self.name
}
pub fn value(&self) -> &AttValue<VAL, EVENT, MSG> {
&self.value
}
pub fn namespace(&self) -> Option<&NS> {
self.namespace.as_ref()
}
}
impl<NS, ATT, VAL, EVENT, MSG> Attribute<NS, ATT, VAL, EVENT, MSG>
where
EVENT: 'static,
MSG: 'static,
{
pub fn map_callback<MSG2>(self, cb: Callback<MSG, MSG2>) -> Attribute<NS, ATT, VAL, EVENT, MSG2>
where
MSG2: 'static,
{
Attribute {
name: self.name,
value: self.value.map_callback(cb),
namespace: self.namespace,
}
}
pub fn get_callback(&self) -> Option<&Callback<EVENT, MSG>> {
self.value.get_callback()
}
}
impl<VAL, EVENT, MSG> AttValue<VAL, EVENT, MSG>
where
EVENT: 'static,
MSG: 'static,
{
pub fn map_callback<MSG2>(self, cb: Callback<MSG, MSG2>) -> AttValue<VAL, EVENT, MSG2>
where
MSG2: 'static,
{
match self {
AttValue::Plain(plain) => AttValue::Plain(plain),
AttValue::Callback(att_cb) => AttValue::Callback(att_cb.map_callback(cb)),
}
}
pub fn get_callback(&self) -> Option<&Callback<EVENT, MSG>> {
match self {
AttValue::Plain(_) => None,
AttValue::Callback(cb) => Some(cb),
}
}
}
pub fn on<NS, ATT, VAL, EVENT, MSG>(
name: ATT,
cb: Callback<EVENT, MSG>,
) -> Attribute<NS, ATT, VAL, EVENT, MSG> {
Attribute {
namespace: None,
name,
value: AttValue::Callback(cb),
}
}
#[inline]
pub fn attr<NS, ATT, VAL, EVENT, MSG>(
name: ATT,
value: VAL,
) -> Attribute<NS, ATT, VAL, EVENT, MSG> {
attr_ns(None, name, value)
}
#[inline]
pub fn attr_ns<NS, ATT, VAL, EVENT, MSG>(
namespace: Option<NS>,
name: ATT,
value: VAL,
) -> Attribute<NS, ATT, VAL, EVENT, MSG> {
Attribute::new(namespace, name, value)
}