use super::HValue; use crate::object::{Value, parser::FromValue}; use anyhow::{Result, anyhow, bail}; use serde::Serialize; use std::marker::PhantomData; #[derive(Debug, Serialize)] pub struct PPtr { #[serde(skip, default)] _class: PhantomData, pub class: String, pub file_id: i32, pub path_id: i64, } impl FromValue for PPtr { fn from_value(v: Value) -> Result { let Value::Object { class, fields } = v else { bail!("PPtr expected but not an object") }; let inner = class .strip_prefix("PPtr<") .ok_or(anyhow!("not a PPtr"))? .strip_suffix(">") .ok_or(anyhow!("PPtr '>' missing"))?; Ok(PPtr { class: inner.to_owned(), _class: PhantomData, file_id: fields["m_FileID"] .as_i32() .ok_or(anyhow!("PPtr m_FileID is not i32"))?, path_id: fields["m_PathID"] .as_i64() .ok_or(anyhow!("PPtr m_FileID is not i64"))?, }) } } impl PPtr { pub fn cast(self) -> PPtr { PPtr { _class: PhantomData, class: self.class, file_id: self.file_id, path_id: self.path_id, } } }