use toasty::{Executor, stmt::IntoInsert};
use topcoat::{Result, context::Cx};
use super::{Resource, require_mounted};
use crate::{
form::{Posted, RecordForm},
tenancy::require_tenant,
};
pub async fn write_create<R: Resource>(
cx: &Cx,
form: R::Form,
ex: &mut dyn Executor,
) -> Result<R::Model> {
let resource = require_mounted::<R>(cx)?;
let mut insert = form.into_create().into_insert();
match resource.tenancy.column_field() {
Some(Ok(column)) => {
insert.set(
column.index,
toasty_core::stmt::Value::from(require_tenant(cx)?),
);
}
Some(Err(error)) => {
return Err(crate::error::declaration(
crate::DeclarationError::of::<R>(crate::Site::Tenancy, error).to_string(),
));
}
None => {}
}
ex.exec(insert.into())
.await
.map_err(|error| -> topcoat::Error { error.into() })
}
pub async fn write_update<R: Resource>(
_cx: &Cx,
mut record: R::Model,
posted: Posted<R::Form>,
ex: &mut dyn Executor,
) -> Result<R::Model> {
{
let pending = posted
.into_update(&mut record)
.map(|update| <R::Form as RecordForm>::exec_update(update, &mut *ex));
if let Some(pending) = pending {
pending
.await
.map_err(|error| -> topcoat::Error { error.into() })?;
}
}
Ok(record)
}