Skip to content

Commit f0029f7

Browse files
authored
refactor!: migrate from snafu/n0-snafu to n0-error (#59)
## Description Migrates the repo from snafu/n0-snafu to [n0-error](https://github.com/n0-computer/n0-error). Note: This PR is mostly AI generated after a detailed instruction set on how to do the migration. I gave the diff a line-by-line review and fixed things up where the AI made mistakes. Afterwards, I gave the diff another review while adding a few more `from_sources` and removing manual error mappings. ## Breaking Changes * All error structs and enum variants now have a `meta: n0_error::Meta` field * All `backtrace` fields are removed on error enums and structs ## Notes & open questions <!-- Any notes, remarks or open questions you have to make about the PR. --> ## Change checklist - [x] Self-review. - [x] Documentation updates following the [style guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text), if relevant. - [x] Tests if relevant. - [ ] All breaking changes documented.
1 parent 5550293 commit f0029f7

File tree

19 files changed

+376
-448
lines changed

19 files changed

+376
-448
lines changed

Cargo.lock

Lines changed: 112 additions & 119 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

netwatch/Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,10 @@ workspace = true
1818
[dependencies]
1919
atomic-waker = "1.1.2"
2020
bytes = "1.7"
21+
n0-error = "0.1.0"
2122
n0-future = "0.3.0"
22-
n0-watcher = "0.4.0"
23-
nested_enum_utils = "0.2.3"
23+
n0-watcher = "0.5.0"
2424
pin-project-lite = "0.2.16"
25-
snafu = "0.8.5"
2625
time = "0.3.20"
2726
tokio = { version = "1", features = [
2827
"io-util",

netwatch/src/interfaces/bsd.rs

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ use libc::{AF_INET, AF_INET6, AF_LINK, AF_ROUTE, AF_UNSPEC, CTL_NET, c_int, uint
1313
use libc::{
1414
NET_RT_DUMP, RTA_IFP, RTAX_BRD, RTAX_DST, RTAX_GATEWAY, RTAX_MAX, RTAX_NETMASK, RTF_GATEWAY,
1515
};
16-
use nested_enum_utils::common_fields;
17-
use snafu::{Backtrace, IntoError, OptionExt, Snafu};
16+
use n0_error::{e, ensure, stack_error};
1817
use tracing::warn;
1918

2019
use super::DefaultRouteDetails;
@@ -249,7 +248,7 @@ fn u16_from_ne_range(
249248
data.get(range)
250249
.and_then(|s| TryInto::<[u8; 2]>::try_into(s).ok())
251250
.map(u16::from_ne_bytes)
252-
.context(MessageTooShortSnafu)
251+
.ok_or_else(|| e!(RouteError::MessageTooShort))
253252
}
254253

255254
/// Safely convert some bytes from a slice into a u32.
@@ -260,7 +259,7 @@ fn u32_from_ne_range(
260259
data.get(range)
261260
.and_then(|s| TryInto::<[u8; 4]>::try_into(s).ok())
262261
.map(u32::from_ne_bytes)
263-
.context(MessageTooShortSnafu)
262+
.ok_or_else(|| e!(RouteError::MessageTooShort))
264263
}
265264

266265
impl WireFormat {
@@ -273,12 +272,12 @@ impl WireFormat {
273272
target_os = "ios"
274273
))]
275274
MessageType::Route => {
276-
snafu::ensure!(data.len() >= self.body_off, MessageTooShortSnafu);
275+
ensure!(data.len() >= self.body_off, RouteError::MessageTooShort);
277276
let l = u16_from_ne_range(data, ..2)?;
278-
snafu::ensure!(data.len() >= l as usize, InvalidMessageSnafu);
277+
ensure!(data.len() >= l as usize, RouteError::InvalidMessage);
279278
let attrs: i32 = u32_from_ne_range(data, 12..16)?
280279
.try_into()
281-
.map_err(|_| InvalidMessageSnafu.build())?;
280+
.map_err(|_| e!(RouteError::InvalidMessage))?;
282281
let addrs = parse_addrs(attrs, parse_kernel_inet_addr, &data[self.body_off..])?;
283282
let mut m = RouteMessage {
284283
version: data[2] as _,
@@ -300,11 +299,11 @@ impl WireFormat {
300299
}
301300
#[cfg(target_os = "openbsd")]
302301
MessageType::Route => {
303-
snafu::ensure!(data.len() >= self.body_off, MessageTooShortSnafu);
302+
ensure!(data.len() >= self.body_off, RouteError::MessageTooShort);
304303
let l = u16_from_ne_range(data, ..2)?;
305-
snafu::ensure!(data.len() >= l as usize, InvalidMessageSnafu);
304+
ensure!(data.len() >= l as usize, RouteError::InvalidMessage);
306305
let ll = u16_from_ne_range(data, 4..6)? as usize;
307-
snafu::ensure!(data.len() >= ll as usize, InvalidMessageSnafu);
306+
ensure!(data.len() >= ll as usize, RouteError::InvalidMessage);
308307

309308
let addrs = parse_addrs(
310309
u32_from_ne_range(data, 12..16)? as _,
@@ -331,9 +330,9 @@ impl WireFormat {
331330
Ok(Some(WireMessage::Route(m)))
332331
}
333332
MessageType::Interface => {
334-
snafu::ensure!(data.len() >= self.body_off, MessageTooShortSnafu);
333+
ensure!(data.len() >= self.body_off, RouteError::MessageTooShort);
335334
let l = u16_from_ne_range(data, 0..2)?;
336-
snafu::ensure!(data.len() >= l as usize, InvalidMessageSnafu);
335+
ensure!(data.len() >= l as usize, RouteError::InvalidMessage);
337336

338337
let attrs = u32_from_ne_range(data, 4..8)?;
339338
if attrs as c_int & RTA_IFP == 0 {
@@ -354,9 +353,9 @@ impl WireFormat {
354353
Ok(Some(WireMessage::Interface(m)))
355354
}
356355
MessageType::InterfaceAddr => {
357-
snafu::ensure!(data.len() >= self.body_off, MessageTooShortSnafu);
356+
ensure!(data.len() >= self.body_off, RouteError::MessageTooShort);
358357
let l = u16_from_ne_range(data, ..2)?;
359-
snafu::ensure!(data.len() >= l as usize, InvalidMessageSnafu);
358+
ensure!(data.len() >= l as usize, RouteError::InvalidMessage);
360359

361360
#[cfg(target_os = "netbsd")]
362361
let index = u16_from_ne_range(data, 16..18)?;
@@ -379,9 +378,9 @@ impl WireFormat {
379378
Ok(Some(WireMessage::InterfaceAddr(m)))
380379
}
381380
MessageType::InterfaceMulticastAddr => {
382-
snafu::ensure!(data.len() >= self.body_off, MessageTooShortSnafu);
381+
ensure!(data.len() >= self.body_off, RouteError::MessageTooShort);
383382
let l = u16_from_ne_range(data, ..2)?;
384-
snafu::ensure!(data.len() >= l as usize, InvalidMessageSnafu);
383+
ensure!(data.len() >= l as usize, RouteError::InvalidMessage);
385384

386385
let addrs = parse_addrs(
387386
u32_from_ne_range(data, 4..8)? as _,
@@ -398,17 +397,17 @@ impl WireFormat {
398397
Ok(Some(WireMessage::InterfaceMulticastAddr(m)))
399398
}
400399
MessageType::InterfaceAnnounce => {
401-
snafu::ensure!(data.len() >= self.body_off, MessageTooShortSnafu);
400+
ensure!(data.len() >= self.body_off, RouteError::MessageTooShort);
402401
let l = u16_from_ne_range(data, ..2)?;
403-
snafu::ensure!(data.len() >= l as usize, InvalidMessageSnafu);
402+
ensure!(data.len() >= l as usize, RouteError::InvalidMessage);
404403

405404
let mut name = String::new();
406405
for i in 0..16 {
407406
if data[6 + i] != 0 {
408407
continue;
409408
}
410409
name = std::str::from_utf8(&data[6..6 + i])
411-
.map_err(|_| InvalidAddressSnafu.build())?
410+
.map_err(|_| e!(RouteError::InvalidAddress))?
412411
.to_string();
413412
break;
414413
}
@@ -446,9 +445,9 @@ struct RoutingStack {
446445

447446
/// Parses b as a routing information base and returns a list of routing messages.
448447
pub fn parse_rib(typ: RIBType, data: &[u8]) -> Result<Vec<WireMessage>, RouteError> {
449-
snafu::ensure!(
448+
ensure!(
450449
is_valid_rib_type(typ),
451-
InvalidRibTypeSnafu { rib_type: typ }
450+
RouteError::InvalidRibType { rib_type: typ }
452451
);
453452

454453
let mut msgs = Vec::new();
@@ -459,8 +458,8 @@ pub fn parse_rib(typ: RIBType, data: &[u8]) -> Result<Vec<WireMessage>, RouteErr
459458
while b.len() > 4 {
460459
nmsgs += 1;
461460
let l = u16_from_ne_range(b, ..2)?;
462-
snafu::ensure!(l != 0, InvalidMessageSnafu);
463-
snafu::ensure!(b.len() >= l as usize, MessageTooShortSnafu);
461+
ensure!(l != 0, RouteError::InvalidMessage);
462+
ensure!(b.len() >= l as usize, RouteError::MessageTooShort);
464463
if b[2] as i32 != ROUTING_STACK.rtm_version {
465464
// b = b[l:];
466465
continue;
@@ -485,7 +484,7 @@ pub fn parse_rib(typ: RIBType, data: &[u8]) -> Result<Vec<WireMessage>, RouteErr
485484
}
486485

487486
// We failed to parse any of the messages - version mismatch?
488-
snafu::ensure!(nmsgs == msgs.len() + nskips, MessageMismatchSnafu);
487+
ensure!(nmsgs == msgs.len() + nskips, RouteError::MessageMismatch);
489488

490489
Ok(msgs)
491490
}
@@ -599,24 +598,22 @@ pub struct InterfaceAnnounceMessage {
599598
/// Represents a type of routing information base.
600599
type RIBType = i32;
601600

602-
#[common_fields({
603-
backtrace: Option<Backtrace>,
604-
})]
605-
#[derive(Debug, Snafu)]
601+
#[stack_error(derive, add_meta)]
606602
#[non_exhaustive]
607603
pub enum RouteError {
608-
#[snafu(display("message mismatch"))]
604+
#[error("message mismatch")]
609605
MessageMismatch {},
610-
#[snafu(display("message too short"))]
606+
#[error("message too short")]
611607
MessageTooShort {},
612-
#[snafu(display("invalid message"))]
608+
#[error("invalid message")]
613609
InvalidMessage {},
614-
#[snafu(display("invalid address"))]
610+
#[error("invalid address")]
615611
InvalidAddress {},
616-
#[snafu(display("invalid rib type {rib_type}"))]
612+
#[error("invalid rib type {rib_type}")]
617613
InvalidRibType { rib_type: RIBType },
618-
#[snafu(display("io error calling '{name}'"))]
614+
#[error("io error calling '{name}'")]
619615
Io {
616+
#[error(std_err)]
620617
source: std::io::Error,
621618
name: &'static str,
622619
},
@@ -649,7 +646,10 @@ fn fetch_rib(af: i32, typ: RIBType, arg: i32) -> Result<Vec<u8>, RouteError> {
649646
)
650647
};
651648
if err != 0 {
652-
return Err(IoSnafu { name: "sysctl" }.into_error(std::io::Error::last_os_error()));
649+
return Err(e!(
650+
RouteError::Io { name: "sysctl" },
651+
std::io::Error::last_os_error()
652+
));
653653
}
654654
if n == 0 {
655655
// nothing available
@@ -675,7 +675,7 @@ fn fetch_rib(af: i32, typ: RIBType, arg: i32) -> Result<Vec<u8>, RouteError> {
675675
if io_err.raw_os_error().unwrap_or_default() == libc::ENOMEM && round < MAX_TRIES {
676676
continue;
677677
}
678-
return Err(IoSnafu { name: "sysctl" }.into_error(io_err));
678+
return Err(e!(RouteError::Io { name: "sysctl" }, io_err));
679679
}
680680
// Truncate b, to the new length
681681
b.truncate(n);
@@ -768,15 +768,15 @@ where
768768
let a = parse_link_addr(b)?;
769769
addrs.push(a);
770770
let l = roundup(b[0] as usize);
771-
snafu::ensure!(b.len() >= l, MessageTooShortSnafu);
771+
ensure!(b.len() >= l, RouteError::MessageTooShort);
772772
b = &b[l..];
773773
}
774774
AF_INET | AF_INET6 => {
775775
let af = b[1] as i32;
776776
let a = parse_inet_addr(af, b)?;
777777
addrs.push(a);
778778
let l = roundup(b[0] as usize);
779-
snafu::ensure!(b.len() >= l, MessageTooShortSnafu);
779+
ensure!(b.len() >= l, RouteError::MessageTooShort);
780780
b = &b[l..];
781781
}
782782
_ => {
@@ -794,7 +794,7 @@ where
794794
let a = parse_default_addr(b)?;
795795
addrs.push(a);
796796
let l = roundup(b[0] as usize);
797-
snafu::ensure!(b.len() >= l, MessageTooShortSnafu);
797+
ensure!(b.len() >= l, RouteError::MessageTooShort);
798798
b = &b[l..];
799799
}
800800
}
@@ -809,19 +809,19 @@ where
809809
fn parse_inet_addr(af: i32, b: &[u8]) -> Result<Addr, RouteError> {
810810
match af {
811811
AF_INET => {
812-
snafu::ensure!(b.len() >= SIZEOF_SOCKADDR_INET, InvalidAddressSnafu);
812+
ensure!(b.len() >= SIZEOF_SOCKADDR_INET, RouteError::InvalidAddress);
813813

814814
let ip = Ipv4Addr::new(b[4], b[5], b[6], b[7]);
815815
Ok(Addr::Inet4 { ip })
816816
}
817817
AF_INET6 => {
818-
snafu::ensure!(b.len() >= SIZEOF_SOCKADDR_INET6, InvalidAddressSnafu);
818+
ensure!(b.len() >= SIZEOF_SOCKADDR_INET6, RouteError::InvalidAddress);
819819

820820
let mut zone = u32_from_ne_range(b, 24..28)?;
821821
let mut oc: [u8; 16] = b
822822
.get(8..24)
823823
.and_then(|s| TryInto::<[u8; 16]>::try_into(s).ok())
824-
.context(InvalidMessageSnafu)?;
824+
.ok_or_else(|| e!(RouteError::InvalidMessage))?;
825825
if oc[0] == 0xfe && oc[1] & 0xc0 == 0x80
826826
|| oc[0] == 0xff && (oc[1] & 0x0f == 0x01 || oc[1] & 0x0f == 0x02)
827827
{
@@ -834,7 +834,7 @@ fn parse_inet_addr(af: i32, b: &[u8]) -> Result<Addr, RouteError> {
834834
.get(2..4)
835835
.and_then(|s| TryInto::<[u8; 2]>::try_into(s).ok())
836836
.map(u16::from_be_bytes)
837-
.context(InvalidMessageSnafu)? as u32;
837+
.ok_or_else(|| e!(RouteError::InvalidMessage))? as u32;
838838
if id != 0 {
839839
zone = id;
840840
oc[2] = 0;
@@ -846,7 +846,7 @@ fn parse_inet_addr(af: i32, b: &[u8]) -> Result<Addr, RouteError> {
846846
zone,
847847
})
848848
}
849-
_ => Err(InvalidAddressSnafu.build()),
849+
_ => Err(e!(RouteError::InvalidAddress)),
850850
}
851851
}
852852

@@ -885,7 +885,7 @@ fn parse_kernel_inet_addr(af: i32, b: &[u8]) -> Result<(i32, Addr), RouteError>
885885
l = roundup(l);
886886
}
887887

888-
snafu::ensure!(b.len() >= l, InvalidAddressSnafu);
888+
ensure!(b.len() >= l, RouteError::InvalidAddress);
889889
// Don't reorder case expressions.
890890
// The case expressions for IPv6 must come first.
891891
const OFF4: usize = 4; // offset of in_addr
@@ -895,7 +895,7 @@ fn parse_kernel_inet_addr(af: i32, b: &[u8]) -> Result<(i32, Addr), RouteError>
895895
let octets: [u8; 16] = b
896896
.get(OFF6..OFF6 + 16)
897897
.and_then(|s| TryInto::try_into(s).ok())
898-
.context(InvalidMessageSnafu)?;
898+
.ok_or_else(|| e!(RouteError::InvalidMessage))?;
899899
let ip = Ipv6Addr::from(octets);
900900
Addr::Inet6 { ip, zone: 0 }
901901
} else if af == AF_INET6 {
@@ -911,7 +911,7 @@ fn parse_kernel_inet_addr(af: i32, b: &[u8]) -> Result<(i32, Addr), RouteError>
911911
let octets: [u8; 4] = b
912912
.get(OFF4..OFF4 + 4)
913913
.and_then(|s| TryInto::try_into(s).ok())
914-
.context(InvalidMessageSnafu)?;
914+
.ok_or_else(|| e!(RouteError::InvalidMessage))?;
915915
let ip = Ipv4Addr::from(octets);
916916
Addr::Inet4 { ip }
917917
} else {
@@ -930,7 +930,7 @@ fn parse_kernel_inet_addr(af: i32, b: &[u8]) -> Result<(i32, Addr), RouteError>
930930
}
931931

932932
fn parse_link_addr(b: &[u8]) -> Result<Addr, RouteError> {
933-
snafu::ensure!(b.len() >= 8, InvalidAddressSnafu);
933+
ensure!(b.len() >= 8, RouteError::InvalidAddress);
934934
let (_, mut a) = parse_kernel_link_addr(AF_LINK, &b[4..])?;
935935

936936
if let Addr::Link { index, .. } = &mut a {
@@ -972,12 +972,12 @@ fn parse_kernel_link_addr(_: i32, b: &[u8]) -> Result<(usize, Addr), RouteError>
972972
}
973973

974974
let l = 4 + nlen + alen + slen;
975-
snafu::ensure!(b.len() >= l, InvalidAddressSnafu);
975+
ensure!(b.len() >= l, RouteError::InvalidAddress);
976976
let mut data = &b[4..];
977977

978978
let name = if nlen > 0 {
979979
let name = std::str::from_utf8(&data[..nlen])
980-
.map_err(|_| InvalidAddressSnafu.build())?
980+
.map_err(|_| e!(RouteError::InvalidAddress))?
981981
.to_string();
982982
data = &data[nlen..];
983983
Some(name)
@@ -1001,9 +1001,9 @@ fn parse_kernel_link_addr(_: i32, b: &[u8]) -> Result<(usize, Addr), RouteError>
10011001
}
10021002

10031003
fn parse_default_addr(b: &[u8]) -> Result<Addr, RouteError> {
1004-
snafu::ensure!(
1004+
ensure!(
10051005
b.len() >= 2 && b.len() >= b[0] as usize,
1006-
InvalidAddressSnafu
1006+
RouteError::InvalidAddress
10071007
);
10081008
Ok(Addr::Default {
10091009
af: b[1] as _,

0 commit comments

Comments
 (0)