use crate::db::data::structural_field::{
composite::encode_composite_field_binary_bytes, leaf::encode_leaf_field_binary_bytes,
scalar::encode_scalar_fast_path_binary_bytes,
};
use crate::{error::InternalError, model::field::FieldKind, value::Value};
pub(in crate::db) fn encode_structural_field_by_kind_bytes(
kind: FieldKind,
value: &Value,
field_name: &str,
) -> Result<Vec<u8>, InternalError> {
if let Some(encoded) = encode_scalar_fast_path_binary_bytes(kind, value, field_name)? {
return Ok(encoded);
}
if let Some(encoded) = encode_leaf_field_binary_bytes(kind, value, field_name)? {
return Ok(encoded);
}
if matches!(
kind,
FieldKind::Enum { .. }
| FieldKind::List(_)
| FieldKind::Map { .. }
| FieldKind::Relation { .. }
| FieldKind::Set(_)
) {
return encode_composite_field_binary_bytes(kind, value, field_name);
}
Err(InternalError::persisted_row_field_encode_failed(
field_name,
format!("unsupported structural field kind during encode: {kind:?}"),
))
}