aboutsummaryrefslogtreecommitdiff
path: root/src/classes/pptr.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/classes/pptr.rs')
-rw-r--r--src/classes/pptr.rs39
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,
+ }
+ }
+}