chainparser 0.3.0

Parses Solana account data using provided IDL
Documentation
use borsh::BorshDeserialize;
use solana_idl::IdlType;
use solana_sdk::pubkey::Pubkey;

use super::{
    floats::{deserialize_f32, deserialize_f64},
    ChainparserDeserialize,
};
use crate::errors::{ChainparserError, ChainparserResult as Result};

#[derive(Clone, Copy)]
pub struct BorshDeserializer;

impl ChainparserDeserialize for BorshDeserializer {
    fn u8(&self, buf: &mut &[u8]) -> Result<u8> {
        u8::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "u8".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn u16(&self, buf: &mut &[u8]) -> Result<u16> {
        u16::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "u16".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn u32(&self, buf: &mut &[u8]) -> Result<u32> {
        u32::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "u32".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn u64(&self, buf: &mut &[u8]) -> Result<u64> {
        u64::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "u64".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn u128(&self, buf: &mut &[u8]) -> Result<u128> {
        u128::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "u128".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn i8(&self, buf: &mut &[u8]) -> Result<i8> {
        i8::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "i8".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn i16(&self, buf: &mut &[u8]) -> Result<i16> {
        i16::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "i16".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn i32(&self, buf: &mut &[u8]) -> Result<i32> {
        i32::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "i32".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn i64(&self, buf: &mut &[u8]) -> Result<i64> {
        i64::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "i64".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn i128(&self, buf: &mut &[u8]) -> Result<i128> {
        i128::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "i128".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn f32(&self, buf: &mut &[u8]) -> Result<f32> {
        deserialize_f32(buf)
    }

    fn f64(&self, buf: &mut &[u8]) -> Result<f64> {
        deserialize_f64(buf)
    }

    fn bool(&self, buf: &mut &[u8]) -> Result<bool> {
        bool::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "bool".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn string(&self, buf: &mut &[u8]) -> Result<String> {
        String::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "String".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn bytes(&self, buf: &mut &[u8]) -> Result<Vec<u8>> {
        Vec::<u8>::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "bytes".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn pubkey(&self, buf: &mut &[u8]) -> Result<Pubkey> {
        Pubkey::deserialize(buf).map_err(|e| {
            ChainparserError::BorshDeserializeTypeError(
                "Pubkey".to_string(),
                e,
                buf.to_vec(),
            )
        })
    }

    fn option(&self, buf: &mut &[u8]) -> Result<bool> {
        self.u8(buf).map(|v| v != 0)
    }

    fn coption(&self, _buf: &mut &[u8], _inner: &IdlType) -> Result<bool> {
        Err(ChainparserError::DeserializerDoesNotSupportType(
            "borsh".to_string(),
            "coption".to_string(),
        ))
    }
}