unity-asset-binary 0.2.0

Unity binary file format parser (AssetBundle, SerializedFile)
Documentation
use crate::error::{BinaryError, Result};
use crate::shared_bytes::SharedBytes;
use std::ops::Range;

#[derive(Debug, Clone)]
pub struct DataView {
    data: SharedBytes,
    start: usize,
    len: usize,
}

impl DataView {
    pub fn from_shared(data: SharedBytes) -> Self {
        let len = data.len();
        Self {
            data,
            start: 0,
            len,
        }
    }

    pub fn from_shared_range(data: SharedBytes, range: Range<usize>) -> Result<Self> {
        if range.start > range.end {
            return Err(BinaryError::invalid_data(format!(
                "Invalid DataView range: {}..{}",
                range.start, range.end
            )));
        }
        let total = data.len();
        if range.end > total {
            return Err(BinaryError::not_enough_data(range.end, total));
        }
        Ok(Self {
            data,
            start: range.start,
            len: range.end - range.start,
        })
    }

    pub fn as_bytes(&self) -> &[u8] {
        &self.data.as_bytes()[self.start..self.start + self.len]
    }

    pub fn len(&self) -> usize {
        self.len
    }

    pub fn is_empty(&self) -> bool {
        self.len == 0
    }

    pub fn backing_shared(&self) -> SharedBytes {
        self.data.clone()
    }

    pub fn base_offset(&self) -> usize {
        self.start
    }

    pub fn absolute_range(&self) -> Range<usize> {
        self.start..self.start + self.len
    }

    pub fn identity_key(&self) -> (usize, usize, usize) {
        (self.data.ptr_usize(), self.start, self.len)
    }
}