unity_asset_binary/
data_view.rs

1use crate::error::{BinaryError, Result};
2use crate::shared_bytes::SharedBytes;
3use std::ops::Range;
4
5#[derive(Debug, Clone)]
6pub struct DataView {
7    data: SharedBytes,
8    start: usize,
9    len: usize,
10}
11
12impl DataView {
13    pub fn from_shared(data: SharedBytes) -> Self {
14        let len = data.len();
15        Self {
16            data,
17            start: 0,
18            len,
19        }
20    }
21
22    pub fn from_shared_range(data: SharedBytes, range: Range<usize>) -> Result<Self> {
23        if range.start > range.end {
24            return Err(BinaryError::invalid_data(format!(
25                "Invalid DataView range: {}..{}",
26                range.start, range.end
27            )));
28        }
29        let total = data.len();
30        if range.end > total {
31            return Err(BinaryError::not_enough_data(range.end, total));
32        }
33        Ok(Self {
34            data,
35            start: range.start,
36            len: range.end - range.start,
37        })
38    }
39
40    pub fn as_bytes(&self) -> &[u8] {
41        &self.data.as_bytes()[self.start..self.start + self.len]
42    }
43
44    pub fn len(&self) -> usize {
45        self.len
46    }
47
48    pub fn is_empty(&self) -> bool {
49        self.len == 0
50    }
51
52    pub fn backing_shared(&self) -> SharedBytes {
53        self.data.clone()
54    }
55
56    pub fn base_offset(&self) -> usize {
57        self.start
58    }
59
60    pub fn absolute_range(&self) -> Range<usize> {
61        self.start..self.start + self.len
62    }
63
64    pub fn identity_key(&self) -> (usize, usize, usize) {
65        (self.data.ptr_usize(), self.start, self.len)
66    }
67}