MCPcopy Create free account
hub / github.com/atomicdotdev/atomic / deserialize_view_state

Function deserialize_view_state

atomic-core/src/pristine/txn/helpers.rs:106–171  ·  view source on GitHub ↗

Deserialize bytes to a ViewState Backward-compatible: if the v2 fields (`kind`, `parent`) are missing (i.e., the data was written by an older version), defaults to `ViewScope::Shared` and `parent: None`.

(bytes: &[u8])

Source from the content-addressed store, hash-verified

104/// (i.e., the data was written by an older version), defaults to
105/// `ViewScope::Shared` and `parent: None`.
106pub fn deserialize_view_state(bytes: &[u8]) -> PristineResult<ViewState> {
107 const MIN_SIZE: usize = 8 + 4; // id + name_len
108
109 if bytes.len() < MIN_SIZE {
110 return Err(PristineError::Serialization {
111 message: "view state too short".to_string(),
112 });
113 }
114
115 let id = u64::from_le_bytes(bytes[0..8].try_into().unwrap());
116 let name_len = u32::from_le_bytes(bytes[8..12].try_into().unwrap()) as usize;
117
118 // v1 size: header(12) + name + merkle(32) + change_count(8)
119 let v1_size = 12 + name_len + 32 + 8;
120 if bytes.len() < v1_size {
121 return Err(PristineError::Serialization {
122 message: "view state truncated".to_string(),
123 });
124 }
125
126 let name = String::from_utf8(bytes[12..12 + name_len].to_vec()).map_err(|_| {
127 PristineError::Serialization {
128 message: "invalid view name encoding".to_string(),
129 }
130 })?;
131
132 let mut merkle_bytes = [0u8; 32];
133 merkle_bytes.copy_from_slice(&bytes[12 + name_len..12 + name_len + 32]);
134 let state = Merkle::from_bytes(merkle_bytes);
135
136 let change_count = u64::from_le_bytes(
137 bytes[12 + name_len + 32..12 + name_len + 40]
138 .try_into()
139 .unwrap(),
140 );
141
142 // v2 fields: kind(1) + parent(8) = 9 additional bytes
143 let v2_size = v1_size + 1 + 8;
144 let (kind, parent) = if bytes.len() >= v2_size {
145 let kind_byte = bytes[v1_size];
146 let kind = ViewScope::from_u8(kind_byte).ok_or_else(|| PristineError::Serialization {
147 message: format!("invalid view kind: {}", kind_byte),
148 })?;
149
150 let parent_val = u64::from_le_bytes(bytes[v1_size + 1..v1_size + 9].try_into().unwrap());
151 let parent = if parent_val == NO_PARENT {
152 None
153 } else {
154 Some(parent_val)
155 };
156
157 (kind, parent)
158 } else {
159 // v1 data — default to Shared with no parent
160 (ViewScope::Shared, None)
161 };
162
163 Ok(ViewState {

Callers 15

get_view_by_idMethod · 0.85
get_viewMethod · 0.85
openMethod · 0.85
scan_idsMethod · 0.85

Calls 2

lenMethod · 0.45
unwrapMethod · 0.45