#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct HeaderFooterSet<T> {
pub default: Option<T>,
pub first: Option<T>,
pub even: Option<T>,
}
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
pub enum HeaderFooterKind {
Default,
First,
Even,
}
impl<T> HeaderFooterSet<T> {
pub fn is_empty(&self) -> bool {
self.default.is_none() && self.first.is_none() && self.even.is_none()
}
pub fn get(&self, kind: HeaderFooterKind) -> Option<&T> {
match kind {
HeaderFooterKind::Default => self.default.as_ref(),
HeaderFooterKind::First => self.first.as_ref(),
HeaderFooterKind::Even => self.even.as_ref(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_set_reports_empty() {
let s: HeaderFooterSet<&str> = HeaderFooterSet::default();
assert!(s.is_empty());
}
#[test]
fn populated_set_is_not_empty() {
let s: HeaderFooterSet<&str> = HeaderFooterSet {
default: Some("d"),
first: None,
even: None,
};
assert!(!s.is_empty());
}
#[test]
fn get_returns_each_slot() {
let s = HeaderFooterSet {
default: Some("D"),
first: Some("F"),
even: Some("E"),
};
assert_eq!(s.get(HeaderFooterKind::Default), Some(&"D"));
assert_eq!(s.get(HeaderFooterKind::First), Some(&"F"));
assert_eq!(s.get(HeaderFooterKind::Even), Some(&"E"));
}
#[test]
fn get_returns_none_for_absent_slot() {
let s: HeaderFooterSet<&str> = HeaderFooterSet {
default: Some("D"),
first: None,
even: None,
};
assert_eq!(s.get(HeaderFooterKind::First), None);
assert_eq!(s.get(HeaderFooterKind::Even), None);
}
}