#![allow(missing_docs)]
use bitflags::bitflags;
#[cfg(feature = "derive")]
pub use fav_derive::Status;
pub trait Status {
fn status(&self) -> StatusFlags;
fn check_status(&self, status: StatusFlags) -> bool;
fn set_status(&mut self, status: StatusFlags);
fn on_status(&mut self, status: StatusFlags);
fn off_status(&mut self, status: StatusFlags);
}
bitflags! {
pub struct StatusFlags: i32 {
const FETCHED = 0b00001;
const TRACK = 0b00010;
const SAVED = 0b00100;
const FAV = 0b01000;
const EXPIRED = 0b10000;
}
}
impl From<i32> for StatusFlags {
fn from(value: i32) -> Self {
StatusFlags::from_bits_retain(value)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate as fav_core;
#[derive(Status, Default)]
struct StatusTest {
status: i32,
}
#[test]
fn status_flags_test() {
let mut status = StatusFlags::empty();
status.insert(StatusFlags::FETCHED);
assert!(status.intersects(StatusFlags::FETCHED));
assert_eq!(status.bits(), 1);
status.insert(StatusFlags::TRACK);
assert_eq!(status.bits(), 3);
}
#[test]
fn status_test() {
let mut status = StatusTest::default();
status.on_status(StatusFlags::FETCHED);
assert!(status.check_status(StatusFlags::FETCHED));
status.off_status(StatusFlags::FETCHED);
assert!(!status.check_status(StatusFlags::FETCHED));
status.on_status(StatusFlags::FETCHED);
status.on_status(StatusFlags::SAVED);
assert!(status.check_status(StatusFlags::FETCHED));
assert!(status.check_status(StatusFlags::SAVED));
}
}