kosame_dsl 0.3.0

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

use crate::{
    parse_option::ParseOption,
    part::Alias,
    pretty::{PrettyPrint, Printer},
    row::RowField,
};

pub struct Star {
    pub attrs: Vec<Attribute>,
    #[allow(clippy::struct_field_names)]
    pub star_token: Token![*],
    pub alias: Option<Alias>,
}

impl Star {
    pub fn to_row_field(&self, table_path: impl ToTokens) -> RowField {
        let additional_attrs = [
            parse_quote! { #[star] },
            #[cfg(feature = "serde")]
            parse_quote! { #[serde(flatten)] },
        ];

        RowField::new(
            self.attrs
                .iter()
                .chain(additional_attrs.iter())
                .cloned()
                .collect(),
            match &self.alias {
                Some(alias) => alias.ident.clone(),
                None => Ident::new("_star", Span::call_site()),
            },
            quote! { #table_path::Select },
        )
    }
}

impl Parse for Star {
    fn parse(input: ParseStream) -> syn::Result<Self> {
        Ok(Self {
            attrs: input.call(Attribute::parse_outer)?,
            star_token: input.parse()?,
            alias: input.call(Alias::parse_option)?,
        })
    }
}

impl PrettyPrint for Star {
    fn pretty_print(&self, printer: &mut Printer<'_>) {
        self.attrs.pretty_print(printer);
        self.star_token.pretty_print(printer);
        self.alias.pretty_print(printer);
        printer.scan_same_line_trivia();
    }
}