add(parser): FieldFifoInterface and custom bool (YES/Y/NO/N) parser

This commit is contained in:
Wataru Otsubo 2025-01-30 19:53:03 +09:00
parent e7d3e5c90b
commit 51a074d2c0

View file

@ -4,6 +4,7 @@ use std::any;
pub(crate) use parse_prefixed_u32::ParsePrefixedU32;
pub use parse_prefixed_u32::ParsePrefixedU32Error;
pub(crate) use parse_custom_bool::ParseCustomBool;
use thiserror::Error;
#[derive(Debug, Error, PartialEq)]
@ -149,3 +150,59 @@ mod parse_rw_specifier {
}
}
}
mod parse_field_fifo_interface {
use std::str::FromStr;
use crate::types::FieldFifoInterface;
use super::ParseEnumError;
impl FromStr for FieldFifoInterface {
type Err = ParseEnumError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"Vector" => Ok(Self::Vector),
"Block" => Ok(Self::Block),
"Both" => Ok(Self::Both),
s => Err(ParseEnumError::invalid_variant::<Self>(s.to_string())),
}
}
}
}
mod parse_custom_bool {
use super::ParseEnumError;
pub(crate) trait ParseCustomBool {
fn parse_custom_bool(self) -> Result<bool, ParseEnumError>;
}
impl ParseCustomBool for &str {
fn parse_custom_bool(self) -> Result<bool, ParseEnumError> {
match self {
"YES" | "Y" => Ok(true),
"NO" | "N" => Ok(false),
s => Err(ParseEnumError::invalid_variant::<bool>(s.to_string())),
}
}
}
#[cfg(test)]
mod test {
use super::{ParseCustomBool, ParseEnumError};
#[test]
fn parse_prefixed_u32() {
assert_eq!("YES".parse_custom_bool(), Ok(true));
assert_eq!("NO".parse_custom_bool(), Ok(false));
assert_eq!(
"AO".parse_custom_bool(),
Err(ParseEnumError::invalid_variant::<bool>("AO".to_string()))
);
}
}
}