rtcm-rs 0.11.0

Encoding/decoding of RTCM v. 3
Documentation
use crate::df::bit_value::*;
use crate::df::{assembler::Assembler, parser::Parser};
use crate::rtcm_error::RtcmError;
use crate::util::ArrayString;

pub mod export_types {}

pub type DataType = ArrayString<255>;

#[allow(unused)]
pub fn encode(asm: &mut Assembler, value: &DataType) -> Result<(), RtcmError> {
    let utf8str = &**value;
    let byte_len = utf8str.bytes().len();
    let char_len = utf8str.chars().count();
    if byte_len > 255 || char_len > 127 {
        return Err(RtcmError::BufferOverflow);
    }

    asm.put::<U8>(char_len as u8, 7)?;
    asm.put::<U8>(byte_len as u8, 8)?;

    for b in utf8str.bytes() {
        asm.put::<U8>(b, 8)?;
    }

    Ok(())
}

#[allow(unused)]
pub fn decode(par: &mut Parser) -> Result<DataType, RtcmError> {
    let _ = par.parse::<U8>(7)?;
    let len = par.parse::<U8>(8)? as usize;
    let data = par.data();
    if data.len() < len {
        return Err(RtcmError::BufferOverflow);
    }
    if let Ok(utf8_str) = core::str::from_utf8(&data[..len]) {
        let array_string = ArrayString::from(utf8_str);
        par.consume_bits(len * 8);
        Ok(array_string)
    } else {
        par.consume_bits(len * 8);
        Err(RtcmError::InvalidUtf8String)
    }
}

#[cfg(feature = "test_gen")]
use crate::val_gen::ValGen;
#[cfg(feature = "test_gen")]
#[allow(unused)]
pub fn generate<FR, LR, RR>(
    asm: &mut Assembler,
    val_gen: &mut ValGen<FR, LR, RR>,
) -> Result<DataType, RtcmError>
where
    FR: rand::Rng,
    LR: rand::Rng,
    RR: rand::Rng,
{
    let mut array_string = ArrayString::<255>::new();
    let char_len = val_gen.len_rng.gen::<usize>() % 128;
    for i in 0..char_len {
        let ch: char = match i {
            i if i <= 25 => char::from_u32(0x61 + i as u32).unwrap(),
            i if i <= 50 => char::from_u32(0x190 + i as u32).unwrap(),
            i if i <= 75 => char::from_u32(0x430 + i as u32).unwrap(),
            i if i <= 100 => char::from_u32(0x680 + i as u32).unwrap(),
            _ => char::from_u32(0x4e00 + i as u32).unwrap(),
        };
        if array_string.try_push(ch).is_err() {
            break;
        }
    }
    let char_len = array_string.chars().count();
    let byte_len = array_string.bytes().len();

    asm.put::<U8>(char_len as u8, 7)?;
    asm.put::<U8>(byte_len as u8, 8)?;

    for b in array_string.bytes() {
        asm.put::<U8>(b, 8)?;
    }

    Ok(array_string)
}