use vize_l0::config::VueVersion;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct LegacyCaps {
pub supports_filters: bool,
pub scoped_slot_attrs: bool,
pub v2_event_sugar: bool,
}
impl LegacyCaps {
pub const VUE3: Self = Self {
supports_filters: false,
scoped_slot_attrs: false,
v2_event_sugar: false,
};
#[must_use]
pub const fn for_version(version: VueVersion) -> Self {
let caps = super::LegacyDialectCapabilities::for_dialect(version);
Self {
supports_filters: caps.supports_filters,
scoped_slot_attrs: caps.scoped_slot_attrs,
v2_event_sugar: caps.v2_event_sugar,
}
}
#[must_use]
pub const fn needs_sugar(self) -> bool {
self.supports_filters || self.scoped_slot_attrs || self.v2_event_sugar
}
}
#[cfg(test)]
mod tests {
use super::LegacyCaps;
use vize_l0::config::VueVersion;
#[test]
fn vue3_is_every_flag_off() {
let caps = LegacyCaps::for_version(VueVersion::V3);
assert_eq!(caps, LegacyCaps::VUE3);
assert!(!caps.needs_sugar());
}
#[test]
fn vue2_and_vue2_7_share_the_template_sugar() {
let v2 = LegacyCaps::for_version(VueVersion::V2);
let v2_7 = LegacyCaps::for_version(VueVersion::V2_7);
assert_eq!(v2, v2_7);
assert!(v2.supports_filters && v2.scoped_slot_attrs && v2.v2_event_sugar);
assert!(v2.needs_sugar());
}
#[test]
fn vue1_keeps_filters_only() {
let v1 = LegacyCaps::for_version(VueVersion::V1);
assert!(v1.supports_filters);
assert!(!v1.scoped_slot_attrs && !v1.v2_event_sugar);
assert!(v1.needs_sugar());
}
#[test]
fn every_supported_line_preserves_the_legalization_contract() {
let expected = [
(VueVersion::V0_10, (true, false, false)),
(VueVersion::V0_11, (true, false, false)),
(VueVersion::V1, (true, false, false)),
(VueVersion::V2, (true, true, true)),
(VueVersion::V2_7, (true, true, true)),
(VueVersion::V3, (false, false, false)),
];
for (version, expected) in expected {
let caps = LegacyCaps::for_version(version);
assert_eq!(
(
caps.supports_filters,
caps.scoped_slot_attrs,
caps.v2_event_sugar
),
expected,
"{}",
version.as_str(),
);
}
assert_eq!(core::mem::size_of::<LegacyCaps>(), 3);
}
}