Skip to content

Commit 153171c

Browse files
committed
Expand redacted stream debug state
1 parent 4de63bc commit 153171c

4 files changed

Lines changed: 34 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@
8888
quantum.
8989
- Added reader-side stream `buffered_output_capacity()` and
9090
`buffered_output_remaining_capacity()` helpers for fixed-queue diagnostics.
91+
- Expanded redacted stream `Debug` output with recovery readiness, pending
92+
quantum state, and reader-side fixed output queue capacity.
9193

9294
## 0.8.0 - 2026-05-16
9395

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,8 @@ Base64 quantum or decoded tail. All stream adapters also expose
570570
`can_into_inner()` and `try_into_inner()` as checked recovery paths that refuse
571571
to return the wrapped reader or writer while doing so would discard pending
572572
input or buffered output. Their `Debug` output reports adapter state without
573-
formatting the wrapped reader or writer.
573+
formatting the wrapped reader or writer, including recovery readiness, pending
574+
quantum state, and reader-side fixed output queue capacity.
574575

575576
URL-safe, no-padding encoding:
576577

src/lib.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,8 @@ pub mod stream {
708708
.field("engine", &self.engine)
709709
.field("pending", &"<redacted>")
710710
.field("pending_len", &self.pending_len)
711+
.field("pending_input_needed_len", &self.pending_input_needed_len())
712+
.field("can_into_inner", &self.can_into_inner())
711713
.field("finalized", &self.finalized)
712714
.finish()
713715
}
@@ -1012,6 +1014,8 @@ pub mod stream {
10121014
.field("engine", &self.engine)
10131015
.field("pending", &"<redacted>")
10141016
.field("pending_len", &self.pending_len)
1017+
.field("pending_input_needed_len", &self.pending_input_needed_len())
1018+
.field("can_into_inner", &self.can_into_inner())
10151019
.field("terminal_padding", &self.finished)
10161020
.field("finalized", &self.finalized)
10171021
.finish()
@@ -1395,7 +1399,14 @@ pub mod stream {
13951399
.field("engine", &self.engine)
13961400
.field("pending", &"<redacted>")
13971401
.field("pending_len", &self.pending_len)
1402+
.field("pending_input_needed_len", &self.pending_input_needed_len())
13981403
.field("buffered_output_len", &self.output.len())
1404+
.field("buffered_output_capacity", &self.output.capacity())
1405+
.field(
1406+
"buffered_output_remaining_capacity",
1407+
&self.output.available_capacity(),
1408+
)
1409+
.field("can_into_inner", &self.can_into_inner())
13991410
.field("finished", &self.finished)
14001411
.field("terminal_padding", &self.terminal_seen)
14011412
.finish()
@@ -1701,7 +1712,14 @@ pub mod stream {
17011712
.field("engine", &self.engine)
17021713
.field("pending", &"<redacted>")
17031714
.field("pending_len", &self.pending_len)
1715+
.field("pending_input_needed_len", &self.pending_input_needed_len())
17041716
.field("buffered_output_len", &self.output.len())
1717+
.field("buffered_output_capacity", &self.output.capacity())
1718+
.field(
1719+
"buffered_output_remaining_capacity",
1720+
&self.output.available_capacity(),
1721+
)
1722+
.field("can_into_inner", &self.can_into_inner())
17051723
.field("finished", &self.finished)
17061724
.finish()
17071725
}

tests/rfc4648.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3527,13 +3527,17 @@ fn stream_debug_output_redacts_wrapped_io() {
35273527
let debug = format!("{encoder:?}");
35283528
assert!(debug.contains("Encoder"));
35293529
assert!(debug.contains("pending_len"));
3530+
assert!(debug.contains("pending_input_needed_len"));
3531+
assert!(debug.contains("can_into_inner"));
35303532
assert!(debug.contains("<present>"));
35313533
assert!(!debug.contains("raw-secret"));
35323534

35333535
let mut decoder = Decoder::new(b"decoded-secret".to_vec(), STANDARD);
35343536
decoder.write_all(b"aGk=").unwrap();
35353537
let debug = format!("{decoder:?}");
35363538
assert!(debug.contains("Decoder"));
3539+
assert!(debug.contains("pending_input_needed_len"));
3540+
assert!(debug.contains("can_into_inner"));
35373541
assert!(debug.contains("terminal_padding"));
35383542
assert!(!debug.contains("decoded-secret"));
35393543

@@ -3542,14 +3546,22 @@ fn stream_debug_output_redacts_wrapped_io() {
35423546
decoder_reader.read_exact(&mut one).unwrap();
35433547
let debug = format!("{decoder_reader:?}");
35443548
assert!(debug.contains("DecoderReader"));
3549+
assert!(debug.contains("pending_input_needed_len"));
35453550
assert!(debug.contains("buffered_output_len"));
3551+
assert!(debug.contains("buffered_output_capacity"));
3552+
assert!(debug.contains("buffered_output_remaining_capacity"));
3553+
assert!(debug.contains("can_into_inner"));
35463554
assert!(!debug.contains("aGVsbG8"));
35473555

35483556
let mut encoder_reader = EncoderReader::new(Cursor::new(&b"raw-secret"[..]), STANDARD);
35493557
encoder_reader.read_exact(&mut one).unwrap();
35503558
let debug = format!("{encoder_reader:?}");
35513559
assert!(debug.contains("EncoderReader"));
3560+
assert!(debug.contains("pending_input_needed_len"));
35523561
assert!(debug.contains("buffered_output_len"));
3562+
assert!(debug.contains("buffered_output_capacity"));
3563+
assert!(debug.contains("buffered_output_remaining_capacity"));
3564+
assert!(debug.contains("can_into_inner"));
35533565
assert!(!debug.contains("raw-secret"));
35543566
}
35553567

0 commit comments

Comments
 (0)