layoutcss_parser/
media_query.rsuse std::cmp::Ordering;
#[derive(Debug, Hash, PartialEq, Eq, Clone)]
pub enum MediaQuery {
SuperiorTo(usize, String),
InferiorOrEqualTo(usize),
}
impl MediaQuery {
pub fn get_breakpoint(&self) -> &usize {
match self {
Self::SuperiorTo(breakpoint, _) => breakpoint,
Self::InferiorOrEqualTo(breakpoint) => breakpoint,
}
}
}
impl PartialOrd for MediaQuery {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other)) }
}
impl Ord for MediaQuery {
fn cmp(&self, other: &Self) -> Ordering {
match (self, other) {
(MediaQuery::SuperiorTo(_, _), MediaQuery::InferiorOrEqualTo(_)) => Ordering::Greater,
(MediaQuery::InferiorOrEqualTo(_), MediaQuery::SuperiorTo(_, _)) => Ordering::Less,
(MediaQuery::SuperiorTo(a, _), MediaQuery::SuperiorTo(b, _)) => b.cmp(a),
(MediaQuery::InferiorOrEqualTo(a), MediaQuery::InferiorOrEqualTo(b)) => b.cmp(a),
}
}
}
pub fn extract_breakpoint(input: &str) -> Option<usize> {
if input.len() <= "layoutpx".len() {
return None;
}
let number_part = &input[6..input.len() - 2]; return number_part.parse::<usize>().ok();
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn extract_breakpoint_with_nothing_after_at() {
let bp = extract_breakpoint("layout@");
assert_eq!(bp, None)
}
#[test]
fn extract_breakpoint_without_at_cool() {
let bp = extract_breakpoint("layout600px");
assert_eq!(bp, Some(600))
}
#[test]
fn extract_breakpoint_from_correct_mq() {
let bp = extract_breakpoint("layout@600px");
assert_eq!(bp, None)
}
}