diff --git a/mono-fmt-macro/src/lib.rs b/mono-fmt-macro/src/lib.rs index 6f6f90e..18d3fa0 100644 --- a/mono-fmt-macro/src/lib.rs +++ b/mono-fmt-macro/src/lib.rs @@ -11,6 +11,8 @@ use syn::{ Expr, LitStr, Token, }; +mod parser; + // TODO: Rewrite using state machine please struct Input { diff --git a/mono-fmt-macro/src/parser.rs b/mono-fmt-macro/src/parser.rs new file mode 100644 index 0000000..d7f04bc --- /dev/null +++ b/mono-fmt-macro/src/parser.rs @@ -0,0 +1,79 @@ +use std::{iter::Peekable, str::Chars}; + +#[derive(Debug, PartialEq, Default)] +pub struct Align { + amount: usize, + char: Option, +} + +#[derive(Debug, PartialEq, Default)] +pub enum Argument { + #[default] + Positional, + PositionalExplicit(usize), + Keyword(String), +} + +#[derive(Debug, PartialEq, Default)] +pub enum FmtType { + #[default] + Default, + Debug, + LowerHex, + UpperHex, + Other(String), +} + +#[derive(Debug, PartialEq, Default)] +pub struct FmtSpec { + arg: Argument, + align: Option, + sign: Option, + alternate: bool, + zero: bool, + width: Option, + precision: Option, + kind: FmtType, +} + +struct FmtSpecParser<'a> { + chars: &'a mut Peekable>, + state: State, + argument: FmtSpec, +} + +#[derive(PartialEq)] +enum State { + Initial, + Argument, + // : here + Fill, + Align, + Sign, + Zero, + Width, + Precision, + Type, + Done, +} + +impl<'a> FmtSpecParser<'a> { + pub fn new(chars: &'a mut Peekable>) -> Self { + Self { + chars, + state: State::Initial, + argument: FmtSpec::default(), + } + } + + fn parse(mut self) -> Result { + while self.state != State::Done { + self.step()?; + } + Ok(self.argument) + } + + fn step(&mut self) -> Result<(), ()> { + todo!() + } +}