Rasql/rasql-core/src/rust/client_gen.rs
2025-01-27 00:16:15 +00:00

145 lines
5.9 KiB
Rust

pub trait AsyncClientCodeGenerator<Client: rasql_traits::r#async::Client> {
/// Create a token stream for usage of `client` to prepare `statement_str` for
/// later execution, evaluating to a value of type
/// `Result<Client::PreparedStatement, Client::PrepareError>`
///
/// - `client` is an expr of type `&Client`
/// - `statement_str` is an expr of type `&str`
fn generate_prepare_statement(
client: &syn::Expr,
statement_str: &syn::Expr,
) -> proc_macro2::TokenStream;
/// Create a token stream for usage of `client` to execute the `prepared_statement`
/// with the provided `parameters`, evaluating to a value of type
/// `Result<Client::Rows, Client::QueryError>`.
///
/// - `client` is an expr of type `&Client`
/// - `prepared_statement` is an expr of type `&Client::PreparedStatement`
/// - exprs in `parameters` are references of types that can be assumed to be compatible with the client
fn generate_query_many_with_statement(
client: &syn::Expr,
prepared_statement: &syn::Expr,
parameters: &[&syn::Expr],
) -> proc_macro2::TokenStream;
/// Create a token stream for usage of `client` to execute the `prepared_statement`
/// with the provided `parameters`, evaluating to a value of type
/// `Result<Option<Client::Row>, Client::QueryError>`.
///
/// - `client` is an expr of type `&Client`
/// - `prepared_statement` is an expr of type `&Client::PreparedStatement`
/// - exprs in `parameters` are references of types that can be assumed to be compatible with the client
fn generate_query_one_or_none_with_statement(
client: &syn::Expr,
prepared_statement: &syn::Expr,
parameters: &[&syn::Expr],
) -> proc_macro2::TokenStream;
/// Create a token stream for usage of `row` to read a column, evaluating to a value of type
/// `Result<T, Client::RowReadColumnError>` where `T` is any type compatible with the database client.
///
/// - `row` is an expr of type `&Client::Row`
/// - `column_name` is an expr of type `&str`
fn generate_row_read_column(
row: &syn::Expr,
column_name: &syn::Expr,
) -> proc_macro2::TokenStream;
/// Create a token stream for usage of `client` to execute the `prepared_statement`
/// with the provided `parameters`, evaluating to a value of type
/// `Result<Client::InsertOutcome, Client::InsertError>`.
///
/// - `client` is an expr of type `&Client`
/// - `prepared_statement` is an expr of type `&Client::PreparedStatement`
/// - exprs in `parameters` are references of types that can be assumed to be compatible with the client
fn generate_insert_with_statement(
client: &syn::Expr,
prepared_statement: &syn::Expr,
parameters: &[&syn::Expr],
) -> proc_macro2::TokenStream;
/// Create a token stream for usage of `client` to execute the `prepared_statement`
/// with the provided `parameters`, evaluating to a value of type
/// `Result<Client::UpdateOutcome, Client::UpdateError>`.
///
/// - `client` is an expr of type `&Client`
/// - `prepared_statement` is an expr of type `&Client::PreparedStatement`
/// - exprs in `parameters` are references of types that can be assumed to be compatible with the client
fn generate_update_with_statement(
client: &syn::Expr,
prepared_statement: &syn::Expr,
parameters: &[&syn::Expr],
) -> proc_macro2::TokenStream;
/// Create a token stream for usage of `client` to execute the `prepared_statement`
/// with the provided `parameters`, evaluating to a value of type
/// `Result<Client::DeleteOutcome, Client::DeleteError>`.
///
/// - `client` is an expr of type `&Client`
/// - `prepared_statement` is an expr of type `&Client::PreparedStatement`
/// - exprs in `parameters` are references of types that can be assumed to be compatible with the client
fn generate_delete_with_statement(
client: &syn::Expr,
prepared_statement: &syn::Expr,
parameters: &[&syn::Expr],
) -> proc_macro2::TokenStream;
}
#[cfg(feature = "tokio-postgres")]
impl AsyncClientCodeGenerator<tokio_postgres::Client> for super::type_gen::TokioPostgresGenerator {
fn generate_prepare_statement(
client: &syn::Expr,
statement_str: &syn::Expr,
) -> proc_macro2::TokenStream {
quote::quote!(#client.prepare(#statement_str).await)
}
fn generate_query_many_with_statement(
client: &syn::Expr,
prepared_statement: &syn::Expr,
parameters: &[&syn::Expr],
) -> proc_macro2::TokenStream {
quote::quote!(#client.query(#prepared_statement, &[#(#parameters,)*]).await)
}
fn generate_query_one_or_none_with_statement(
client: &syn::Expr,
prepared_statement: &syn::Expr,
parameters: &[&syn::Expr],
) -> proc_macro2::TokenStream {
quote::quote!(#client.query_opt(#prepared_statement, &[#(#parameters,)*]).await)
}
fn generate_row_read_column(
row: &syn::Expr,
column_name: &syn::Expr,
) -> proc_macro2::TokenStream {
quote::quote!(#row.try_get(#column_name))
}
fn generate_insert_with_statement(
client: &syn::Expr,
prepared_statement: &syn::Expr,
parameters: &[&syn::Expr],
) -> proc_macro2::TokenStream {
Self::generate_execute(client, prepared_statement, parameters)
}
fn generate_update_with_statement(
client: &syn::Expr,
prepared_statement: &syn::Expr,
parameters: &[&syn::Expr],
) -> proc_macro2::TokenStream {
Self::generate_execute(client, prepared_statement, parameters)
}
fn generate_delete_with_statement(
client: &syn::Expr,
prepared_statement: &syn::Expr,
parameters: &[&syn::Expr],
) -> proc_macro2::TokenStream {
Self::generate_execute(client, prepared_statement, parameters)
}
}