use crate::{
db::{DbSession, PersistedRow, QueryError, schema::output_value_from_runtime},
types::Id,
value::{OutputValue, Value},
};
pub(super) fn output<E>(
session: &DbSession<E::Canister>,
value: Value,
) -> Result<OutputValue, QueryError>
where
E: PersistedRow,
{
let schema = session
.accepted_schema_info_for_entity::<E>()
.map_err(QueryError::execute)?;
let catalog = schema.enum_catalog().ok_or_else(QueryError::invariant)?;
output_value_from_runtime(catalog, &value).map_err(|_error| QueryError::invariant())
}
pub(super) fn output_values<E>(
session: &DbSession<E::Canister>,
values: Vec<Value>,
) -> Result<Vec<OutputValue>, QueryError>
where
E: PersistedRow,
{
let schema = session
.accepted_schema_info_for_entity::<E>()
.map_err(QueryError::execute)?;
let catalog = schema.enum_catalog().ok_or_else(QueryError::invariant)?;
values
.iter()
.map(|value| {
output_value_from_runtime(catalog, value).map_err(|_error| QueryError::invariant())
})
.collect()
}
pub(super) fn output_values_with_ids<E: PersistedRow>(
session: &DbSession<E::Canister>,
values: Vec<(Id<E>, Value)>,
) -> Result<Vec<(Id<E>, OutputValue)>, QueryError> {
let schema = session
.accepted_schema_info_for_entity::<E>()
.map_err(QueryError::execute)?;
let catalog = schema.enum_catalog().ok_or_else(QueryError::invariant)?;
values
.into_iter()
.map(|(id, value)| {
output_value_from_runtime(catalog, &value)
.map(|output| (id, output))
.map_err(|_error| QueryError::invariant())
})
.collect()
}