#![forbid(unsafe_code)]
#![doc = include_str!("../README.md")]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
pub enum Affordance {
Clickable,
Draggable,
Selectable,
Expandable,
Dismissible,
Resizable,
Scrollable,
Editable,
Sortable,
Navigable,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct AffordanceSet {
affordances: Vec<Affordance>,
}
impl AffordanceSet {
pub fn new(affordances: Vec<Affordance>) -> Self {
let mut set = Self::default();
for affordance in affordances {
set.insert(affordance);
}
set
}
pub fn insert(&mut self, affordance: Affordance) {
if !self.contains(affordance) {
self.affordances.push(affordance);
}
}
pub fn contains(&self, affordance: Affordance) -> bool {
self.affordances.contains(&affordance)
}
pub fn affordances(&self) -> &[Affordance] {
&self.affordances
}
}
#[cfg(test)]
mod tests {
use super::{Affordance, AffordanceSet};
#[test]
fn checks_affordance_set_membership() {
let mut set = AffordanceSet::new(vec![Affordance::Clickable, Affordance::Expandable]);
set.insert(Affordance::Clickable);
set.insert(Affordance::Dismissible);
assert!(set.contains(Affordance::Clickable));
assert!(set.contains(Affordance::Dismissible));
assert!(!set.contains(Affordance::Sortable));
assert_eq!(set.affordances().len(), 3);
}
}