qubit-codec 0.17.4

Core codec traits and buffer conversion primitives for Rust
Documentation
// =============================================================================
//    Copyright (c) 2026 Haixing Hu.
//
//    SPDX-License-Identifier: Apache-2.0
//
//    Licensed under the Apache License, Version 2.0.
// =============================================================================
use core::num::NonZeroUsize;

/// Reports why a [`crate::Transcoder`] stopped converting input.
///
/// # Examples
///
/// ```
/// use core::num::NonZeroUsize;
/// use qubit_codec::TranscodeStatus;
///
/// let status = TranscodeStatus::need_output(NonZeroUsize::new(2).unwrap());
/// assert!(matches!(status, TranscodeStatus::NeedOutput { required } if required.get() == 2));
/// ```
#[must_use]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum TranscodeStatus {
    /// All currently supplied input was consumed.
    ///
    /// A `Complete` status means the current [`crate::Transcoder::transcode`]
    /// call consumed every input unit visible from the supplied `input_index`.
    /// Implementations must report [`NeedInput`](Self::NeedInput) for an
    /// incomplete input tail and [`NeedOutput`](Self::NeedOutput) when output
    /// capacity prevents further input consumption.
    Complete,

    /// More input is needed to complete the next output value.
    ///
    /// The transcoder does not consume incomplete input tails. If the call
    /// started at `start` and returned `progress`, preserve
    /// `input[start + progress.read()..]` before refilling the input buffer.
    /// If the caller has already advanced its input cursor by
    /// `progress.read()`, it can slice from that updated cursor directly.
    /// Apply the EOF policy when the upstream source is closed. Calling
    /// [`crate::Transcoder::finish`] does not pass this tail back to the
    /// transcoder.
    ///
    /// - `required`: Current minimum total input units required before retrying
    ///   from the current input position. A later retry may raise this lower
    ///   bound.
    NeedInput {
        /// Current minimum total input units required before retrying from the
        /// current input position. A later retry may raise this lower bound.
        required: NonZeroUsize,
    },

    /// More output capacity is needed before conversion can continue.
    ///
    /// - `required`: Total output units required from the current output
    ///   position.
    NeedOutput {
        /// Total output units required from the current output position.
        required: NonZeroUsize,
    },
}

impl TranscodeStatus {
    /// Creates a status that requests more input.
    ///
    /// # Parameters
    ///
    /// - `required`: Current minimum total input units required before retrying
    ///   from the current input position. A later retry may raise this lower
    ///   bound.
    ///
    /// # Returns
    ///
    /// Returns a [`TranscodeStatus::NeedInput`] value.
    #[inline]
    pub const fn need_input(required: NonZeroUsize) -> Self {
        Self::NeedInput { required }
    }

    /// Creates a status that requests more output capacity.
    ///
    /// # Parameters
    ///
    /// - `required`: Total output units required from the current output
    ///   position.
    ///
    /// # Returns
    ///
    /// Returns a [`TranscodeStatus::NeedOutput`] value.
    #[inline]
    pub const fn need_output(required: NonZeroUsize) -> Self {
        Self::NeedOutput { required }
    }
}