kosame_dsl 0.3.0

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

use crate::pretty::{BreakMode, Delim, PrettyPrint, Printer};

pub struct ColumnList {
    pub paren_token: syn::token::Paren,
    pub columns: Punctuated<Ident, Token![,]>,
}

impl Parse for ColumnList {
    fn parse(input: ParseStream) -> syn::Result<Self> {
        let content;
        Ok(Self {
            paren_token: parenthesized!(content in input),
            columns: content.parse_terminated(Ident::parse, Token![,])?,
        })
    }
}

impl ToTokens for ColumnList {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        let columns = self.columns.iter().map(std::string::ToString::to_string);
        quote! {
            ::kosame::repr::part::ColumnList::new(&[#(#columns),*])
        }
        .to_tokens(tokens);
    }
}

impl PrettyPrint for ColumnList {
    fn pretty_print(&self, printer: &mut Printer<'_>) {
        " ".pretty_print(printer);
        self.paren_token
            .pretty_print(printer, Some(BreakMode::Consistent), |printer| {
                self.columns.pretty_print(printer);
            });
    }
}