diff options
Diffstat (limited to 'src/classes/pptr.rs')
-rw-r--r-- | src/classes/pptr.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/classes/pptr.rs b/src/classes/pptr.rs new file mode 100644 index 0000000..1f615ab --- /dev/null +++ b/src/classes/pptr.rs @@ -0,0 +1,39 @@ +use super::HValue; +use crate::object::Value; +use anyhow::Result; +use serde::Serialize; +use std::marker::PhantomData; + +#[derive(Debug, Serialize)] +pub struct PPtr<T = HValue> { + _class: PhantomData<T>, + pub class: String, + pub file_id: i32, + pub path_id: i64, +} +impl PPtr { + pub fn from_value(v: Value) -> Result<Self> { + 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<T>(self) -> PPtr<T> { + PPtr { + _class: PhantomData, + class: self.class, + file_id: self.file_id, + path_id: self.path_id, + } + } +} |