deku_string 0.4.1

Encoding/decoding helpers for Deku, String, Vec in fixed, Pascal, .NET and C-style formats with length guarantee.
Documentation
#![allow(
    clippy::tests_outside_test_module,
    reason = "<https://github.com/rust-lang/rust-clippy/issues/11024>"
)]

use deku_string::{Encoding, Size, StringDeku, StringLayout};
use rstest::rstest;
use test_utils::{assert_model_read, assert_model_write};

#[derive(
    Default, Debug, Clone, PartialEq, PartialOrd, deku::DekuRead, deku::DekuWrite,
)]
#[deku(endian = "little")]
struct LayoutsTestModel {
    #[deku(ctx = "Encoding::Utf8, StringLayout::fixed_length(10)")]
    utf8_fixed_value_force_zero: StringDeku,

    #[deku(ctx = "Encoding::Utf8, StringLayout::FixedLength{size: 10, \
                  allow_no_null: true}")]
    utf8_fixed_value: StringDeku,

    #[deku(ctx = "Encoding::Utf8, StringLayout::LengthPrefix(Size::U8)")]
    utf8_prefixed_u8: StringDeku,

    #[deku(ctx = "Encoding::Utf8, StringLayout::LengthPrefix(Size::U16)")]
    utf8_prefixed_u16: StringDeku,

    #[deku(ctx = "Encoding::Utf8, StringLayout::LengthPrefix(Size::U32)")]
    utf8_prefixed_u32: StringDeku,

    #[deku(ctx = "Encoding::Utf8, StringLayout::LengthPrefix(Size::U32_7Bit)")]
    utf8_prefixed_u32_7bit: StringDeku,

    #[deku(ctx = "Encoding::Utf8, StringLayout::ZeroEnded")]
    utf8_zero_ended: StringDeku,

    #[deku(ctx = "Encoding::Utf16, StringLayout::fixed_length(10)")]
    utf16_fixed_value_force_zero: StringDeku,

    #[deku(ctx = "Encoding::Utf16, StringLayout::FixedLength{size: 10, \
                  allow_no_null: true}")]
    utf16_fixed_value: StringDeku,

    #[deku(ctx = "Encoding::Utf16, StringLayout::LengthPrefix(Size::U8)")]
    utf16_prefixed_u8: StringDeku,

    #[deku(ctx = "Encoding::Utf16, StringLayout::LengthPrefix(Size::U16)")]
    utf16_prefixed_u16: StringDeku,

    #[deku(ctx = "Encoding::Utf16, StringLayout::LengthPrefix(Size::U32)")]
    utf16_prefixed_u32: StringDeku,

    #[deku(ctx = "Encoding::Utf16, StringLayout::ZeroEnded")]
    utf16_zero_ended: StringDeku,
}

const EXPECTED_BYTES: &[u8; 78] = &[0; 78];

#[rstest]
fn write_model() {
    let model: LayoutsTestModel = LayoutsTestModel::default();

    assert_model_write(&model, EXPECTED_BYTES);
}

#[rstest]
fn read_model() {
    let expected_model = LayoutsTestModel::default();

    assert_model_read(EXPECTED_BYTES, &expected_model);
}