use std::str::FromStr;
use crate::engine::quirk::{self, Target};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DecodeQuirk {
GpsRollover(Target),
}
impl DecodeQuirk {
pub fn enable(&self) {
match self {
DecodeQuirk::GpsRollover(target) => quirk::enable_gps_rollover(target.clone()),
}
}
}
impl FromStr for DecodeQuirk {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let (name, args) = match s.split_once('=') {
Some((n, a)) => (n.trim(), Some(a)),
None => (s.trim(), None),
};
match name {
"gps-rollover" => Target::parse(args).map(DecodeQuirk::GpsRollover),
_ => Err(format!(
"unknown quirk '{name}'; the decode-time quirks are: gps-rollover"
)),
}
}
}
#[derive(Debug, Clone, Default, clap::Args)]
pub struct QuirkArgs {
#[arg(long = "quirk", value_name = "QUIRK")]
pub quirk: Vec<DecodeQuirk>,
}
impl QuirkArgs {
pub fn apply(&self) {
for q in &self.quirk {
q.enable();
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::engine::quirk::Device;
#[test]
fn parses_the_flag_forms() {
assert_eq!(
"gps-rollover".parse::<DecodeQuirk>(),
Ok(DecodeQuirk::GpsRollover(Target::Gnss))
);
assert_eq!(
"gps-rollover=all".parse::<DecodeQuirk>(),
Ok(DecodeQuirk::GpsRollover(Target::All))
);
assert_eq!(
"gps-rollover=4,1851:491603".parse::<DecodeQuirk>(),
Ok(DecodeQuirk::GpsRollover(Target::Devices(vec![
Device::Address(4),
Device::Product {
manufacturer: 1851,
unique: 491603
},
])))
);
assert!("gps-rollover=".parse::<DecodeQuirk>().is_err());
assert!("gps-rollover=vhf".parse::<DecodeQuirk>().is_err());
assert!("wmm".parse::<DecodeQuirk>().is_err());
assert!("scx20=4".parse::<DecodeQuirk>().is_err());
}
}