diff --git a/crates/specctra-core/src/read.rs b/crates/specctra-core/src/read.rs index 8d4668d..ee36c3c 100644 --- a/crates/specctra-core/src/read.rs +++ b/crates/specctra-core/src/read.rs @@ -89,55 +89,28 @@ impl ReadDsn for bool { } } -impl ReadDsn for i32 { - fn read_dsn(tokenizer: &mut ListTokenizer) -> Result { - tokenizer - .consume_token()? - .expect_leaf()? - .parse() - .map_err(|_| tokenizer.add_context(ParseError::Expected("i32"))) +/// `impl_ReadDsn_via_FromStr!((TYPE, TYPE-NAME); ...)` +macro_rules! impl_ReadDsn_via_FromStr { + ($(($t:ty, $name:expr));* $(;)?) => { + $( impl ReadDsn for $t { + fn read_dsn(tokenizer: &mut ListTokenizer) -> Result { + tokenizer + .consume_token()? + .expect_leaf()? + .parse() + .map_err(|_| tokenizer.add_context(ParseError::Expected($name))) + } + } )* } } -impl ReadDsn for u32 { - fn read_dsn(tokenizer: &mut ListTokenizer) -> Result { - tokenizer - .consume_token()? - .expect_leaf()? - .parse() - .map_err(|_| tokenizer.add_context(ParseError::Expected("u32"))) - } -} - -impl ReadDsn for usize { - fn read_dsn(tokenizer: &mut ListTokenizer) -> Result { - tokenizer - .consume_token()? - .expect_leaf()? - .parse() - .map_err(|_| tokenizer.add_context(ParseError::Expected("usize"))) - } -} - -impl ReadDsn for f32 { - fn read_dsn(tokenizer: &mut ListTokenizer) -> Result { - tokenizer - .consume_token()? - .expect_leaf()? - .parse() - .map_err(|_| tokenizer.add_context(ParseError::Expected("f32"))) - } -} - -impl ReadDsn for f64 { - fn read_dsn(tokenizer: &mut ListTokenizer) -> Result { - tokenizer - .consume_token()? - .expect_leaf()? - .parse() - .map_err(|_| tokenizer.add_context(ParseError::Expected("f64"))) - } -} +impl_ReadDsn_via_FromStr!( + (i32, "i32"); + (u32, "u32"); + (usize, "usize"); + (f32, "f32"); + (f64, "f64"); +); pub struct ListTokenizer { reader: R,