astmaker 0.2.0

Build Abstract Syntax Trees and tree-walking models quickly in Rust.
Documentation
use syn::parse::{Parse, ParseStream, Result};
use syn::*;


pub struct Model {
  pub context: Type,
  pub generics: Generics,
  pub output: Type,
  pub clauses: Vec<Clause>,
}

pub struct Clause {
  pub pattern: Type,
  pub body: Expr,
}

impl Parse for Model {
  fn parse(input: ParseStream) -> Result<Self> {
    input.parse::<Token![impl]>()?;

    let generics: Generics = input.parse()?;

    let context: Type = input.parse()?;

    input.parse::<Token![->]>()?;

    let output: Type = input.parse()?;

    let content;
    braced!(content in input);

    let clauses = content
      .parse_terminated(Clause::parse, Token![,])?
      .into_iter()
      .collect();

    Ok(Self { context, generics, output, clauses })
  }
}

impl Parse for Clause {
  fn parse(input: ParseStream) -> Result<Self> {
    input.parse::<Token![where]>()?;

    let pattern: Type = input.parse()?;

    input.parse::<Token![=>]>()?;

    let body: Expr = input.parse()?;

    Ok(Self { pattern, body })
  }
}