use bitflags::bitflags;
use serde::{Deserialize, Serialize};
bitflags! {
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ShadowEdges: u8 {
const RIGHT = 0b0001;
const BOTTOM = 0b0010;
const LEFT = 0b0100;
const TOP = 0b1000;
const BOTTOM_RIGHT = Self::RIGHT.bits() | Self::BOTTOM.bits();
const TOP_LEFT = Self::LEFT.bits() | Self::TOP.bits();
const ALL = Self::RIGHT.bits() | Self::BOTTOM.bits() | Self::LEFT.bits() | Self::TOP.bits();
}
}
impl ShadowEdges {
#[inline]
pub fn has_right(self) -> bool {
self.contains(Self::RIGHT)
}
#[inline]
pub fn has_bottom(self) -> bool {
self.contains(Self::BOTTOM)
}
#[inline]
pub fn has_left(self) -> bool {
self.contains(Self::LEFT)
}
#[inline]
pub fn has_top(self) -> bool {
self.contains(Self::TOP)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_is_empty() {
assert_eq!(ShadowEdges::default(), ShadowEdges::empty());
}
#[test]
fn test_bottom_right_contains_both() {
let edges = ShadowEdges::BOTTOM_RIGHT;
assert!(edges.has_right());
assert!(edges.has_bottom());
assert!(!edges.has_left());
assert!(!edges.has_top());
}
#[test]
fn test_all_contains_all_edges() {
let edges = ShadowEdges::ALL;
assert!(edges.has_right());
assert!(edges.has_bottom());
assert!(edges.has_left());
assert!(edges.has_top());
}
#[test]
fn test_combining_edges() {
let edges = ShadowEdges::RIGHT | ShadowEdges::TOP;
assert!(edges.has_right());
assert!(edges.has_top());
assert!(!edges.has_left());
assert!(!edges.has_bottom());
}
}