notation_dsl/fretted/
pick_note.rs

1use fehler::throws;
2use notation_proto::prelude::PickNote;
3use proc_macro2::TokenStream;
4use quote::{quote, ToTokens};
5use syn::parse::{Error, Parse, ParseStream};
6use syn::{LitInt, Token};
7
8pub struct PickNoteDsl {
9    pub string: u8,
10    pub fret: Option<u8>,
11}
12
13impl Parse for PickNoteDsl {
14    #[throws(Error)]
15    fn parse(input: ParseStream) -> Self {
16        let string = input.parse::<LitInt>()?.base10_parse::<u8>()?;
17        let fret = if input.peek(Token![@]) {
18            input.parse::<Token![@]>()?;
19            Some(input.parse::<LitInt>()?.base10_parse::<u8>()?)
20        } else {
21            None
22        };
23        PickNoteDsl { string, fret }
24    }
25}
26
27impl ToTokens for PickNoteDsl {
28    fn to_tokens(&self, tokens: &mut TokenStream) {
29        let PickNoteDsl { string, fret } = self;
30        let fret_quote = fret.map(|f| quote! { Some(#f) }).unwrap_or(quote! {None});
31        tokens.extend(quote! {
32            PickNote::new(#string, #fret_quote, None, None, None)
33        });
34    }
35}
36
37impl PickNoteDsl {
38    pub fn to_proto(&self) -> PickNote {
39        PickNote::new(self.string, self.fret, None, None, None)
40    }
41}