ferriorm_codegen/
client.rs1use ferriorm_core::schema::Schema;
9use ferriorm_core::utils::to_snake_case;
10use proc_macro2::TokenStream;
11use quote::{format_ident, quote};
12
13#[must_use]
15pub fn generate_client_module(schema: &Schema) -> TokenStream {
16 let model_accessors: Vec<TokenStream> = schema
17 .models
18 .iter()
19 .map(|m| {
20 let method_name = format_ident!("{}", to_snake_case(&m.name));
21 let actions_type = format_ident!("{}Actions", m.name);
22 let module_name = format_ident!("{}", to_snake_case(&m.name));
23
24 quote! {
25 pub fn #method_name(&self) -> super::#module_name::#actions_type<'_> {
26 super::#module_name::#actions_type::new(&self.inner)
27 }
28 }
29 })
30 .collect();
31
32 quote! {
33 #![allow(unused_imports, dead_code, unused_variables, clippy::all, clippy::pedantic, clippy::nursery)]
34
35 use ferriorm_runtime::prelude::*;
36
37 pub struct FerriormClient {
38 inner: DatabaseClient,
39 }
40
41 impl FerriormClient {
42 pub async fn connect(url: &str) -> Result<Self, FerriormError> {
44 let inner = DatabaseClient::connect(url).await?;
45 Ok(Self { inner })
46 }
47
48 pub async fn connect_with_config(url: &str, config: &PoolConfig) -> Result<Self, FerriormError> {
50 let inner = DatabaseClient::connect_with_config(url, config).await?;
51 Ok(Self { inner })
52 }
53
54 pub fn client(&self) -> &DatabaseClient {
59 &self.inner
60 }
61
62 #(#model_accessors)*
63
64 pub async fn disconnect(self) {
66 self.inner.disconnect().await;
67 }
68 }
69 }
70}