modelite 0.3.0

Automatically generate create table and other SQLite queries for a struct
Documentation
pub trait BaseModel: Sized {
    const COLUMNS: &'static [&'static str];

    fn table_name() -> &'static str {
        std::any::type_name::<Self>()
            .split("::")
            .last()
            .unwrap()
    }

    fn create_table_sql() -> &'static str;
    fn insert_sql() -> &'static str;
    fn insert_one_sql() -> &'static str;
    fn select_sql() -> &'static str;
    fn drop_table_sql() -> &'static str;
}

pub mod util {
    use std::borrow::Cow;
    use std::iter::repeat_n;

    use crate::BaseModel;

    #[macro_export]
    macro_rules! cache {
        ($x:expr) => {{
            static CACHE: OnceLock<usize> = OnceLock::new();
            *CACHE.get_or_init(|| $x)
        }};
    }

    pub fn create_table_sql<M: BaseModel>(data: Cow<'static, str>) -> String {
        format!("create table if not exists \"{}\" ({})",
            M::table_name(),
            data
        )
    }

    pub fn insert_sql<M: BaseModel>() -> String {
        format!("insert into \"{}\" ({})",
            M::table_name(),
            M::COLUMNS.iter().map(|c| format!("\"{}\"", c)).collect::<Vec<_>>().join(",")
        )
    }

    pub fn insert_one_sql<M: BaseModel>() -> String {
        format!("{} values ({})",
            insert_sql::<M>(),
            repeat_n("?", M::COLUMNS.len()).collect::<Vec<_>>().join(",")
        )
    }

    pub fn select_sql<M: BaseModel>() -> String {
        format!("select {} from \"{}\"",
            M::COLUMNS.iter().map(|c| format!("\"{}\".\"{}\"", M::table_name(), c)).collect::<Vec<_>>().join(","),
            M::table_name()
        )
    }

    pub fn drop_table_sql<M: BaseModel>() -> String {
        format!("drop table if exists \"{}\"", M::table_name())
    }
}