rocal-core 0.3.0

Core for Rocal - Full-Stack WASM framework
Documentation
use proc_macro2::TokenStream;
use quote::quote;

pub fn build_database_struct() -> TokenStream {
    quote! {
        use js_sys::Promise;
        use wasm_bindgen::{JsCast, JsValue};
        use serde::de::DeserializeOwned;
        use serde_wasm_bindgen::from_value;

        pub struct Database {
            directory_name: String,
            file_name: String,
        }

        impl Database {
            pub fn new(directory_name: String, file_name: String) -> Self {
                Database {
                    directory_name,
                    file_name,
                }
            }

            pub fn get_directory_name(&self) -> &str {
                &self.directory_name
            }

            pub fn get_file_name(&self) -> &str {
                &self.file_name
            }

            pub fn get_name(&self) -> String {
                format!("{}/{}", self.directory_name, self.file_name)
            }

            pub fn query(&self, query: &str) -> Query {
                Query::new(&self.get_name(), query)
            }
        }

        struct Query {
            db: String,
            query: String,
            bindings: Vec<JsValue>,
        }

        impl Query {
            fn new(db: &str, query: &str) -> Self {
                Self {
                    db: db.to_string(),
                    query: query.to_string(),
                    bindings: vec![],
                }
            }

            fn bind<T>(&mut self, bind: T) -> &mut Self
            where
                T: Into<JsValue>,
            {
                self.bindings.push(bind.into());
                self
            }

            pub async fn fetch<T>(&self) -> Result<Vec<T>, JsValue>
            where
                T: DeserializeOwned,
            {
                let promise = crate::exec_sql(&self.db, &self.query, self.bindings.clone().into_boxed_slice())
                    .dyn_into::<Promise>()?;
                let result = wasm_bindgen_futures::JsFuture::from(promise).await?;
                let result: Vec<T> = from_value(result)?;
                Ok(result)
            }

            pub async fn execute(&self) -> Result<JsValue, JsValue> {
                let promise = crate::exec_sql(&self.db, &self.query, self.bindings.clone().into_boxed_slice())
                    .dyn_into::<Promise>()?;
                let result = wasm_bindgen_futures::JsFuture::from(promise).await?;
                Ok(result)
            }
        }
    }
}