Fast and robust atproto CAR file processing in rust
14
fork

Configure Feed

Select the types of activity you want to include in your feed.

maybe this is it

phil 26632b97 e758674a

+21 -31
+21 -31
src/walk.rs
··· 152 152 Ok(Step::End(None)) 153 153 } 154 154 155 - pub fn step_to_slice_edge( 155 + #[allow(dead_code)] 156 + pub fn edge( 156 157 &mut self, 157 158 blocks: &mut HashMap<Cid, MaybeProcessedBlock>, 158 159 ) -> Result<Option<Rkey>, WalkError> { 159 160 let mut ant = self.clone(); 160 - let mut ant_prev; 161 - let mut rkey_prev = None; 162 - 163 - loop { 164 - ant_prev = ant.clone(); 165 - ant = ant.clone(); 166 - 167 - let Some(NodeThing { cid, kind }) = ant.next_todo() else { 168 - return Ok(None); 169 - }; 161 + let mut rkey_prev: Option<Rkey> = None; 162 + let dummy_mpb = MaybeProcessedBlock::Raw(vec![].into()); 170 163 171 - let maybe_mpb = blocks.get(&cid); 172 - 173 - match (&kind, maybe_mpb) { 174 - (ThingKind::Value { rkey: _ }, Some(_)) => { 175 - // oops we took a step too far 176 - *self = ant_prev; 177 - return Ok(rkey_prev); 164 + while let Some(NodeThing { cid, kind }) = ant.next_todo() { 165 + match kind { 166 + ThingKind::Tree => { 167 + let mpb = blocks 168 + .get(&cid) 169 + .ok_or_else(|| WalkError::MissingBlock(NodeThing { cid, kind: ThingKind::Tree }))?; 170 + assert!(ant.mpb_step(kind, cid, mpb, noop)?.is_none()); 178 171 } 179 - (ThingKind::Value { rkey }, None) => { 180 - if let Some(p) = rkey_prev && *rkey <= p { 181 - return Err(WalkError::MstError(MstError::RkeyOutOfOrder { 182 - rkey: rkey.clone(), 183 - prev: p, 184 - })); 172 + ThingKind::Value { ref rkey } => { 173 + if blocks.get(&cid).is_some() { 174 + return Ok(rkey_prev); 185 175 } 186 176 rkey_prev = Some(rkey.clone()); 187 - } 188 - (ThingKind::Tree, Some(mpb)) => { 189 - ant.mpb_step(kind, cid, mpb, noop)?; 177 + assert!(ant.mpb_step(kind, cid, &dummy_mpb, noop)?.is_some()); 178 + 179 + *self = ant; 180 + ant = self.clone(); 190 181 } 191 - (ThingKind::Tree, None) => { 192 - return Err(WalkError::MissingBlock(NodeThing { cid, kind })); 193 - } 194 - } 182 + }; 183 + 195 184 } 185 + Ok(None) 196 186 } 197 187 198 188 /// blocking!!!!!!