use proc_macro2::TokenStream; use quote::quote; use syn::{ Ident, LitStr, Token, parse::{Parse, ParseStream}, }; struct CallArgs { backend: Ident, _comma: Token![,], sql_string: LitStr, } impl Parse for CallArgs { fn parse(input: ParseStream) -> syn::Result { Ok(CallArgs { backend: input.parse()?, _comma: input.parse()?, sql_string: input.parse()?, }) } } pub fn expand(input: proc_macro::TokenStream) -> syn::Result { let CallArgs { backend, sql_string, .. } = syn::parse(input)?; let builder = match backend.to_string().as_str() { "MySql" => quote!(MysqlQueryBuilder), "Postgres" => quote!(PostgresQueryBuilder), "Sqlite" => quote!(SqliteQueryBuilder), backend => panic!("Unsupported backend {backend}"), }; Ok(quote! {{ use sea_orm::sea_query; let query = sea_query::raw_query!(#builder, #sql_string); sea_orm::Statement { sql: query.sql, values: Some(query.values), db_backend: sea_orm::DbBackend::#backend, } }}) }