This crate defines the derive macro for the parseal crate.
For tuple structs, the generated code should look something like this: ```rust
struct Test(Number, Comma, Number);
// generated code
impl Parse for Test {
fn parse(value: &mut CharStream) -> Result
fn span(&self) -> Span {
Span::new(self.0.span().start, self.2.span().end)
}
}
struct TestWhiteSpace(#[whitespace(KeepAll)] [tokens::Hyphen; 3], Number);
// generated code
impl Parse for TestWhiteSpace {
fn parse(value: &mut CharStream) -> Result
let inner = <[tokens::Hyphen; 3]>::parse(&mut __white_space_value);
value.goto(__white_space_value.position())?;
inner
}?;
let __inner_1 = Number::parse(value)?;
Ok(Self(__inner_0, __inner_1))
}
fn span(&self) -> Span {
Span::new(self.0.span().start, self.1.span().end)
}
}
struct TestValue(#[value("test", "other")] Identifier, Number);
// generated code
impl Parse for TestWhiteSpace {
fn parse(value: &mut CharStream) -> Result
fn span(&self) -> Span {
Span::new(self.0.span().start, self.1.span().end)
}
}
struct TestValueWhiteSpace(#[whitespace(Indent)] #[value("test", "other")] Identifier, Number);
// generated code
impl Parse for TestWhiteSpace {
fn parse(value: &mut CharStream) -> Result
let inner = Identifier::parse(&mut __white_space_value);
value.goto(__white_space_value.position())?;
inner
} {
Ok(__inner_0) if __inner_0 == "test" => __inner_0,
Ok(__inner_0) if __inner_0 == "other" => __inner_0,
Ok(__inner_0) => return Err(ParseError("Value was not one of the expected values.", value.position())),
Err(error) => return Err(error)
};
let __inner_1 = Number::parse(value)?;
Ok(Self(__inner_0, __inner_1))
}
fn span(&self) -> Span {
Span::new(self.0.span().start, self.1.span().end)
}
} ```
For named structs, it should look like this: ```rust
struct Test { x: Number, comma: Comma, y: Number }
// generated code
impl Parse for Test {
fn parse(value: &mut CharStream) -> Result
fn span(&self) -> Span {
Span::new(self.x.span().start, self.y.span().end)
}
}
struct TestWhiteSpace { #[whitespace(Indent)] x: Number, comma: Comma, y: Number }
// generated code
impl Parse for Test {
fn parse(value: &mut CharStream) -> Result
let inner = Number::parse(&mut __white_space_value);
value.goto(__white_space_value.position())?;
inner
}?;
let __inner_comma = Comma::parse(value)?;
let __inner_y = Number::parse(value)?;
Ok(Self { x: __inner_x, comma: __inner_comma, y: __inner_y})
}
fn span(&self) -> Span {
Span::new(self.x.span().start, self.y.span().end)
}
}
struct TestValue { #[value(69, 420)] x: Number, comma: Comma, y: Number }
// generated code
impl Parse for Test {
fn parse(value: &mut CharStream) -> Result
fn span(&self) -> Span {
Span::new(self.x.span().start, self.y.span().end)
}
}
struct TestWhiteSpaceValue { #[whitespace(Indent)] #[value(69, 420)] x: Number, comma: Comma, y: Number }
// generated code
impl Parse for Test {
fn parse(value: &mut CharStream) -> Result
let inner = Number::parse(&mut __white_space_value);
value.goto(__white_space_value.position())?;
inner
} {
Ok(__inner_x) if __inner_x == 69 => __inner_x,
Ok(__inner_x) if __inner_x == 420 => __inner_x,
Ok(__inner_x) => return Err(ParseError("Value was not one of the expected values.", value.position())),
Err(error) => return Err(error)
};
let __inner_comma = Comma::parse(value)?;
let __inner_y = Number::parse(value)?;
Ok(Self { x: __inner_x, comma: __inner_comma, y: __inner_y})
}
fn span(&self) -> Span {
Span::new(self.x.span().start, self.y.span().end)
}
}
for enums it looks like this:
rust
enum Test { TestOne(tokens::Hyphen, Number), TestTwo { x: Number, y: Number } }
impl Test {
fn parsetestone(value: &mut CharStream) -> Result
impl Parse for Test {
fn parse(value: &mut CharStream) -> Result
fn span(&self) -> Span {
match self {
Self::TestOne(start, end) => Span::new(start.span().start, end.span().end),
Self::TestTwo(x, y) => Span::new(x.span().start, y.span().end)
}
}
} ``` The helper attributes for enums will work basically the same inside the helper functions as they did for structs. Therefore we do not need to think too much about their implementation right now (I hope...).