Skip to content

Releases: mumbleskates/bilrost

v0.1012.2

02 Feb 04:02
Compare
Choose a tag to compare
v0.1012.2 Pre-release
Pre-release

Fixes

  • BUGFIX: Message implementations derived for oneof types no longer fail to skip
    the data in unknown fields that the mssage also contains.

v0.1011.2

02 Feb 04:02
Compare
Choose a tag to compare
v0.1011.2 Pre-release
Pre-release

Fixes

  • BUGFIX: Message implementations derived for oneof types no longer fail to skip
    the data in unknown fields that the mssage also contains.

v0.1010.2

02 Feb 04:02
Compare
Choose a tag to compare
v0.1010.2 Pre-release
Pre-release

Fixes

  • BUGFIX: Message implementations derived for oneof types no longer fail to skip
    the data in unknown fields that the mssage also contains.

v0.1009.1

02 Feb 04:01
Compare
Choose a tag to compare
v0.1009.1 Pre-release
Pre-release

Fixes

  • BUGFIX: Message implementations derived for oneof types no longer fail to skip
    the data in unknown fields that the mssage also contains.

v0.1008.1

02 Feb 04:01
Compare
Choose a tag to compare
v0.1008.1 Pre-release
Pre-release

Fixes

  • BUGFIX: Message implementations derived for oneof types no longer fail to skip
    the data in unknown fields that the mssage also contains.

v0.1007.1

02 Feb 04:01
Compare
Choose a tag to compare
v0.1007.1 Pre-release
Pre-release

Fixes

  • BUGFIX: Message implementations derived for oneof types no longer fail to skip
    the data in unknown fields that the mssage also contains.

v0.1012.1

21 Jan 11:38
Compare
Choose a tag to compare
v0.1012.1 Pre-release
Pre-release

v0.1012.1

Fixes

  • Internals macros: Fixed the empty_state_via_for_overwrite macro, which was
    incompletely implemented and still referenced the Default trait.

v0.1012.0

21 Jan 10:13
Compare
Choose a tag to compare
v0.1012.0 Pre-release
Pre-release

v0.1012.0

Breaking changes

  • This release includes a major overhaul of encoding and decoding traits for
    the library.

    Capability Old trait New trait
    encoding Message Message
    relaxed decoding (owned) Message OwnedMessage
    distinguished decoding (owned) DistinguishedMessage DistinguishedOwnedMessage
    relaxed decoding (borrowed) (new!) BorrowedMessage<'a>
    distinguished decoding (borrowed) (new!) DistinguishedBorrowedMessage<'a>

    For very simple usage of the bilrost library, this will now probably mean
    importing both Message and OwnedMessage traits to have the desired
    functionality in scope.

  • The DistinguishedMessage and DistinguishedOneof traits & derives are gone
    as well; rather than deriving multiple traits, simply add a
    #[bilrost(distinguished)] attribute to the type being derived from:

    Old derives New derives
    Message, DistinguishedMessage Message with #[bilrost(distinguished)] on the struct
    Oneof, DistinguishedOneof Oneof with #[bilrost(distinguished)] on the enum
    all of the above Message & Oneof with #[bilrost(distinguished)] on the enum
    just using Message, Oneof, & Enumeration (no change)

New features

  • It is now possible to do borrowed zero-copy decoding, which is enabled by
    default and available in the derive macros. This decodes from a &[u8] slice
    with lifetime into messages that may reference its data.
    • This adds support for the types &str, &[u8], &[u8; N], and
      &bstr::BStr; these types can appear in message fields, oneof fields, and
      nested in other containers just like any other type. This also adds
      guaranteed behavior for Cow for these borrowed types also decodes as
      Cow::Borrowed(&..) when decoding from borrowed data.
    • With this addition, there are now two different ways to have zero-copy
      decoding that each work slightly differently:
      1. Decode directly from bytes::Bytes and into fields of type
        bytes::Bytes or bytestring::Bytestring. This yields owned, refcounted
        handles to the original data.
      2. Decode borrowed from &[u8] and into fields of type &str, &[u8],
        &[u8; N], or &bstr::BStr. This yields data borrowed for a lifetime at
        very low cost, protected by the borrow checker rather than a refcount.
  • Derive macros are now simpler to use, so now deriving all encoding and
    decoding impls for messages and oneofs is done only with Message and
    Oneof, and distinguished implementations are switched on and off by
    attribute.
  • Opened the gates for crate documentation in the encoding module as the crate
    is getting closer to what could become a stable release.
  • Added From<Vec<u8>> and From<Box<[u8]>> impls for ReverseBuffer.
  • Added new forms of ranges in the reserved_tags attribute: 5.. and ..=5.
  • EXPERIMENTAL: Made public a couple macros and the proxying traits &
    encoding type; see encoding::{Proxied, Proxiable} for details.
    • These can be used even to encode third-party types foreign to both your own
      crate and to bilrost (via type-tagged impls) and completely break the
      guarantees of the bilrost library. I do my best, but correctness is in
      your hands!

Fixes

  • Internals: It should no longer be possible for restricted and canonical
    message decoding modes to return data or canonicity that is less than the
    restriction level that was specified, if a decoding implementation returns a
    lower canonicity but forgets to check against the restriction in the context.
    The worst that should happen is that the error is raised late, at the end of
    decoding, when it is too late to add information about the location of the
    error. There are also debug-only assertions that test that this should never
    happen, and explanatory documentation about exactly when a Canonicity should
    be checked against the restricted context on RestrictedDecodeContext::check.
    • It's unlikely this should change any behavior as formerly the canonicity was
      checked very aggressively in all existing implementations, far more often
      than it had to be.

Cleanups

  • Changed internal and external phrasing from "expedient" encoding to "relaxed".
  • More reorganization and file cleanups, splitting up some large files into more
    modules etc.
  • Cleaned up some docs in the encoding module.
  • Improved type coverage in the fuzz testing modules and gave the message
    definitions fixed field tags so existing fuzzing corpora will be maximally
    useful.
  • Internals: Ironed out a lingering annoyance with the field decoding APIs; the
    Decoder traits no longer accept a duplicated boolean argument that
    mandates returning an error when it is true. Instead, message implementations
    that have defined fields are responsible for creating the
    UnexpectedlyRepeated decoding error themselves.

v0.1011.1

07 Jan 20:05
Compare
Choose a tag to compare
v0.1011.1 Pre-release
Pre-release

V0.1011.1

Fixes

  • Oneof enums can now implement distinguished decoding even when one or more of
    their variants has a type with no "empty" state. 🎊

v0.1011.0

03 Jan 08:16
Compare
Choose a tag to compare
v0.1011.0 Pre-release
Pre-release

v0.1011.0

Breaking changes

  • The (unstable) internal encoding traits & types continue to evolve.
    • Oneof traits now encode and decode slightly differently and the traits
      bearing an empty state now have special responsibility for guarding against
      value duplication and recording error locations.
    • Distinguished encoding traits now use a different context type,.
      RestrictedDecodeContext, which restricts the minimum tolerated canonicity
      and allows for early exits and detailed errors about the location of
      non-canonical data problems.
    • DecodeContext now has public method visibility.

New features

  • Added support for core::time::Duration and std::time::SystemTime.
  • Added 3rd party type support for the bstr crate and its BString type,
    which is a wrapper around Vec<u8> that acts like text but does not guarantee
    UTF-8 and does not require any validation.
  • Added 3rd party type support for the chrono and time crates and most of
    their important types, available through new crate features.
  • Oneof types can now be wrapped in Box (multiple times even, and either
    side of Option if you really want.)
  • DistinguishedMessage: added "restricted" and "canonical" decoding methods
    alongside the existing "distinguished" ones, allowing decoding to stop early
    on canonicity errors.

Fixes

  • Rectify an ambiguous usage of PartialEq that could potentially cause
    compilation failures when supported types in the program support cross-type
    equality.
  • bilrost-derive: simplify some codegen to remove a needless let mut in
    derived decoding implementations.

Cleanups

  • bilrost-types: parsing fractional seconds with more than 9 digits now
    simply truncates instead of erring.
  • bilrost-types: parsing timestamps with "unknown local offset" timezones
    ("-00:00") is now tolerated, since the timezone information is discarded
    anyway.
  • bilrost-types: improved fuzzing binaries for datetime parsing.
  • New keywords and categories have been added to the crate metadata.
  • Various small cleanups to the readme and to the code as rustfmt and clippy
    develop more and stronger opinions.
  • Major reorganization of type implementations, especially of common value-trait
    implementations and third-party types. All that code is now filed under
    encoding::type_support and conditionally enabled at the file level. Impls
    for primitive and core types in the builtin encoders are still in those
    encoders' modules, but the value_traits module now contains only traits and
    macros and all conditionally-enabled code has been moved into type_support.
  • A new fuzzer binary is available specifically for the newer types which have
    the newer, slightly more abstract encoding paths. These fuzzers are typically
    run in the order of hundreds to thousands of CPU hours per significant change,
    and are available for you to run as well.