use crate::constants::MARKERS;
#[derive(Debug, Copy, Clone)]
pub struct Marker {
pub(crate) expected_counterpart: char,
}
impl Marker {
pub fn new(marker: &char) -> Option<Self> {
for included_marker in MARKERS {
if *marker == included_marker {
if *marker == '{' {
return Some(Self {
expected_counterpart: '}',
});
}
if *marker == '[' {
return Some(Self {
expected_counterpart: ']',
});
}
}
}
None
}
pub fn is_counter_part(&self, marker: &char) -> bool {
self.expected_counterpart == *marker
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_marker_new() {
let marker = Marker::new(&'{');
assert!(marker.is_some());
assert_eq!(marker.unwrap().expected_counterpart, '}');
let marker = Marker::new(&'[');
assert!(marker.is_some());
assert_eq!(marker.unwrap().expected_counterpart, ']');
let marker = Marker::new(&'x');
assert!(marker.is_none());
}
#[test]
fn test_marker_is_counter_part() {
let marker = Marker::new(&'{').unwrap();
assert!(marker.is_counter_part(&'}'));
assert!(!marker.is_counter_part(&']'));
let marker = Marker::new(&'[').unwrap();
assert!(marker.is_counter_part(&']'));
assert!(!marker.is_counter_part(&'}'));
}
}