use crate::model::base::{self, DbBmc};
use crate::model::{ContentTyp, EntityType, EpochUs, Id, ModelManager, Result, ScalarEnum};
use macro_rules_attribute as mra;
use modql::SqliteFromRow;
use modql::field::{Fields, HasSqliteFields};
use modql::filter::ListOptions;
use uuid::Uuid;
#[derive(Debug, Clone, Fields, SqliteFromRow)]
pub struct Inout {
pub id: Id,
pub uid: Uuid,
pub ctime: EpochUs,
pub mtime: EpochUs,
pub task_uid: Uuid,
pub kind: Option<InoutKind>,
pub typ: Option<String>,
pub content: Option<String>,
pub display: Option<String>,
}
#[mra::derive(Debug, ScalarEnum!)]
pub enum InoutKind {
In,
Out,
}
#[derive(Debug, Clone, Fields, SqliteFromRow)]
pub struct InoutOnlyDisplay {
pub id: Id,
pub uid: Uuid,
pub ctime: EpochUs,
pub mtime: EpochUs,
pub task_uid: Uuid,
pub display: Option<String>,
}
pub trait InoutRecord {}
impl InoutRecord for Inout {}
impl InoutRecord for InoutOnlyDisplay {}
#[derive(Debug, Clone, Fields, SqliteFromRow)]
pub struct InoutForCreate {
pub uid: Uuid,
pub task_uid: Uuid,
pub typ: Option<ContentTyp>,
pub content: Option<String>,
pub display: Option<String>,
}
#[derive(Debug, Default, Clone, Fields, SqliteFromRow)]
pub struct InoutForUpdate {
pub typ: Option<String>,
pub content: Option<String>,
}
#[derive(Debug, Default, Clone, Fields, SqliteFromRow)]
pub struct InoutFilter {
pub task_uid: Option<Uuid>,
}
pub struct InoutBmc;
impl DbBmc for InoutBmc {
const TABLE: &'static str = "inout";
const ENTITY_TYPE: EntityType = EntityType::Inout;
}
impl InoutBmc {
pub fn create_batch_with_rel_ids(
mm: &ModelManager,
items: Vec<InoutForCreate>,
rel_ids: crate::model::RelIds,
) -> Result<Vec<Id>> {
let items_fields = base::map_items_to_sqlite_fields(items);
base::batch_create_with_rel_ids::<Self>(mm, items_fields, rel_ids)
}
#[allow(unused)]
pub fn update(mm: &ModelManager, id: Id, input_u: InoutForUpdate) -> Result<usize> {
let fields = input_u.sqlite_not_none_fields();
base::update::<Self>(mm, id, fields)
}
#[allow(unused)]
pub fn get<REC>(mm: &ModelManager, id: Id) -> Result<REC>
where
REC: HasSqliteFields + SqliteFromRow + Unpin + Send,
REC: InoutRecord,
{
base::get::<Self, REC>(mm, id)
}
pub fn get_by_uid<REC>(mm: &ModelManager, uid: Uuid) -> Result<REC>
where
REC: HasSqliteFields + SqliteFromRow + Unpin + Send,
REC: InoutRecord,
{
base::get_by_uid::<Self, REC>(mm, uid)
}
#[allow(unused)]
pub fn list(
mm: &ModelManager,
list_options: Option<ListOptions>,
filter: Option<InoutFilter>,
) -> Result<Vec<Inout>> {
let filter_fields = filter.map(|f| f.sqlite_not_none_fields());
base::list::<Self, _>(mm, list_options, filter_fields)
}
}