use crate::display_elements::{DisplayColor, DisplayFormat}; pub enum Operation { UpdateContext(ContextUpdate), AddEmpty, AddSignal(String), } pub enum ContextUpdate { UpdateColor(Option), UpdateFormat(DisplayFormat), SetOmit(bool), Reset, } pub struct CommentParser {} impl CommentParser { pub fn parse_comment(comment: &str) -> Vec { comment .split(['\n', ','].as_ref()) .map(|token| Self::parse_token(token)) .filter(|operation| operation.is_some()) .into_iter() .map(|operation| operation.unwrap()) .collect() } fn parse_token(token: &str) -> Option { Some(match token { "omit" => Operation::UpdateContext(ContextUpdate::SetOmit(true)), "empty" => Operation::AddEmpty, "reset" => Operation::UpdateContext(ContextUpdate::Reset), _ if token.starts_with("add signal ") => { Operation::AddSignal(token["add signal ".len()..].to_owned()) } _ if token.starts_with("format ") => Operation::UpdateContext( ContextUpdate::UpdateFormat(Self::parse_format(&token["format ".len()..])), ), _ if token.starts_with("color ") => Operation::UpdateContext( ContextUpdate::UpdateColor(Self::parse_color(&token["color ".len()..])), ), _ => return None, }) } fn parse_format(format: &str) -> DisplayFormat { match format { "hex" => DisplayFormat::Hex, "decimal" => DisplayFormat::Decimal, "signed decimal" => DisplayFormat::SignedDecimal, "binary" => DisplayFormat::Binary, _ => DisplayFormat::Decimal, } } fn parse_color(color: &str) -> Option { Some(match color { "normal" => DisplayColor::Normal, "red" => DisplayColor::Red, "orange" => DisplayColor::Orange, "yellow" => DisplayColor::Yellow, "green" => DisplayColor::Green, "blue" => DisplayColor::Blue, "Indigo" => DisplayColor::Indigo, "Violet" => DisplayColor::Violet, "Cycle" => DisplayColor::Cycle, _ => return None, }) } }