Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: help all clean test build release lint fmt check-fmt markdownlint nixie
.PHONY: help all clean test build release lint fmt check-fmt markdownlint nixie typecheck

CRATE ?= wireframe
CARGO ?= cargo
Expand All @@ -22,6 +22,9 @@ test-bdd: ## Run rstest-bdd tests only
test: ## Run all tests (bdd + unit/integration)
RUSTFLAGS="-D warnings" $(CARGO) test --all-targets --all-features $(BUILD_JOBS)

typecheck: ## Run a workspace typecheck
RUSTFLAGS="-D warnings" $(CARGO) check --all-targets --all-features $(BUILD_JOBS)

# will match target/debug/libmy_library.rlib and target/release/libmy_library.rlib
target/%/lib$(CRATE).rlib: ## Build library in debug or release
$(CARGO) build $(BUILD_JOBS) \
Expand Down
23 changes: 21 additions & 2 deletions docs/v0-1-0-to-v0-2-0-migration-guide.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# v0.1.0 to v0.2.0 migration guide

This guide highlights user-facing changes required when upgrading from v0.1.0
to v0.2.0.
This guide summarizes the breaking changes required when migrating from
wireframe v0.1.0 to v0.2.0.

## Configuration builder naming update

Expand All @@ -16,3 +16,22 @@ Update any references accordingly, including documentation and code examples.
```rust
let config = BackoffConfig::normalized(...);
```

## Payload accessors

The consuming payload accessors were renamed to follow Rust idioms.

- `PacketParts::payload(self)` has been removed. Use
`PacketParts::into_payload(self)` instead.
- `FragmentParts::payload(self)` has been removed. Use
`FragmentParts::into_payload(self)` instead.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Comment thread
leynos marked this conversation as resolved.

```rust
// Before
let packet_payload = packet_parts.payload();
let fragment_payload = fragment_parts.payload();

// After
let packet_payload = packet_parts.into_payload();
let fragment_payload = fragment_parts.into_payload();
```
12 changes: 6 additions & 6 deletions src/app/envelope.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ use crate::{
/// Self {
/// id: parts.id(),
/// correlation_id: parts.correlation_id(),
/// payload: parts.payload(),
/// payload: parts.into_payload(),
/// timestamp: 0,
/// }
/// }
Expand Down Expand Up @@ -192,10 +192,10 @@ impl PacketParts {
/// use wireframe::app::PacketParts;
///
/// let parts = PacketParts::new(1, None, vec![7, 8]);
/// assert_eq!(parts.payload(), vec![7, 8]);
/// assert_eq!(parts.into_payload(), vec![7, 8]);
/// ```
#[must_use]
pub fn payload(self) -> Vec<u8> { self.payload }
pub fn into_payload(self) -> Vec<u8> { self.payload }

/// Ensure a correlation identifier is present, inheriting from `source` if missing.
///
Expand Down Expand Up @@ -243,7 +243,7 @@ impl From<PacketParts> for Envelope {
fn from(p: PacketParts) -> Self {
let id = p.id();
let correlation_id = p.correlation_id();
let payload = p.payload();
let payload = p.into_payload();
Envelope::new(id, correlation_id, payload)
}
}
Expand All @@ -252,14 +252,14 @@ impl From<PacketParts> for Envelope {
impl<T: Packet> Fragmentable for T {
fn into_fragment_parts(self) -> FragmentParts {
let parts = self.into_parts();
FragmentParts::new(parts.id(), parts.correlation_id(), parts.payload())
FragmentParts::new(parts.id(), parts.correlation_id(), parts.into_payload())
}

fn from_fragment_parts(parts: FragmentParts) -> Self {
T::from_parts(PacketParts::new(
parts.id(),
parts.correlation_id(),
parts.payload(),
parts.into_payload(),
))
}
}
2 changes: 1 addition & 1 deletion src/app/fragmentation_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ impl FragmentationState {
let parts = packet.into_parts();
let id = parts.id();
let correlation = parts.correlation_id();
let payload = parts.payload();
let payload = parts.into_payload();

match decode_fragment_payload(&payload) {
Ok(Some((header, fragment_payload))) => {
Expand Down
4 changes: 2 additions & 2 deletions src/client/tests/messaging.rs
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ async fn receive_envelope_returns_envelope_with_correlation_id() {
"response should have the same correlation ID"
);
assert_eq!(response.id(), 42);
assert_eq!(response.into_parts().payload(), &[1, 2, 3]);
assert_eq!(response.into_parts().into_payload(), &[1, 2, 3]);

server.abort();
}
Expand Down Expand Up @@ -295,7 +295,7 @@ async fn round_trip_with_various_payload_sizes(#[case] payload: Vec<u8>) {
.await
.expect("call should succeed");

assert_eq!(response.into_parts().payload(), payload.as_slice());
assert_eq!(response.into_parts().into_payload(), payload.as_slice());

server.abort();
}
Expand Down
4 changes: 2 additions & 2 deletions src/connection/test_support.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ impl Packet for u8 {
fn into_parts(self) -> PacketParts { PacketParts::new(0, None, vec![self]) }

fn from_parts(parts: PacketParts) -> Self {
parts.payload().first().copied().unwrap_or_default()
parts.into_payload().first().copied().unwrap_or_default()
}
}

Expand All @@ -36,7 +36,7 @@ impl Packet for Vec<u8> {

fn into_parts(self) -> PacketParts { PacketParts::new(0, None, self) }

fn from_parts(parts: PacketParts) -> Self { parts.payload() }
fn from_parts(parts: PacketParts) -> Self { parts.into_payload() }
}

/// Build a connection actor configured with the supplied protocol hooks.
Expand Down
13 changes: 11 additions & 2 deletions src/fragment/packet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,17 @@ impl FragmentParts {
pub const fn correlation_id(&self) -> Option<u64> { self.correlation_id }

/// Consume the parts and return the raw payload bytes.
///
/// # Examples
///
/// ```
/// use wireframe::fragment::FragmentParts;
///
/// let parts = FragmentParts::new(1, None, vec![7, 8]);
/// assert_eq!(parts.into_payload(), vec![7, 8]);
/// ```
#[must_use]
pub fn payload(self) -> Vec<u8> { self.payload }
pub fn into_payload(self) -> Vec<u8> { self.payload }
}
Comment thread
leynos marked this conversation as resolved.

/// A packet that can be decomposed into parts and reconstructed for fragmentation.
Expand Down Expand Up @@ -74,7 +83,7 @@ pub fn fragment_packet<E: Fragmentable>(
let parts = packet.into_fragment_parts();
let id = parts.id();
let correlation = parts.correlation_id();
let payload = parts.payload();
let payload = parts.into_payload();

let batch = fragmenter.fragment_bytes(&payload)?;
if !batch.is_fragmented() {
Expand Down
2 changes: 1 addition & 1 deletion src/middleware.rs
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ impl<E: Packet> Service for RouteService<E> {
(self.handler.as_ref())(&env).await;
let parts = env.into_parts();
let correlation_id = parts.correlation_id();
let payload = parts.payload();
let payload = parts.into_payload();
Ok(ServiceResponse::new(payload, correlation_id))
}
}
Expand Down
6 changes: 3 additions & 3 deletions tests/common/fragment_helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ pub fn fragment_envelope(env: &Envelope, fragmenter: &Fragmenter) -> TestResult<
let parts = env.clone().into_parts();
let id = parts.id();
let correlation = parts.correlation_id();
let payload = parts.payload();
let payload = parts.into_payload();

if payload.len() <= fragmenter.max_fragment_size().get() {
return Ok(vec![Envelope::new(id, correlation, payload)]);
Expand Down Expand Up @@ -180,7 +180,7 @@ pub async fn read_reassembled_response(
while let Some(frame) = client.next().await {
let bytes = frame?;
let (env, _) = serializer.deserialize::<Envelope>(&bytes)?;
let payload = env.into_parts().payload();
let payload = env.into_parts().into_payload();
match decode_fragment_payload(&payload)? {
Some((header, fragment)) => {
if let Some(message) = reassembler.push(header, fragment)? {
Expand All @@ -204,7 +204,7 @@ pub fn make_handler(sender: &mpsc::UnboundedSender<Vec<u8>>) -> Handler<Envelope
let tx = sender.clone();
std::sync::Arc::new(move |env: &Envelope| {
let tx = tx.clone();
let payload = env.clone().into_parts().payload();
let payload = env.clone().into_parts().into_payload();
Box::pin(async move {
assert!(
tx.send(payload).is_ok(),
Expand Down
2 changes: 1 addition & 1 deletion tests/common/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ impl Packet for CommonTestEnvelope {
Self {
id: parts.id(),
correlation_id: parts.correlation_id(),
payload: parts.payload(),
payload: parts.into_payload(),
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions tests/connection_fragmentation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ async fn connection_actor_fragments_outbound_frames() -> TestResult {
let mut reassembler = Reassembler::new(cfg.max_message_size, cfg.reassembly_timeout);
let mut assembled: Option<Vec<u8>> = None;
for env in out {
let payload = env.into_parts().payload();
let payload = env.into_parts().into_payload();
let Some((header, frag)) = decode_fragment_payload(&payload)? else {
assembled = Some(payload);
continue;
Expand Down Expand Up @@ -109,7 +109,7 @@ async fn connection_actor_passes_through_small_outbound_frames_unfragmented() ->
.into_iter()
.next()
.ok_or("expected single frame but none found")?;
let payload_out = only.into_parts().payload();
let payload_out = only.into_parts().into_payload();
match decode_fragment_payload(&payload_out)? {
None => {}
Some(_) => return Err("expected unfragmented payload".into()),
Expand Down
2 changes: 1 addition & 1 deletion tests/example_codecs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,6 @@ async fn hotline_codec_round_trips_through_app() {
.deserialize::<Envelope>(&response_frame.payload)
.expect("deserialize response");
assert_eq!(response_env.correlation_id(), Some(7));
let response_payload = response_env.into_parts().payload();
let response_payload = response_env.into_parts().into_payload();
assert_eq!(response_payload, b"ping".to_vec());
}
2 changes: 1 addition & 1 deletion tests/fragment_transport/rejection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ fn mutate_malformed_header(mut fragments: Vec<Envelope>) -> TestResult<Vec<Envel
"fragmenter must produce at least one fragment",
))?
.into_parts();
let mut payload = parts.clone().payload();
let mut payload = parts.clone().into_payload();
assert!(
payload.starts_with(FRAGMENT_MAGIC),
"expected fragment to start with marker"
Expand Down
2 changes: 1 addition & 1 deletion tests/frame_codec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ async fn custom_codec_round_trips_frames() {
.deserialize::<Envelope>(&response_frame.payload)
.expect("deserialize response");
assert_eq!(response_env.correlation_id(), Some(7));
let response_payload = response_env.into_parts().payload();
let response_payload = response_env.into_parts().into_payload();
assert_eq!(response_payload, b"ping".to_vec());
}

Expand Down
2 changes: 1 addition & 1 deletion tests/middleware_order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ async fn middleware_applied_in_reverse_order() -> TestResult<()> {
let (resp, _) = serializer.deserialize::<Envelope>(first)?;
let parts = wireframe::app::Packet::into_parts(resp);
let correlation_id = parts.correlation_id();
let payload = parts.payload();
let payload = parts.into_payload();
assert_eq!(
payload,
[b'X', b'A', b'B', b'B', b'A'],
Expand Down
5 changes: 4 additions & 1 deletion tests/multi_packet_streaming.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,10 @@ async fn client_receives_multi_packet_stream_with_terminator() -> TestResult<()>
let out = harness.run().await?;

assert_eq!(out.len(), 3, "expected two frames plus terminator");
let payloads: Vec<Vec<u8>> = out.iter().map(|frame| parts(frame).payload()).collect();
let payloads: Vec<Vec<u8>> = out
.iter()
.map(|frame| parts(frame).into_payload())
.collect();
assert_eq!(payloads.first(), Some(&vec![1]), "first payload mismatch");
assert_eq!(
payloads.get(1),
Expand Down
2 changes: 1 addition & 1 deletion tests/packet_parts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ fn envelope_from_parts_round_trip() {
let parts = rebuilt.into_parts();
let id = parts.id();
let correlation_id = parts.correlation_id();
let payload = parts.payload();
let payload = parts.into_payload();
assert_eq!(id, 2);
assert_eq!(correlation_id, Some(5));
assert_eq!(payload, vec![1, 2]);
Expand Down
Loading
Loading