#protocols #macro #binary #helper #serde #enums #io-error

macro netgauze-serde-macros

Helper macros to make ser/deser binary protocols easier

8 releases (5 breaking)

new 0.6.0 Mar 18, 2025
0.5.0 Nov 5, 2024
0.4.1 Aug 8, 2024
0.3.1 Oct 10, 2024
0.1.0 Mar 5, 2023

#64 in #io-error

Download history 36/week @ 2024-11-28 42/week @ 2024-12-05 121/week @ 2024-12-12 21/week @ 2024-12-19 2/week @ 2024-12-26 4/week @ 2025-01-02 15/week @ 2025-01-09 24/week @ 2025-01-16 30/week @ 2025-01-23 9/week @ 2025-01-30 19/week @ 2025-02-06 41/week @ 2025-02-13 35/week @ 2025-02-20 24/week @ 2025-02-27 19/week @ 2025-03-06 134/week @ 2025-03-13

217 downloads per month
Used in 4 crates

Apache-2.0

22KB
336 lines

Helper macros to make ser/deser binary protocols easier

LocatedError: For a given error enum {Name} generate a struct called Located{Name} that carries the Span (the error location in the input stream) info along the error. Additionally, generates From for nom library errors, external, and another located errors.

use netgauze_serde_macros::LocatedError;

#[derive(LocatedError, Eq, PartialEq, Clone, Debug)]
pub enum ExtendedCommunityParsingError {
    NomError(#[from_nom] nom::error::ErrorKind),
    CommunityError(#[from_located(module = "self")] CommunityParsingError),
    UndefinedCapabilityCode(#[from_external] UndefinedBgpCapabilityCode),
}

#[derive(LocatedError, Eq, PartialEq, Clone, Debug)]
pub enum CommunityParsingError {
    NomError(#[from_nom] nom::error::ErrorKind),
}

#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub struct UndefinedBgpCapabilityCode(pub u8);

fn test() {
    let span = Span::new(&[1, 2, 3]);
    // LocatedExtendedCommunityParsingError is generated by LocatedError
    let _located = LocatedExtendedCommunityParsingError::new(
        span,
        ExtendedCommunityParsingError::UndefinedCapabilityCode(UndefinedBgpCapabilityCode(1)));
}

WritingError: Decorate an enum as an error for serializing binary protocol provides the following decorations for any members of the enum.

  1. #[from_std_io_error] automatically generate From implementation from std::io::Error to a String.
  2. #[from], automatically generates a From implementation for a given type.

Example:

use netgauze_serde_macros::WritingError;

#[derive(WritingError, Eq, PartialEq, Clone, Debug)]
pub enum BgpMessageWritingError {
    /// std::io::Error will be converted to this value
    StdIOError(#[from_std_io_error] String),

    /// BgpOpenMessageWritingError will be converted to this value
    OpenError(#[from] BgpOpenMessageWritingError),
}

Dependencies

~200–630KB
~15K SLoC