#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BindingOwner {
Element,
Component,
Slot,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BindingRole {
Event,
Cloak,
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TargetPolicy {
Dom,
Ssr,
Vapor,
}
impl TargetPolicy {
#[must_use]
pub const fn binding_is_dynamic(self, owner: BindingOwner, role: BindingRole) -> bool {
!matches!(role, BindingRole::Cloak)
&& !matches!(
(self, owner, role),
(Self::Ssr, BindingOwner::Element, BindingRole::Event)
)
}
}
pub mod dom {
use super::TargetPolicy;
pub const POLICY: TargetPolicy = TargetPolicy::Dom;
}
pub mod ssr {
use super::TargetPolicy;
pub const POLICY: TargetPolicy = TargetPolicy::Ssr;
}
pub mod vapor {
use super::TargetPolicy;
pub const POLICY: TargetPolicy = TargetPolicy::Vapor;
}
#[cfg(test)]
mod tests {
use super::{BindingOwner, BindingRole, TargetPolicy};
#[test]
fn cloak_is_compile_time_for_every_owner_and_target() {
for policy in [TargetPolicy::Dom, TargetPolicy::Ssr, TargetPolicy::Vapor] {
for owner in [
BindingOwner::Element,
BindingOwner::Component,
BindingOwner::Slot,
] {
assert!(!policy.binding_is_dynamic(owner, BindingRole::Cloak));
assert!(policy.binding_is_dynamic(owner, BindingRole::Other));
}
}
}
#[test]
fn only_ssr_native_element_events_are_omitted() {
for policy in [TargetPolicy::Dom, TargetPolicy::Ssr, TargetPolicy::Vapor] {
for owner in [
BindingOwner::Element,
BindingOwner::Component,
BindingOwner::Slot,
] {
assert_eq!(
policy.binding_is_dynamic(owner, BindingRole::Event),
!(policy == TargetPolicy::Ssr && owner == BindingOwner::Element),
);
}
}
}
}