notation_dsl/fretted/
pick_note.rs1use 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}