sol-chainsaw 0.0.2

Deserializing Solana accounts using their progam IDL
Documentation
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(())
    }
}