use bson::RawDocumentBuf;
use solana_idl::{IdlField, IdlType};
use crate::{ChainsawError, ChainsawResult};
use super::{
bson_idl_type_de::BsonIdlTypeDeserializer,
bson_serialization_opts::BsonSerializationOpts,
BsonTypeDefinitionDeserializerMap,
};
#[derive(Clone)]
pub struct BsonIdlFieldDeserializer<'opts> {
pub name: String,
pub ty: IdlType,
pub ty_deserealizer: BsonIdlTypeDeserializer<'opts>,
pub type_map: BsonTypeDefinitionDeserializerMap<'opts>,
}
impl<'opts> BsonIdlFieldDeserializer<'opts> {
pub fn new(
field: &IdlField,
type_map: BsonTypeDefinitionDeserializerMap<'opts>,
opts: &'opts BsonSerializationOpts,
) -> Self {
let ty_deserealizer =
BsonIdlTypeDeserializer::new(type_map.clone(), opts);
Self {
name: field.name.clone(),
ty: field.ty.clone(),
ty_deserealizer,
type_map,
}
}
pub fn deserialize(
&self,
doc: &mut RawDocumentBuf,
buf: &mut &[u8],
) -> ChainsawResult<()> {
let val =
self.ty_deserealizer
.deserialize(&self.ty, buf)
.map_err(|e| {
ChainsawError::FieldDeserializeError(
self.name.to_string(),
Box::new(e),
)
})?;
doc.append(&self.name, val);
Ok(())
}
}