|
7 | 7 | use cap_std_ext::prelude::CapStdExtCommandExt; |
8 | 8 | use cap_std_ext::{cap_std, cap_tempfile}; |
9 | 9 | use futures_util::{Future, FutureExt}; |
| 10 | +use itertools::Itertools; |
10 | 11 | use oci_spec::image::{Descriptor, Digest}; |
11 | 12 | use serde::{Deserialize, Serialize}; |
12 | 13 | use std::fs::File; |
@@ -382,39 +383,27 @@ impl FromReplyFds for () { |
382 | 383 | /// A FinishPipe instance |
383 | 384 | impl FromReplyFds for FinishPipe { |
384 | 385 | fn from_reply(fds: impl IntoIterator<Item = OwnedFd>, pipeid: u32) -> Result<Self> { |
385 | | - let mut fds = fds.into_iter(); |
386 | | - let Some(first_fd) = fds.next() else { |
387 | | - return Err(Error::Other("Expected fd for FinishPipe".into())); |
388 | | - }; |
389 | | - if fds.next().is_some() { |
390 | | - return Err(Error::Other("More than one fd for FinishPipe".into())); |
391 | | - } |
392 | 386 | let Some(pipeid) = PipeId::try_new(pipeid) else { |
393 | 387 | return Err(Error::Other("Expected pipeid for FinishPipe".into())); |
394 | 388 | }; |
395 | | - Ok(Self { |
396 | | - pipeid, |
397 | | - datafd: first_fd, |
398 | | - }) |
| 389 | + let datafd = fds |
| 390 | + .into_iter() |
| 391 | + .exactly_one() |
| 392 | + .map_err(|_| Error::Other("Expected exactly one fd for FinishPipe".into()))?; |
| 393 | + Ok(Self { pipeid, datafd }) |
399 | 394 | } |
400 | 395 | } |
401 | 396 |
|
402 | 397 | /// A DualFds instance |
403 | 398 | impl FromReplyFds for DualFds { |
404 | 399 | fn from_reply(fds: impl IntoIterator<Item = OwnedFd>, pipeid: u32) -> Result<Self> { |
405 | | - let mut fds = fds.into_iter(); |
406 | | - let Some(datafd) = fds.next() else { |
407 | | - return Err(Error::Other("Expected data fd for DualFds".into())); |
408 | | - }; |
409 | | - let Some(errfd) = fds.next() else { |
410 | | - return Err(Error::Other("Expected err fd for DualFds".into())); |
411 | | - }; |
412 | | - if fds.next().is_some() { |
413 | | - return Err(Error::Other("More than two fds for DualFds".into())); |
414 | | - } |
415 | 400 | if pipeid != 0 { |
416 | 401 | return Err(Error::Other("Unexpected pipeid with DualFds".into())); |
417 | 402 | } |
| 403 | + let [datafd, errfd] = fds |
| 404 | + .into_iter() |
| 405 | + .collect_array() |
| 406 | + .ok_or_else(|| Error::Other("Expected two fds for DualFds".into()))?; |
418 | 407 | Ok(Self { datafd, errfd }) |
419 | 408 | } |
420 | 409 | } |
@@ -961,7 +950,7 @@ mod tests { |
961 | 950 | match DualFds::from_reply(fds, 0) { |
962 | 951 | Ok(v) => unreachable!("{v:?}"), |
963 | 952 | Err(Error::Other(msg)) => { |
964 | | - assert_eq!(msg.as_ref(), "More than two fds for DualFds") |
| 953 | + assert_eq!(msg.as_ref(), "Expected two fds for DualFds") |
965 | 954 | } |
966 | 955 | Err(other) => unreachable!("{other}"), |
967 | 956 | } |
@@ -997,7 +986,7 @@ mod tests { |
997 | 986 | match FinishPipe::from_reply(fds, 1) { |
998 | 987 | Ok(v) => unreachable!("{v:?}"), |
999 | 988 | Err(Error::Other(msg)) => { |
1000 | | - assert_eq!(msg.as_ref(), "Expected fd for FinishPipe") |
| 989 | + assert_eq!(msg.as_ref(), "Expected exactly one fd for FinishPipe") |
1001 | 990 | } |
1002 | 991 | Err(other) => unreachable!("{other}"), |
1003 | 992 | } |
|
0 commit comments