Skip to main content

sark_json/segment/document/
release.rs

1use std::{num::NonZero, ops::ControlFlow, task::Poll};
2
3use crate::segment::Document;
4
5/// Completed input and field projections that can only be released.
6#[must_use = "step or release the retained owners"]
7pub struct Release<'d> {
8    pub(super) document: Document<'d>,
9}
10
11impl Release<'_> {
12    /// Charges one unit for each field slot or input owner retired.
13    /// Preparation visits each field once and either copies or decodes it,
14    /// so each slot retains at most one projection owner.
15    pub fn step(mut self, budget: NonZero<usize>) -> ControlFlow<(), Self> {
16        let mut left = budget.get();
17        if self.retire(&mut left).is_ready() {
18            ControlFlow::Break(())
19        } else {
20            ControlFlow::Continue(self)
21        }
22    }
23
24    pub fn retire(&mut self, budget: &mut usize) -> Poll<()> {
25        self.document.retire(budget)
26    }
27
28    pub(in crate::segment) fn drain(
29        &mut self,
30        budget: &mut usize,
31    ) -> (Poll<()>, crate::segment::scanner::Released) {
32        self.document.drain(budget)
33    }
34}