use lief_ffi as ffi;
use super::DyldSharedCache;
use crate::common::{FromFFI, into_optional};
use crate::dsc::UUID;
use std::marker::PhantomData;
pub struct SubCache<'a> {
ptr: cxx::UniquePtr<ffi::dsc_SubCache>,
_owner: PhantomData<&'a ()>,
}
impl FromFFI<ffi::dsc_SubCache> for SubCache<'_> {
fn from_ffi(ptr: cxx::UniquePtr<ffi::dsc_SubCache>) -> Self {
Self {
ptr,
_owner: PhantomData,
}
}
}
impl SubCache<'_> {
pub fn uuid(&self) -> UUID {
let vec = Vec::from(self.ptr.uuid().as_slice());
assert!(vec.len() == 16);
let mut uuid: UUID = [0; 16];
for i in 0..16 {
uuid[i] = vec[i] as u8;
}
uuid
}
pub fn vm_offset(&self) -> u64 {
self.ptr.vm_offset()
}
pub fn suffix(&self) -> String {
self.ptr.suffix().to_string()
}
pub fn cache(&self) -> Option<DyldSharedCache> {
into_optional(self.ptr.cache())
}
}
impl std::fmt::Debug for SubCache<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SubCache")
.field("uuid", &self.uuid())
.field("vm_offset", &self.vm_offset())
.field("suffix", &self.suffix())
.finish()
}
}