unity_asset_binary/
data_view.rs1use 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}