parseal 0.2.4

An easy way to create your own parsers
Documentation
use parseal::{Parsable, parsing::{self, Parse, Identifier, Group, tokens, List}};

use crate::{Visibility, Attribute};

#[derive(Parsable, Clone, Debug)]
pub struct TypePathReference {
    path: List<Identifier, tokens::DoubleColon>,
    generics: Option<Group<tokens::Chevron, List<Box<TypeValue>>>>,
}

#[derive(Parsable, Clone, Debug)]
pub enum TypeValue {
    Path(TypePathReference),
    Tuple(Group<tokens::Paren, List<Box<TypeValue>>>),
}

#[derive(Parsable, Clone, Debug)]
pub enum Variant {
    Tuple(Identifier, Group<tokens::Paren, List<UnnamedField>>),
    Unit(Identifier),
}

#[derive(Parsable, Clone, Debug)]
pub struct Enum {
    attrs: Option<Vec<Attribute>>,
    vis: Visibility,
    #[value("enum")]
    keyword: Identifier,
    name: Identifier,
    variants: Group<tokens::Brace, List<Variant>>,
}

#[derive(Parsable, Clone, Debug)]
pub struct UnnamedField {
    attrs: Option<Vec<Attribute>>,
    ty: TypeValue
}

#[derive(Parsable, Clone, Debug)]
pub struct NamedField {
    attrs: Option<Vec<Attribute>>,
    name: Identifier,
    colon: tokens::Colon,
    ty: TypeValue
}

#[derive(Parsable, Clone, Debug)]
pub enum StructData {
    Named(Group<tokens::Brace, List<NamedField>>),
}

impl StructData {
	fn fields(&self) -> Vec<NamedField> {
		match self {
			Self::Named(group) => group.clone().into()
		}
	}
}

#[derive(Parsable, Clone, Debug)]
pub struct Struct {
    attrs: Option<Vec<Attribute>>,
    vis: Visibility,
    #[value("struct")]
    keyword: Identifier,
    name: Identifier,
    data: StructData,
}