Skip to content

Enable PacketBuilder in no_std (alloc/slice) while preserving std API#135

Merged
JulianSchmid merged 2 commits intoJulianSchmid:masterfrom
xyzzyz:amichalik/packet-builder-no-std
Apr 20, 2026
Merged

Enable PacketBuilder in no_std (alloc/slice) while preserving std API#135
JulianSchmid merged 2 commits intoJulianSchmid:masterfrom
xyzzyz:amichalik/packet-builder-no-std

Conversation

@xyzzyz
Copy link
Copy Markdown
Contributor

@xyzzyz xyzzyz commented Feb 21, 2026

PacketBuilder serialization is split from std::io::Write so packet building works in no_std environments while keeping std behavior intact.

Key changes

  • Introduce an internal writer abstraction (CoreWrite) and internal WriteError<IO, Content> in src/writer.rs.
  • Add an explicit alloc feature and make std depend on alloc.
  • Make PacketBuilder available without std.
  • Keep std write(...) -> BuildWriteError API, with BuildWriteError remaining std-only.
  • Add no_std-capable write APIs:
    • write_to_vec (alloc) with BuildVecWriteError
    • write_to_slice (no alloc) with BuildSliceWriteError
  • Refactor IPv4/IPv6 extension writing through shared internal methods used by both std and no_std paths.
  • Add docsrs cfg annotations for alloc-only APIs.
  • Add focused tests for vec and slice write paths:
    • write to empty vec
    • write to pre-populated vec
    • write to slice success path
    • write to slice too-small error path

Compatibility

  • std users keep existing PacketBuilder::write behavior.
  • no_std users gain packet serialization through vec/slice writers.

Summary by CodeRabbit

  • New Features

    • Write packets directly to slices or vectors via new write_to_slice() and write_to_vec() APIs
    • Added an alloc feature to enable packet building without std
    • New, clearer error types for slice/vec/std packet serialization
  • Bug Fixes / Reliability

    • Improved serialization reliability and error reporting for extension/length/space failures

@xyzzyz
Copy link
Copy Markdown
Contributor Author

xyzzyz commented Apr 16, 2026

Hey, is there any chance this can get merged? Thanks!

@JulianSchmid
Copy link
Copy Markdown
Owner

I will try to make some time this weekend.

Can you rebase the PR before that? I see a merge conflict in etherparse/src/link/single_vlan_header_slice.rs.

@xyzzyz xyzzyz force-pushed the amichalik/packet-builder-no-std branch from 5b9dabd to 8ec775c Compare April 18, 2026 00:41
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 18, 2026

📝 Walkthrough

Walkthrough

Adds a crate-internal CoreWrite abstraction and writer implementations, introduces slice/vec-specific packet build error types, refactors IPv4/IPv6 extension writers to use internal generic write paths, exposes packet_builder unconditionally, and adds an explicit alloc feature that std depends on.

Changes

Cohort / File(s) Summary
Cargo / crate root
etherparse/Cargo.toml, etherparse/src/lib.rs
Added empty alloc feature; std now depends on alloc; extern crate alloc enabled for feature = "alloc" or test; removed std gating from packet_builder exports.
Writer abstraction
etherparse/src/writer.rs, etherparse/src/lib.rs
New CoreWrite trait, WriteError<IO,Content>, IoWriter (std), VecWriter (alloc), and SliceCoreWrite with associated error type; module added and re-exported crate-internally.
Packet builder API & logic
etherparse/src/packet_builder.rs
Refactored to generic final_write_with_net<W,E> using CoreWrite; added final_write_to_slice, write_to_vec (alloc), write_to_slice; changed header emission to to_bytes() writes and explicit IPv4 checksum recalculation; added tests.
Slice/Vec build errors
etherparse/src/err/packet/build_slice_write_error.rs, etherparse/src/err/packet/build_vec_write_error.rs, etherparse/src/err/packet/mod.rs
Added BuildSliceWriteError and BuildVecWriteError enums, From impls from lower-level errors, Display/Error impls; re-exported build_slice_write_error unconditionally and build_vec_write_error under alloc.
Std build error conversions
etherparse/src/err/packet/build_write_error.rs
Added #[cfg(feature = "std")] From impls for converting std::io::Error, ValueTooBigError<usize>, transport checksum and WriteError<std::io::Error, ...> into BuildWriteError.
IPv4/IPv6 extension writers
etherparse/src/net/ipv4_exts.rs, etherparse/src/net/ipv6_exts.rs
Introduced write_internal<T: CoreWrite + ?Sized> methods returning Result<(), WriteError<T::Error, …>>; public std-only write now delegates to internal method via IoWriter and maps WriteError into existing header-write errors; writes use to_bytes() and map IO vs content via WriteError.

Sequence Diagram

sequenceDiagram
    participant User
    participant PacketBuilder
    participant CoreWrite as CoreWrite Impl
    participant Writer as Writer (IoWriter/VecWriter/SliceCoreWrite)
    participant Error

    User->>PacketBuilder: write_to_vec / write_to_slice / write
    PacketBuilder->>PacketBuilder: final_write_with_net<W,E>
    PacketBuilder->>CoreWrite: call write_internal (IPv4/IPv6 ext, headers)
    CoreWrite->>CoreWrite: header.to_bytes()
    CoreWrite->>Writer: write_all(&[u8])
    alt Success
        Writer-->>CoreWrite: Ok
        CoreWrite-->>PacketBuilder: Ok
        PacketBuilder-->>User: Ok (bytes/count)
    else IO or Content error
        Writer-->>CoreWrite: Err(WriteError::Io / WriteError::Content)
        CoreWrite-->>PacketBuilder: Err(WriteError)
        PacketBuilder->>Error: map Into Build*WriteError via From
        Error-->>User: Err(BuildSliceWriteError / BuildVecWriteError / BuildWriteError)
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐰 I nibble bytes and stitch them neat,
CoreWrite hums along each packet's beat.
From slice to vec and std in between,
Errors tamed and builders kept clean.
A rabbit's clap — serialization is sweet!

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title clearly and specifically summarizes the main change: enabling PacketBuilder functionality in no_std environments (via alloc and slice support) while maintaining backward compatibility with the existing std API.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@xyzzyz
Copy link
Copy Markdown
Contributor Author

xyzzyz commented Apr 18, 2026

Rebased.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@etherparse/src/err/packet/build_slice_write_error.rs`:
- Around line 14-17: The doc comment for the enum variant Ipv4Exts is incomplete
and the human-facing message for the ICMPv6/IPv4 case has a grammar issue;
update the Ipv4Exts doc to a complete sentence (e.g., "Error when IPv4
extensions cannot be serialized due to internal consistency errors (e.g., an
inconsistent header).") and fix the Display text in the relevant fmt
implementation for BuildSliceWriteError (or the Display impl that formats the
ICMPv6/IPv4 case) to use correct grammar/wording such as "failed to serialize
ICMPv6/IPv4 message" or "could not serialize ICMPv6/IPv4 message" and ensure
"can not" is changed to "cannot" where applicable.

In `@etherparse/src/err/packet/build_vec_write_error.rs`:
- Around line 4-6: Add the docsrs cfg annotation to the public alloc-only error
type by applying #[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] to the
BuildVecWriteError enum so the docs show the "alloc" feature badge like other
alloc-gated items; locate the pub enum BuildVecWriteError declaration and add
that cfg_attr above it (same pattern used for BuildWriteError) to ensure
consistent docsrs feature visibility.

In `@etherparse/src/packet_builder.rs`:
- Around line 2492-2564: The test module white_box_tests uses alloc (see use
alloc::vec::Vec;) but is only gated by #[cfg(test)], causing compilation
failures when running cargo test --no-default-features; either add an explicit
cfg gate to the module (e.g. #[cfg(all(test, feature = "alloc"))] on the
white_box_tests module) so the tests only compile when the alloc feature is
enabled, or update CI to run an additional job/step that executes cargo test
--no-default-features --features alloc to validate this feature combination (and
ensure cargo test --no-default-features indeed runs tests rather than just
compiling).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e1ce72d4-0bab-4fec-b20e-ddd2173aba7e

📥 Commits

Reviewing files that changed from the base of the PR and between f87e170 and 8ec775c.

📒 Files selected for processing (10)
  • etherparse/Cargo.toml
  • etherparse/src/err/packet/build_slice_write_error.rs
  • etherparse/src/err/packet/build_vec_write_error.rs
  • etherparse/src/err/packet/build_write_error.rs
  • etherparse/src/err/packet/mod.rs
  • etherparse/src/lib.rs
  • etherparse/src/net/ipv4_exts.rs
  • etherparse/src/net/ipv6_exts.rs
  • etherparse/src/packet_builder.rs
  • etherparse/src/writer.rs

Comment on lines +14 to +17
/// Error if the IPv4 extensions can not be serialized
/// because of internal consistency errors (i.e. a header
/// is never).
Ipv4Exts(ipv4_exts::ExtsWalkError),
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Clean up the new public error text.

The IPv4 extension docs end with an incomplete sentence, and the ICMPv6/IPv4 display message has a grammar issue.

📝 Proposed wording cleanup
-    /// because of internal consistency errors (i.e. a header
-    /// is never).
+    /// because of internal consistency errors.
...
-                "Error: ICMPv6 can not be combined with an IPv4 headers (checksum can not be calculated)."
+                "Error: ICMPv6 can not be combined with an IPv4 header (checksum can not be calculated)."

Also applies to: 90-92

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@etherparse/src/err/packet/build_slice_write_error.rs` around lines 14 - 17,
The doc comment for the enum variant Ipv4Exts is incomplete and the human-facing
message for the ICMPv6/IPv4 case has a grammar issue; update the Ipv4Exts doc to
a complete sentence (e.g., "Error when IPv4 extensions cannot be serialized due
to internal consistency errors (e.g., an inconsistent header).") and fix the
Display text in the relevant fmt implementation for BuildSliceWriteError (or the
Display impl that formats the ICMPv6/IPv4 case) to use correct grammar/wording
such as "failed to serialize ICMPv6/IPv4 message" or "could not serialize
ICMPv6/IPv4 message" and ensure "can not" is changed to "cannot" where
applicable.

Comment thread etherparse/src/err/packet/build_vec_write_error.rs
Comment thread etherparse/src/packet_builder.rs
PacketBuilder serialization is split from std::io::Write so packet building
works in no_std environments while keeping std behavior intact.

Key changes
- Introduce an internal writer abstraction (`CoreWrite`) and internal
  `WriteError<IO, Content>` in `src/writer.rs`.
- Add an explicit `alloc` feature and make `std` depend on `alloc`.
- Make `PacketBuilder` available without `std`.
- Keep std `write(...) -> BuildWriteError` API, with `BuildWriteError`
  remaining std-only.
- Add no_std-capable write APIs:
  - `write_to_vec` (alloc) with `BuildVecWriteError`
  - `write_to_slice` (no alloc) with `BuildSliceWriteError`
- Refactor IPv4/IPv6 extension writing through shared internal methods used by
  both std and no_std paths.
- Add docsrs cfg annotations for alloc-only APIs.
- Add focused tests for vec and slice write paths:
  - write to empty vec
  - write to pre-populated vec
  - write to slice success path
  - write to slice too-small error path

Compatibility
- std users keep existing `PacketBuilder::write` behavior.
- no_std users gain packet serialization through vec/slice writers.
@xyzzyz xyzzyz force-pushed the amichalik/packet-builder-no-std branch from 8ec775c to a4a058d Compare April 18, 2026 01:07
Comment thread etherparse/src/err/packet/build_vec_write_error.rs
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
etherparse/src/packet_builder.rs (2)

42-55: Prefer returning the writer's actual position over the precomputed required.

final_write_to_slice returns Ok(required) assuming final_size is exact. It almost certainly is today, but coupling the reported byte count to a separate size predictor is a hidden invariant that will silently return a wrong count if final_size ever drifts from the write path (or if a caller customizes one without the other). Tracking the writer's pos makes the return self-consistent and removes the need for the invariant.

♻️ Proposed change

In etherparse/src/writer.rs, expose the current position:

impl<'a> SliceCoreWrite<'a> {
    #[inline]
    pub(crate) fn new(buf: &'a mut [u8]) -> Self {
        SliceCoreWrite { buf, pos: 0 }
    }

    #[inline]
    pub(crate) fn pos(&self) -> usize {
        self.pos
    }
}

Then use it in final_write_to_slice:

     let mut writer = SliceCoreWrite::new(slice);
     final_write_with_net::<_, _, BuildSliceWriteError>(builder, &mut writer, payload)?;
-    Ok(required)
+    Ok(writer.pos())
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@etherparse/src/packet_builder.rs` around lines 42 - 55, final_write_to_slice
currently returns the precomputed required size from final_size, which can
diverge from the actual bytes written; modify the code to return the writer's
actual position instead: expose a pos() accessor on SliceCoreWrite (add
pub(crate) fn pos(&self) -> usize to the SliceCoreWrite impl that is constructed
by SliceCoreWrite::new), then in final_write_to_slice call
final_write_with_net(..., &mut writer, ...) and return Ok(writer.pos()) rather
than Ok(required); keep error handling with BuildSliceWriteError and other
symbols (final_write_to_slice, final_size, final_write_with_net,
SliceCoreWrite::new, SliceCoreWrite::pos) intact.

2492-2566: Nice coverage of the new vec/slice paths.

Tests cover the four primary cases (empty vec, pre-populated vec preserved, slice success with sentinel bytes around the written region, and slice-too-small returning Space(required)). One nit-level idea (optional): add a proptest-backed roundtrip that writes the same builder via write, write_to_vec, and write_to_slice and asserts all three produce byte-identical output — this would lock in parity across the three backends for future refactors.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@etherparse/src/packet_builder.rs` around lines 2492 - 2566, Add a
property-based roundtrip test that, for varied payload sizes and random
prefixes/slice offsets, constructs a PacketBuilder (use
PacketBuilder::ipv4(...).udp(...)), then obtains bytes via write(&mut Vec),
write_to_vec(&mut Vec) (starting from empty and from a random prefix), and
write_to_slice(&mut [u8]) (with enough space determined by
builder.size(payload.len())), and assert all produced packet bytes (excluding
prefixes/sentinels) are identical and that write_to_slice returns the expected
written length (builder.size). Use varying payload lengths and contents to lock
parity between write, write_to_vec, and write_to_slice implementations.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@etherparse/src/err/packet/build_slice_write_error.rs`:
- Around line 36-71: The file contains unused From impls that convert
SliceWriteSpaceError (the direct impl From<SliceWriteSpaceError> for
BuildSliceWriteError and the two impls
From<crate::WriteError<SliceWriteSpaceError, ipv4_exts::ExtsWalkError>> and
From<crate::WriteError<SliceWriteSpaceError, ipv6_exts::ExtsWalkError>>), which
the current pipeline never invokes; either remove these three impl blocks (the
From<SliceWriteSpaceError> impl and the two WriteError->BuildSliceWriteError
impls) to avoid dead code, or add explicit code paths and tests that exercise
them (e.g., adapt a builder or header write path to return/propagate
BuildSliceWriteError via these conversions and add unit tests asserting the
conversion produces the expected BuildSliceWriteError variants). Ensure you
update or add tests to cover the chosen approach and remove any now-unnecessary
imports.

---

Nitpick comments:
In `@etherparse/src/packet_builder.rs`:
- Around line 42-55: final_write_to_slice currently returns the precomputed
required size from final_size, which can diverge from the actual bytes written;
modify the code to return the writer's actual position instead: expose a pos()
accessor on SliceCoreWrite (add pub(crate) fn pos(&self) -> usize to the
SliceCoreWrite impl that is constructed by SliceCoreWrite::new), then in
final_write_to_slice call final_write_with_net(..., &mut writer, ...) and return
Ok(writer.pos()) rather than Ok(required); keep error handling with
BuildSliceWriteError and other symbols (final_write_to_slice, final_size,
final_write_with_net, SliceCoreWrite::new, SliceCoreWrite::pos) intact.
- Around line 2492-2566: Add a property-based roundtrip test that, for varied
payload sizes and random prefixes/slice offsets, constructs a PacketBuilder (use
PacketBuilder::ipv4(...).udp(...)), then obtains bytes via write(&mut Vec),
write_to_vec(&mut Vec) (starting from empty and from a random prefix), and
write_to_slice(&mut [u8]) (with enough space determined by
builder.size(payload.len())), and assert all produced packet bytes (excluding
prefixes/sentinels) are identical and that write_to_slice returns the expected
written length (builder.size). Use varying payload lengths and contents to lock
parity between write, write_to_vec, and write_to_slice implementations.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: fe5385a0-acb3-44b8-85d5-b80be8ebe7fe

📥 Commits

Reviewing files that changed from the base of the PR and between 8ec775c and 49f6491.

📒 Files selected for processing (10)
  • etherparse/Cargo.toml
  • etherparse/src/err/packet/build_slice_write_error.rs
  • etherparse/src/err/packet/build_vec_write_error.rs
  • etherparse/src/err/packet/build_write_error.rs
  • etherparse/src/err/packet/mod.rs
  • etherparse/src/lib.rs
  • etherparse/src/net/ipv4_exts.rs
  • etherparse/src/net/ipv6_exts.rs
  • etherparse/src/packet_builder.rs
  • etherparse/src/writer.rs
🚧 Files skipped from review as they are similar to previous changes (5)
  • etherparse/Cargo.toml
  • etherparse/src/err/packet/mod.rs
  • etherparse/src/err/packet/build_vec_write_error.rs
  • etherparse/src/err/packet/build_write_error.rs
  • etherparse/src/net/ipv6_exts.rs

Comment on lines +36 to +71
impl From<SliceWriteSpaceError> for BuildSliceWriteError {
fn from(value: SliceWriteSpaceError) -> Self {
BuildSliceWriteError::Space(value.required_len)
}
}

impl From<super::TransportChecksumError> for BuildSliceWriteError {
fn from(value: super::TransportChecksumError) -> Self {
match value {
super::TransportChecksumError::PayloadLen(err) => BuildSliceWriteError::PayloadLen(err),
super::TransportChecksumError::Icmpv6InIpv4 => BuildSliceWriteError::Icmpv6InIpv4,
}
}
}

impl From<crate::WriteError<SliceWriteSpaceError, ipv4_exts::ExtsWalkError>>
for BuildSliceWriteError
{
fn from(value: crate::WriteError<SliceWriteSpaceError, ipv4_exts::ExtsWalkError>) -> Self {
match value {
crate::WriteError::Io(err) => BuildSliceWriteError::Space(err.required_len),
crate::WriteError::Content(err) => BuildSliceWriteError::Ipv4Exts(err),
}
}
}

impl From<crate::WriteError<SliceWriteSpaceError, ipv6_exts::ExtsWalkError>>
for BuildSliceWriteError
{
fn from(value: crate::WriteError<SliceWriteSpaceError, ipv6_exts::ExtsWalkError>) -> Self {
match value {
crate::WriteError::Io(err) => BuildSliceWriteError::Space(err.required_len),
crate::WriteError::Content(err) => BuildSliceWriteError::Ipv6Exts(err),
}
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find any code that constructs/returns BuildSliceWriteError from a SliceWriteSpaceError
# or from WriteError<SliceWriteSpaceError, _>.
rg -nP -C3 'SliceWriteSpaceError' --type=rust
echo '--- call sites returning BuildSliceWriteError ---'
rg -nP -C2 'BuildSliceWriteError' --type=rust
echo '--- SliceCoreWriteError usage ---'
rg -nP -C2 'SliceCoreWriteError' --type=rust

Repository: JulianSchmid/etherparse

Length of output: 25197


🏁 Script executed:

# Search for places where SliceWriteSpaceError is converted to BuildSliceWriteError
# Look for .into() calls, ? operators, or explicit From::from calls
rg -n 'SliceWriteSpaceError' --type=rust -A 5 | grep -E '(\.into\(\)|\.from\(|BuildSliceWriteError)' -B 2 -A 1

# Also check if there are tests specifically for these From impls
fd -e rs --type f | xargs grep -l 'BuildSliceWriteError' | xargs grep -l 'SliceWriteSpaceError'

# Search for uses of the individual header write_to_slice methods
rg 'write_to_slice' --type=rust -B 2 -A 3

Repository: JulianSchmid/etherparse

Length of output: 11984


🏁 Script executed:

# Check visibility and how BuildSliceWriteError is exported
rg -n 'pub.*BuildSliceWriteError' --type=rust

# Check the error enum structure and variant documentation
cat -n etherparse/src/err/packet/build_slice_write_error.rs | head -35

# Check if there's any documentation suggesting these conversions should be used
rg -B 3 'From<SliceWriteSpaceError>' etherparse/src/err/packet/build_slice_write_error.rs

# Look for any public API that might return these error types mixed
rg 'pub.*fn.*BuildSliceWriteError' --type=rust -A 2

Repository: JulianSchmid/etherparse

Length of output: 2029


Remove unused From<SliceWriteSpaceError> impls or add code paths that use them.

The three From impls for SliceWriteSpaceError in this file (lines 36–40 and 51–71) have no reachable call sites. The active packet builder pipeline uses SliceCoreWriteError exclusively, and individual header write_to_slice() methods (e.g., ethernet2_header, linux_sll_header) return SliceWriteSpaceError directly rather than through BuildSliceWriteError. If these conversions are not needed, drop them; otherwise, add explicit code paths and tests that exercise them.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@etherparse/src/err/packet/build_slice_write_error.rs` around lines 36 - 71,
The file contains unused From impls that convert SliceWriteSpaceError (the
direct impl From<SliceWriteSpaceError> for BuildSliceWriteError and the two
impls From<crate::WriteError<SliceWriteSpaceError, ipv4_exts::ExtsWalkError>>
and From<crate::WriteError<SliceWriteSpaceError, ipv6_exts::ExtsWalkError>>),
which the current pipeline never invokes; either remove these three impl blocks
(the From<SliceWriteSpaceError> impl and the two
WriteError->BuildSliceWriteError impls) to avoid dead code, or add explicit code
paths and tests that exercise them (e.g., adapt a builder or header write path
to return/propagate BuildSliceWriteError via these conversions and add unit
tests asserting the conversion produces the expected BuildSliceWriteError
variants). Ensure you update or add tests to cover the chosen approach and
remove any now-unnecessary imports.

@JulianSchmid JulianSchmid merged commit 3e2b933 into JulianSchmid:master Apr 20, 2026
11 checks passed
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 20, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 0.00%. Comparing base (f87e170) to head (49f6491).
⚠️ Report is 3 commits behind head on master.

Additional details and impacted files
@@      Coverage Diff      @@
##   master   #135   +/-   ##
=============================
=============================

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@JulianSchmid JulianSchmid added this to the v0.20.0 milestone Apr 20, 2026
@JulianSchmid
Copy link
Copy Markdown
Owner

Thanks for the PR @xyzzyz , looked all good. I included it in the 0.20.0 & 0.20.1 release.

@xyzzyz
Copy link
Copy Markdown
Contributor Author

xyzzyz commented Apr 20, 2026

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants