use crate::connection::Connection;
use self::delete_query::ModelDeleteQuery;
use self::query::CountQuery;
use self::update_query::ModelUpdateQuery;
mod column;
pub mod migrator;
pub mod query;
pub mod update_query;
pub mod delete_query;
pub mod relation;
pub use rusqlite::Row as SqliteRow;
pub use rusqlite::Rows as SqliteRows;
pub use rusqlite::ToSql as SqliteToSql;
pub use column::Column;
pub trait Model {
fn table_name() -> &'static str;
fn columns() -> &'static [Column<'static>];
fn count_columns() -> usize;
fn get_id(&self) -> i64;
fn id_column() -> Column<'static>;
fn column_value(&self, column: &'static Column<'static>) -> Option<Box<dyn rusqlite::types::ToSql>>;
fn parse_rows(rows: rusqlite::Rows, offset: usize, joins: &Vec<String>) -> Vec<Self>
where
Self: Sized;
fn parse_row(row: &rusqlite::Row, offset: usize, joins: &Vec<String>) -> Self
where
Self: Sized;
}
pub trait ModelExt<M: Model> {
fn select() -> query::ModelQuery<M>
where
Self: Sized;
fn insert(self, conn: &Connection) -> Result<i64, rusqlite::Error>
where
Self: Sized;
fn count() -> query::ModelQuery<CountQuery>
where
Self: Sized;
fn update() -> ModelUpdateQuery<M>
where
Self: Sized;
fn delete() -> ModelDeleteQuery<M>
where
Self: Sized;
}
impl<M: Model> ModelExt<M> for M {
fn select() -> query::ModelQuery<M>
where
Self: Sized,
{
query::ModelQuery::select()
}
fn insert(self, conn: &Connection) -> Result<i64, rusqlite::Error>
where
Self: Sized {
conn.insert(self)
}
fn count() -> query::ModelQuery<CountQuery>
where
Self: Sized,
{
query::ModelQuery::<M>::count()
}
fn update() -> ModelUpdateQuery<M>
where
Self: Sized,
{
ModelUpdateQuery::new()
}
fn delete() -> ModelDeleteQuery<M>
where
Self: Sized,
{
ModelDeleteQuery::new()
}
}