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.rs16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/classes/pptr.rs b/src/classes/pptr.rs
index 9d9becc..d6e4bb6 100644
--- a/src/classes/pptr.rs
+++ b/src/classes/pptr.rs
@@ -1,6 +1,6 @@
use super::HValue;
use crate::object::{Value, parser::FromValue};
-use anyhow::Result;
+use anyhow::{Result, anyhow, bail};
use serde::Serialize;
use std::marker::PhantomData;
@@ -16,18 +16,22 @@ pub struct PPtr<T = HValue> {
impl<T> FromValue for PPtr<T> {
fn from_value(v: Value) -> Result<Self> {
let Value::Object { class, fields } = v else {
- unreachable!()
+ bail!("PPtr expected but not an object")
};
let inner = class
.strip_prefix("PPtr<")
- .unwrap()
+ .ok_or(anyhow!("not a PPtr"))?
.strip_suffix(">")
- .unwrap();
+ .ok_or(anyhow!("PPtr '>' missing"))?;
Ok(PPtr {
class: inner.to_owned(),
_class: PhantomData,
- file_id: fields["m_FileID"].as_i32().unwrap(),
- path_id: fields["m_PathID"].as_i64().unwrap(),
+ 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"))?,
})
}
}