grib 0.16.0

GRIB format parser & writer for Rust
Documentation
use ::rust_aec::{AecParams, decode_into, flags_from_grib2_ccsds_flags};

pub(crate) struct Stream {
    bits_per_sample: u32,
    block_size: u32,
    rsi: u32,
    flags: u32,
    output_samples: Option<usize>,
}

impl Stream {
    pub(crate) fn new(bits_per_sample: u32, block_size: u32, rsi: u32, flags: u32) -> Self {
        Self {
            bits_per_sample,
            block_size,
            rsi,
            flags,
            output_samples: None,
        }
    }

    pub(crate) fn set_output_samples(&mut self, output_samples: usize) {
        self.output_samples = Some(output_samples);
    }

    pub(crate) fn decode(&mut self, input: &[u8], output: &mut [u8]) -> Result<(), String> {
        let bits_per_sample = u8::try_from(self.bits_per_sample)
            .map_err(|_| format!("bits_per_sample is too large: {}", self.bits_per_sample))?;
        let output_samples = self
            .output_samples
            .ok_or_else(|| "CCSDS output sample count was not set".to_owned())?;

        let params = AecParams::new(
            bits_per_sample,
            self.block_size,
            self.rsi,
            flags_from_grib2_ccsds_flags((self.flags & 0xff) as u8),
        );
        decode_into(input, params, output_samples, output)
            .map_err(|err| format!("rust-aec decode failed: {err}"))
    }
}