use solana_idl::{IdlField, IdlType};
use std::fmt::Write;
use crate::{
errors::ChainsawResult,
json::json_serialization_opts::JsonSerializationOpts, ChainsawError,
};
use super::{
json_idl_type_de::JsonIdlTypeDeserializer,
JsonTypeDefinitionDeserializerMap,
};
#[derive(Clone)]
pub struct JsonIdlFieldDeserializer<'opts> {
pub name: String,
pub ty: IdlType,
pub ty_deserealizer: JsonIdlTypeDeserializer<'opts>,
pub type_map: JsonTypeDefinitionDeserializerMap<'opts>,
}
impl<'opts> JsonIdlFieldDeserializer<'opts> {
pub fn new(
field: &IdlField,
type_map: JsonTypeDefinitionDeserializerMap<'opts>,
opts: &'opts JsonSerializationOpts,
) -> Self {
let ty_deserealizer =
JsonIdlTypeDeserializer::new(type_map.clone(), opts);
Self {
name: field.name.clone(),
ty: field.ty.clone(),
ty_deserealizer,
type_map,
}
}
pub fn deserialize<W: Write>(
&self,
f: &mut W,
buf: &mut &[u8],
) -> ChainsawResult<()> {
f.write_char('"')?;
f.write_str(&self.name)?;
f.write_str("\":")?;
self.ty_deserealizer
.deserialize(&self.ty, f, buf)
.map_err(|e| {
ChainsawError::FieldDeserializeError(
self.name.to_string(),
Box::new(e),
)
})
}
}