kosame_dsl 0.3.0

Macro-based Rust ORM focused on developer ergonomics
Documentation
use proc_macro2::TokenStream;
use quote::{ToTokens, quote};
use syn::{
    Token,
    parse::{Parse, ParseStream},
};

use crate::{
    clause::Clause,
    expr::ExprRoot,
    parse_option::ParseOption,
    pretty::{PrettyPrint, Printer},
    visit::Visit,
};

pub struct Where {
    pub where_token: Token![where],
    pub expr: ExprRoot,
}

impl ParseOption for Where {
    fn peek(input: ParseStream) -> bool {
        input.peek(Token![where])
    }
}

pub fn visit_where<'a>(visit: &mut (impl Visit<'a> + ?Sized), r#where: &'a Where) {
    visit.visit_expr_root(&r#where.expr);
}

impl Parse for Where {
    fn parse(input: ParseStream) -> syn::Result<Self> {
        Ok(Self {
            where_token: input.parse()?,
            expr: input.parse()?,
        })
    }
}

impl ToTokens for Where {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        let expr = &self.expr;
        quote! { ::kosame::repr::clause::Where::new(#expr) }.to_tokens(tokens);
    }
}

impl PrettyPrint for Where {
    fn pretty_print(&self, printer: &mut Printer<'_>) {
        Clause::new(&[&self.where_token], &self.expr).pretty_print(printer);
    }
}