Parsing len and sampling frequency works

This commit is contained in:
Sebastian 2023-07-07 00:01:17 +02:00
parent 17c2c2a45d
commit 893c3ed659
1 changed files with 53 additions and 4 deletions

View File

@ -1,16 +1,65 @@
extern crate proc_macro;
use proc_macro::TokenStream;
use syn::parse::{Parse, ParseStream};
use syn::parse::{Parse, ParseStream, Parser};
use syn::parse_macro_input;
use syn::{punctuated::Punctuated, Expr, Token};
use syn::spanned::Spanned;
use syn::{punctuated::Punctuated, Expr, Lit, Token};
struct FirlsRealInput {}
struct FirlsRealInput {
filter_len: usize,
sample_frequency: f32,
}
impl Parse for FirlsRealInput {
fn parse(input: ParseStream) -> Result<Self, syn::Error> {
let arg_list = Punctuated::<Expr, Token![,]>::parse_separated_nonempty(input)?;
Ok(FirlsRealInput {})
if arg_list.len() != 3 {
return Err(syn::Error::new(
arg_list.span(),
"firls_real takes 3 parameters",
));
}
let filter_len = parse_filter_len(&arg_list[0])?;
let sample_frequency = parse_frequency(&arg_list[1])?;
Ok(FirlsRealInput {
filter_len,
sample_frequency,
})
}
}
fn parse_filter_len(len: &Expr) -> Result<usize, syn::Error> {
match len {
Expr::Lit(expr) => match &expr.lit {
Lit::Int(int_lit) => int_lit.base10_parse(),
_ => Err(syn::Error::new(
expr.span(),
"expected integer literal for len",
)),
},
_ => Err(syn::Error::new(
len.span(),
"len should be a literal expression",
)),
}
}
fn parse_frequency(freq: &Expr) -> Result<f32, syn::Error> {
match freq {
Expr::Lit(expr) => match &expr.lit {
Lit::Float(float_lit) => float_lit.base10_parse(),
_ => Err(syn::Error::new(
expr.span(),
"expected float literal for frequency",
)),
},
_ => Err(syn::Error::new(
freq.span(),
"frequency should be a literal expression",
)),
}
}