Releases: mumbleskates/bilrost
Releases · mumbleskates/bilrost
v0.1012.2
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
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
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
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
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
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
v0.1012.1
Fixes
- Internals macros: Fixed the
empty_state_via_for_overwrite
macro, which was
incompletely implemented and still referenced theDefault
trait.
v0.1012.0
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 bothMessage
andOwnedMessage
traits to have the desired
functionality in scope. -
The
DistinguishedMessage
andDistinguishedOneof
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 structOneof
,DistinguishedOneof
Oneof
with#[bilrost(distinguished)]
on the enumall of the above Message
&Oneof
with#[bilrost(distinguished)]
on the enumjust 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 forCow
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:- Decode directly from
bytes::Bytes
and into fields of type
bytes::Bytes
orbytestring::Bytestring
. This yields owned, refcounted
handles to the original data. - 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.
- Decode directly from
- This adds support for the types
- Derive macros are now simpler to use, so now deriving all encoding and
decoding impls for messages and oneofs is done only withMessage
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>>
andFrom<Box<[u8]>>
impls forReverseBuffer
. - 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; seeencoding::{Proxied, Proxiable}
for details.- These can be used even to encode third-party types foreign to both your own
crate and tobilrost
(via type-tagged impls) and completely break the
guarantees of thebilrost
library. I do my best, but correctness is in
your hands!
- These can be used even to encode third-party types foreign to both your own
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 aCanonicity
should
be checked against the restricted context onRestrictedDecodeContext::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.
- It's unlikely this should change any behavior as formerly the canonicity was
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 aduplicated
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
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
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
andstd::time::SystemTime
. - Added 3rd party type support for the
bstr
crate and itsBString
type,
which is a wrapper aroundVec<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
andtime
crates and most of
their important types, available through new crate features. Oneof
types can now be wrapped inBox
(multiple times even, and either
side ofOption
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 needlesslet 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
andclippy
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 thevalue_traits
module now contains only traits and
macros and all conditionally-enabled code has been moved intotype_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.