use-affordance 0.1.0

Affordance vocabulary primitives for RustUse UI
Documentation
#![forbid(unsafe_code)]
#![doc = include_str!("../README.md")]

/// UI affordance vocabulary.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
pub enum Affordance {
    Clickable,
    Draggable,
    Selectable,
    Expandable,
    Dismissible,
    Resizable,
    Scrollable,
    Editable,
    Sortable,
    Navigable,
}

/// A small affordance collection with duplicate prevention.
#[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);
    }
}