use tastty_core::ClipboardTarget;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum OscPolicy {
Allow,
Deny,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct PerTargetPolicy {
pub clipboard: OscPolicy,
pub primary: OscPolicy,
pub secondary: OscPolicy,
pub select: OscPolicy,
pub cut_buffer: OscPolicy,
}
impl PerTargetPolicy {
#[must_use]
pub const fn allow_all() -> Self {
Self {
clipboard: OscPolicy::Allow,
primary: OscPolicy::Allow,
secondary: OscPolicy::Allow,
select: OscPolicy::Allow,
cut_buffer: OscPolicy::Allow,
}
}
#[must_use]
pub const fn deny_all() -> Self {
Self {
clipboard: OscPolicy::Deny,
primary: OscPolicy::Deny,
secondary: OscPolicy::Deny,
select: OscPolicy::Deny,
cut_buffer: OscPolicy::Deny,
}
}
#[must_use]
pub fn for_target(self, target: ClipboardTarget) -> OscPolicy {
match target {
ClipboardTarget::Clipboard => self.clipboard,
ClipboardTarget::Primary => self.primary,
ClipboardTarget::Secondary => self.secondary,
ClipboardTarget::Select => self.select,
ClipboardTarget::CutBuffer(_) => self.cut_buffer,
}
}
pub(crate) fn set(&mut self, target: ClipboardTarget, policy: OscPolicy) {
match target {
ClipboardTarget::Clipboard => self.clipboard = policy,
ClipboardTarget::Primary => self.primary = policy,
ClipboardTarget::Secondary => self.secondary = policy,
ClipboardTarget::Select => self.select = policy,
ClipboardTarget::CutBuffer(_) => self.cut_buffer = policy,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct ClipboardPolicy {
pub read: PerTargetPolicy,
pub write: PerTargetPolicy,
}
impl Default for ClipboardPolicy {
fn default() -> Self {
Self {
read: PerTargetPolicy::deny_all(),
write: PerTargetPolicy::allow_all(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_read_deny_write_allow() {
let policy = ClipboardPolicy::default();
assert_eq!(
policy.read.for_target(ClipboardTarget::Clipboard),
OscPolicy::Deny,
);
assert_eq!(
policy.write.for_target(ClipboardTarget::Clipboard),
OscPolicy::Allow,
);
}
#[test]
fn cut_buffer_field_covers_every_index() {
let mut policy = PerTargetPolicy::allow_all();
policy.cut_buffer = OscPolicy::Deny;
for index in 0u8..=7 {
assert_eq!(
policy.for_target(ClipboardTarget::CutBuffer(index)),
OscPolicy::Deny,
);
}
}
#[test]
fn set_writes_back_through_for_target() {
let mut policy = PerTargetPolicy::deny_all();
policy.set(ClipboardTarget::Primary, OscPolicy::Allow);
assert_eq!(
policy.for_target(ClipboardTarget::Primary),
OscPolicy::Allow,
);
assert_eq!(
policy.for_target(ClipboardTarget::Clipboard),
OscPolicy::Deny,
);
}
}