Skip to content

Commit

Permalink
Refactor parse module in macro crate (#374)
Browse files Browse the repository at this point in the history
  • Loading branch information
raviqqe authored Dec 4, 2023
1 parent 86f261c commit 7b5ab0b
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 88 deletions.
94 changes: 6 additions & 88 deletions macro/src/parse.rs
Original file line number Diff line number Diff line change
@@ -1,89 +1,7 @@
use proc_macro2::Ident;
use syn::{
bracketed,
parse::{Parse, ParseStream},
punctuated::Punctuated,
LitStr, Result, Token,
};
mod dialect_operation_set;
mod identifier_list;
mod pass_set;

pub struct IdentifierList {
identifiers: Vec<Ident>,
}

impl IdentifierList {
pub fn identifiers(&self) -> &[Ident] {
&self.identifiers
}
}

impl Parse for IdentifierList {
fn parse(input: ParseStream) -> Result<Self> {
Ok(Self {
identifiers: Punctuated::<Ident, Token![,]>::parse_terminated(input)?
.into_iter()
.collect(),
})
}
}

pub struct DialectOperationSet {
dialect: Ident,
identifiers: IdentifierList,
}

impl DialectOperationSet {
pub const fn dialect(&self) -> &Ident {
&self.dialect
}

pub fn identifiers(&self) -> &[Ident] {
self.identifiers.identifiers()
}
}

impl Parse for DialectOperationSet {
fn parse(input: ParseStream) -> Result<Self> {
let dialect = Ident::parse(input)?;
<Token![,]>::parse(input)?;

Ok(Self {
dialect,
identifiers: {
let content;
bracketed!(content in input);
content.parse::<IdentifierList>()?
},
})
}
}

pub struct PassSet {
prefix: LitStr,
identifiers: IdentifierList,
}

impl PassSet {
pub const fn prefix(&self) -> &LitStr {
&self.prefix
}

pub fn identifiers(&self) -> &[Ident] {
self.identifiers.identifiers()
}
}

impl Parse for PassSet {
fn parse(input: ParseStream) -> Result<Self> {
let prefix = input.parse()?;
<Token![,]>::parse(input)?;

Ok(Self {
prefix,
identifiers: {
let content;
bracketed!(content in input);
content.parse::<IdentifierList>()?
},
})
}
}
pub use dialect_operation_set::DialectOperationSet;
pub use identifier_list::IdentifierList;
pub use pass_set::PassSet;
38 changes: 38 additions & 0 deletions macro/src/parse/dialect_operation_set.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
use super::IdentifierList;
use proc_macro2::Ident;
use syn::{
bracketed,
parse::{Parse, ParseStream},
Result, Token,
};

pub struct DialectOperationSet {
dialect: Ident,
identifiers: IdentifierList,
}

impl DialectOperationSet {
pub const fn dialect(&self) -> &Ident {
&self.dialect
}

pub fn identifiers(&self) -> &[Ident] {
self.identifiers.identifiers()
}
}

impl Parse for DialectOperationSet {
fn parse(input: ParseStream) -> Result<Self> {
let dialect = Ident::parse(input)?;
<Token![,]>::parse(input)?;

Ok(Self {
dialect,
identifiers: {
let content;
bracketed!(content in input);
content.parse::<IdentifierList>()?
},
})
}
}
26 changes: 26 additions & 0 deletions macro/src/parse/identifier_list.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
use proc_macro2::Ident;
use syn::{
parse::{Parse, ParseStream},
punctuated::Punctuated,
Result, Token,
};

pub struct IdentifierList {
identifiers: Vec<Ident>,
}

impl IdentifierList {
pub fn identifiers(&self) -> &[Ident] {
&self.identifiers
}
}

impl Parse for IdentifierList {
fn parse(input: ParseStream) -> Result<Self> {
Ok(Self {
identifiers: Punctuated::<Ident, Token![,]>::parse_terminated(input)?
.into_iter()
.collect(),
})
}
}
38 changes: 38 additions & 0 deletions macro/src/parse/pass_set.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
use super::IdentifierList;
use proc_macro2::Ident;
use syn::{
bracketed,
parse::{Parse, ParseStream},
LitStr, Result, Token,
};

pub struct PassSet {
prefix: LitStr,
identifiers: IdentifierList,
}

impl PassSet {
pub const fn prefix(&self) -> &LitStr {
&self.prefix
}

pub fn identifiers(&self) -> &[Ident] {
self.identifiers.identifiers()
}
}

impl Parse for PassSet {
fn parse(input: ParseStream) -> Result<Self> {
let prefix = input.parse()?;
<Token![,]>::parse(input)?;

Ok(Self {
prefix,
identifiers: {
let content;
bracketed!(content in input);
content.parse::<IdentifierList>()?
},
})
}
}

0 comments on commit 7b5ab0b

Please sign in to comment.