use super::HValue; use crate::object::Value; use anyhow::Result; use serde::Serialize; use std::marker::PhantomData; #[derive(Debug, Serialize)] pub struct PPtr { _class: PhantomData, pub class: String, pub file_id: i32, pub path_id: i64, } impl PPtr { pub fn from_value(v: Value) -> Result { let Value::Object { class, fields } = v else { unreachable!() }; let inner = class .strip_prefix("PPtr<") .unwrap() .strip_suffix(">") .unwrap(); Ok(PPtr { class: inner.to_owned(), _class: PhantomData, file_id: fields["m_FileID"].as_i32().unwrap(), path_id: fields["m_PathID"].as_i64().unwrap(), }) } pub fn cast(self) -> PPtr { PPtr { _class: PhantomData, class: self.class, file_id: self.file_id, path_id: self.path_id, } } }