use std::fmt;
use std::marker::PhantomData;
use keelson_core::Mod;
use crate::mutate::{ModelDelete, ModelInsert, ModelUpdate};
use crate::select::ModelSelect;
use crate::{Table, View};
pub struct ModelTable<M> {
_model: PhantomData<M>,
}
impl<M> fmt::Debug for ModelTable<M> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("ModelTable")
}
}
impl<M> Clone for ModelTable<M> {
fn clone(&self) -> Self {
*self
}
}
impl<M> Copy for ModelTable<M> {}
impl<M> Default for ModelTable<M> {
fn default() -> Self {
ModelTable::new()
}
}
impl<M> ModelTable<M> {
pub const fn new() -> Self {
ModelTable {
_model: PhantomData,
}
}
}
impl<M: View> ModelTable<M> {
pub fn query(self, mods: impl Mod<ModelSelect<M>>) -> ModelSelect<M> {
let mut q = ModelSelect::new(M::base_select());
mods.apply(&mut q);
q
}
}
impl<M: Table> ModelTable<M> {
pub fn insert(self, setter: M::Setter) -> ModelInsert<M> {
ModelInsert::new(setter)
}
pub fn update(self, setter: M::Setter, mods: impl Mod<ModelUpdate<M>>) -> ModelUpdate<M> {
ModelUpdate::new(setter, mods)
}
pub fn delete(self, mods: impl Mod<ModelDelete<M>>) -> ModelDelete<M> {
ModelDelete::new(mods)
}
}