Skip to main content

Strictness

Struct Strictness 

Source
pub struct Strictness {
    pub allow_non_shortest_integers: bool,
    pub allow_non_shortest_floats: bool,
    pub allow_oversized_bigints: bool,
    pub allow_unsorted_map_keys: bool,
    pub allow_duplicate_map_keys: bool,
    pub allow_indefinite_length: bool,
}
Expand description

Policy for accepting non-deterministic CBOR encodings during a decode.

CBOR::Core requires every value to be encoded in a single canonical form. The default decoder enforces that and rejects any deviation with Error::NonDeterministic. Some producers (legacy encoders, bridges from other formats, hand written test vectors) emit valid CBOR that violates one or more of these rules. Strictness selects which violations the decoder tolerates so that such input can still be read.

Each tolerated violation is normalized while decoding: the resulting Value is the same value the canonical encoder would produce, and re-encoding it always yields a CBOR::Core compliant byte sequence. The original wire bytes are not preserved.

The default, Strictness::STRICT, matches the CBOR::Core draft exactly. Strictness::LENIENT accepts every supported deviation. Set individual fields for a custom mix.

§Examples

use cbor_core::{DecodeOptions, Strictness, Value};

// 255 wrongly encoded with a two byte argument (canonical: 0x18 0xff).
let bytes = [0x19, 0x00, 0xff];

// Default: rejected.
assert!(DecodeOptions::new().decode(&bytes).is_err());

// Lenient: accepted and normalized.
let v = DecodeOptions::new()
    .strictness(Strictness::LENIENT)
    .decode(&bytes)
    .unwrap();
assert_eq!(v, Value::from(255));
assert_eq!(v.encode(), vec![0x18, 0xff]);

Fields§

§allow_non_shortest_integers: bool

Accept integers, lengths, and tag numbers encoded in a wider argument than necessary (for example 0x19 0x00 0xff for the value 255 instead of 0x18 0xff).

§allow_non_shortest_floats: bool

Accept floating point values encoded in a wider form than necessary (for example an f32 that fits exactly in f16). The decoded Float is re-stored in the shortest form that preserves the value bit for bit, including NaN payloads.

§allow_oversized_bigints: bool

Accept big integer tags (tag 2 / tag 3) whose payload has leading zero bytes or fits into a u64. Leading zeros are stripped; a value that fits is downcast to Value::Unsigned or Value::Negative.

§allow_unsorted_map_keys: bool

Accept maps whose keys are not in CBOR canonical (length and then bytewise) order. Keys are sorted by Value after decoding, which is equivalent to canonical order once each value has been re-encoded in shortest form. With allow_non_shortest_integers off, the two orders coincide; with it on, the by-value order is the only well-defined choice because the original byte lengths are normalized away.

§allow_duplicate_map_keys: bool

Accept maps that contain the same key more than once. The last occurrence wins, matching Map::from_pairs.

§allow_indefinite_length: bool

Accept indefinite-length encodings (RFC 8949 §3.2.2) for byte strings, text strings, arrays, and maps. The chunks of an indefinite-length string are concatenated; an indefinite-length array or map is read until the break code. The resulting Value is the same that a definite-length encoding would produce, so re-encoding emits canonical bytes.

In Format::Diagnostic input, the flag also enables the matching RFC 8949 §8 spellings: [_ ...], {_ ...}, and (_ chunk, ...).

Implementations§

Source§

impl Strictness

Source

pub const STRICT: Self

Reject every form of non-deterministic encoding. Default for DecodeOptions.

Source

pub const LENIENT: Self

Accept every non-deterministic encoding the decoder knows how to normalize. The resulting Value is canonical; re-encoding it produces CBOR::Core compliant bytes.

Trait Implementations§

Source§

impl Clone for Strictness

Source§

fn clone(&self) -> Strictness

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Strictness

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Strictness

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Hash for Strictness

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Strictness

Source§

fn eq(&self, other: &Strictness) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for Strictness

Source§

impl Eq for Strictness

Source§

impl StructuralPartialEq for Strictness

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Az for T

Source§

fn az<Dst>(self) -> Dst
where T: Cast<Dst>,

Casts the value.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Src, Dst> CastFrom<Src> for Dst
where Src: Cast<Dst>,

Source§

fn cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> CheckedAs for T

Source§

fn checked_as<Dst>(self) -> Option<Dst>
where T: CheckedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> CheckedCastFrom<Src> for Dst
where Src: CheckedCast<Dst>,

Source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> OverflowingAs for T

Source§

fn overflowing_as<Dst>(self) -> (Dst, bool)
where T: OverflowingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dst
where Src: OverflowingCast<Dst>,

Source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
Source§

impl<T> SaturatingAs for T

Source§

fn saturating_as<Dst>(self) -> Dst
where T: SaturatingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dst
where Src: SaturatingCast<Dst>,

Source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> StrictAs for T

Source§

fn strict_as<Dst>(self) -> Dst
where T: StrictCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> StrictCastFrom<Src> for Dst
where Src: StrictCast<Dst>,

Source§

fn strict_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> UnwrappedAs for T

Source§

fn unwrapped_as<Dst>(self) -> Dst
where T: UnwrappedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dst
where Src: UnwrappedCast<Dst>,

Source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> WrappingAs for T

Source§

fn wrapping_as<Dst>(self) -> Dst
where T: WrappingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> WrappingCastFrom<Src> for Dst
where Src: WrappingCast<Dst>,

Source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.