Skip to content

Commit 17c11bb

Browse files
committed
Replace error strings with enums
1 parent 3bbb520 commit 17c11bb

15 files changed

+13954
-10543
lines changed

capnp/Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ quickcheck = { version = "1", optional = true }
2121
quickcheck = "1"
2222

2323
[features]
24-
default = ["std"]
24+
alloc = []
25+
default = ["std", "alloc"]
2526

2627
rpc_try = []
2728

capnp/src/dynamic_list.rs

+10-14
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::dynamic_value;
44
use crate::introspect::{Type, TypeVariant};
55
use crate::private::layout::{self, PrimitiveElement};
66
use crate::traits::{IndexMove, ListIter};
7-
use crate::Result;
7+
use crate::{Error, ErrorKind, Result};
88

99
/// A read-only dynamically-typed list.
1010
#[derive(Copy, Clone)]
@@ -321,13 +321,13 @@ impl<'a> Builder<'a> {
321321
.reborrow()
322322
.get_pointer_element(index)
323323
.set_list(&list.reader, false),
324-
(TypeVariant::AnyPointer, _) => Err(crate::Error::failed(
325-
"List(AnyPointer) not supported".into(),
326-
)),
327-
(TypeVariant::Capability, dynamic_value::Reader::Capability(_)) => Err(
328-
crate::Error::failed("List(Capability) not supported".into()),
329-
),
330-
(_, _) => Err(crate::Error::failed("Type mismatch".into())),
324+
(TypeVariant::AnyPointer, _) => {
325+
Err(Error::from_kind(ErrorKind::ListAnyPointerNotSupported))
326+
}
327+
(TypeVariant::Capability, dynamic_value::Reader::Capability(_)) => {
328+
Err(Error::from_kind(ErrorKind::ListCapabilityNotSupported))
329+
}
330+
(_, _) => Err(Error::from_kind(ErrorKind::TypeMismatch)),
331331
}
332332
}
333333

@@ -348,9 +348,7 @@ impl<'a> Builder<'a> {
348348
| TypeVariant::Float64
349349
| TypeVariant::Enum(_)
350350
| TypeVariant::Struct(_)
351-
| TypeVariant::Capability => {
352-
Err(crate::Error::failed("Expected a list or blob.".into()))
353-
}
351+
| TypeVariant::Capability => Err(Error::from_kind(ErrorKind::ExpectedAListOrBlob)),
354352
TypeVariant::Text => Ok(self
355353
.builder
356354
.get_pointer_element(index)
@@ -378,9 +376,7 @@ impl<'a> Builder<'a> {
378376
)
379377
.into()),
380378
},
381-
TypeVariant::AnyPointer => Err(crate::Error::failed(
382-
"List(AnyPointer) not supported.".into(),
383-
)),
379+
TypeVariant::AnyPointer => Err(Error::from_kind(ErrorKind::ListAnyPointerNotSupported)),
384380
}
385381
}
386382
}

capnp/src/dynamic_struct.rs

+28-34
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use crate::introspect::TypeVariant;
44
use crate::private::layout;
55
use crate::schema::{Field, StructSchema};
66
use crate::schema_capnp::{field, node, value};
7-
use crate::Result;
87
use crate::{dynamic_list, dynamic_value};
8+
use crate::{Error, ErrorKind, Result};
99

1010
fn has_discriminant_value(reader: field::Reader) -> bool {
1111
reader.get_discriminant_value() != field::NO_DISCRIMINANT
@@ -18,7 +18,7 @@ pub(crate) fn struct_size_from_schema(schema: StructSchema) -> Result<layout::St
1818
pointers: s.get_pointer_count(),
1919
})
2020
} else {
21-
Err(crate::Error::failed("not a struct".into()))
21+
Err(Error::from_kind(ErrorKind::NotAStruct))
2222
}
2323
}
2424

@@ -160,16 +160,14 @@ impl<'a> Reader<'a> {
160160
(TypeVariant::Capability, value::Interface(())) => {
161161
Ok(dynamic_value::Reader::Capability(dynamic_value::Capability))
162162
}
163-
_ => Err(crate::Error::failed("field and default mismatch".into())),
163+
_ => Err(Error::from_kind(ErrorKind::FieldAndDefaultMismatch)),
164164
}
165165
}
166166
field::Group(_) => {
167167
if let TypeVariant::Struct(schema) = ty.which() {
168168
Ok(Reader::new(self.reader, schema.into()).into())
169169
} else {
170-
Err(crate::Error::failed(
171-
"group field but type is not Struct".into(),
172-
))
170+
Err(Error::from_kind(ErrorKind::GroupFieldButTypeIsNotStruct))
173171
}
174172
}
175173
}
@@ -184,7 +182,7 @@ impl<'a> Reader<'a> {
184182
/// Otherwise, returns None.
185183
pub fn which(&self) -> Result<Option<Field>> {
186184
let node::Struct(st) = self.schema.get_proto().which()? else {
187-
return Err(crate::Error::failed("not a struct".into()))
185+
return Err(Error::from_kind(ErrorKind::NotAStruct))
188186
};
189187
if st.get_discriminant_count() == 0 {
190188
Ok(None)
@@ -202,7 +200,7 @@ impl<'a> Reader<'a> {
202200
let proto = field.get_proto();
203201
if has_discriminant_value(proto) {
204202
let node::Struct(st) = self.schema.get_proto().which()? else {
205-
return Err(crate::Error::failed("not a struct".into()))
203+
return Err(Error::from_kind(ErrorKind::NotAStruct))
206204
};
207205

208206
let discrim = self
@@ -392,16 +390,14 @@ impl<'a> Builder<'a> {
392390
(TypeVariant::Capability, value::Interface(())) => Ok(
393391
dynamic_value::Builder::Capability(dynamic_value::Capability),
394392
),
395-
_ => Err(crate::Error::failed("field and default mismatch".into())),
393+
_ => Err(Error::from_kind(ErrorKind::FieldAndDefaultMismatch)),
396394
}
397395
}
398396
field::Group(_) => {
399397
if let TypeVariant::Struct(schema) = ty.which() {
400398
Ok(Builder::new(self.builder, schema.into()).into())
401399
} else {
402-
Err(crate::Error::failed(
403-
"group field but type is not Struct".into(),
404-
))
400+
Err(Error::from_kind(ErrorKind::GroupFieldButTypeIsNotStruct))
405401
}
406402
}
407403
}
@@ -414,7 +410,7 @@ impl<'a> Builder<'a> {
414410

415411
pub fn which(&self) -> Result<Option<Field>> {
416412
let node::Struct(st) = self.schema.get_proto().which()? else {
417-
return Err(crate::Error::failed("not a struct".into()))
413+
return Err(Error::from_kind(ErrorKind::NotAStruct))
418414
};
419415
if st.get_discriminant_count() == 0 {
420416
Ok(None)
@@ -518,28 +514,26 @@ impl<'a> Builder<'a> {
518514
dynamic_value::Reader::Data(t) => target.set_as(t),
519515
dynamic_value::Reader::Struct(s) => target.set_as(s),
520516
dynamic_value::Reader::List(l) => target.set_as(l),
521-
dynamic_value::Reader::Capability(_) => {
522-
Err(crate::Error::unimplemented(
523-
"setting dynamic capabilities is unsupported".into(),
524-
))
525-
}
526-
_ => Err(crate::Error::failed(
527-
"cannot set AnyPointer field to a primitive value".into(),
517+
dynamic_value::Reader::Capability(_) => Err(Error::from_kind(
518+
ErrorKind::SettingDynamicCapabilitiesIsUnsupported,
519+
)),
520+
_ => Err(Error::from_kind(
521+
ErrorKind::CannotSetAnyPointerFieldToAPrimitiveValue,
528522
)),
529523
}
530524
}
531-
(TypeVariant::Capability, _, _) => Err(crate::Error::unimplemented(
532-
"setting dynamic capabilities is unsupported".into(),
525+
(TypeVariant::Capability, _, _) => Err(Error::from_kind(
526+
ErrorKind::SettingDynamicCapabilitiesIsUnsupported,
533527
)),
534-
_ => Err(crate::Error::failed("type mismatch".into())),
528+
_ => Err(Error::from_kind(ErrorKind::TypeMismatch)),
535529
}
536530
}
537531
field::Group(_group) => {
538532
let dynamic_value::Reader::Struct(src) = value else {
539-
return Err(crate::Error::failed("not a struct".into()))
533+
return Err(Error::from_kind(ErrorKind::NotAStruct))
540534
};
541535
let dynamic_value::Builder::Struct(mut dst) = self.reborrow().init(field)? else {
542-
return Err(crate::Error::failed("not a struct".into()))
536+
return Err(Error::from_kind(ErrorKind::NotAStruct))
543537
};
544538
if let Some(union_field) = src.which()? {
545539
dst.set(union_field, src.get(union_field)?)?;
@@ -583,15 +577,15 @@ impl<'a> Builder<'a> {
583577
p.clear();
584578
Ok(crate::any_pointer::Builder::new(p).into())
585579
}
586-
_ => Err(crate::Error::failed(
587-
"init() is only valid for struct and AnyPointer fields".into(),
580+
_ => Err(Error::from_kind(
581+
ErrorKind::InitIsOnlyValidForStructAndAnyPointerFields,
588582
)),
589583
}
590584
}
591585
field::Group(_) => {
592586
self.clear(field)?;
593587
let TypeVariant::Struct(schema) = ty.which() else {
594-
return Err(crate::Error::failed("not a struct".into()))
588+
return Err(Error::from_kind(ErrorKind::NotAStruct))
595589
};
596590
Ok((Builder::new(self.builder, schema.into())).into())
597591
}
@@ -638,13 +632,13 @@ impl<'a> Builder<'a> {
638632
.init_data(size)
639633
.into()),
640634

641-
_ => Err(crate::Error::failed(
642-
"initn() is only valid for list, text, or data fields".into(),
635+
_ => Err(Error::from_kind(
636+
ErrorKind::InitnIsOnlyValidForListTextOrDataFields,
643637
)),
644638
}
645639
}
646-
field::Group(_) => Err(crate::Error::failed(
647-
"initn() is only valid for list, text, or data fields".into(),
640+
field::Group(_) => Err(Error::from_kind(
641+
ErrorKind::InitnIsOnlyValidForListTextOrDataFields,
648642
)),
649643
}
650644
}
@@ -689,7 +683,7 @@ impl<'a> Builder<'a> {
689683
}
690684
field::Group(_) => {
691685
let TypeVariant::Struct(schema) = ty.which() else {
692-
return Err(crate::Error::failed("not a struct".into()))
686+
return Err(Error::from_kind(ErrorKind::NotAStruct))
693687
};
694688
let mut group = Builder::new(self.builder.reborrow(), schema.into());
695689

@@ -716,7 +710,7 @@ impl<'a> Builder<'a> {
716710
fn set_in_union(&mut self, field: Field) -> Result<()> {
717711
if has_discriminant_value(field.get_proto()) {
718712
let node::Struct(st) = self.schema.get_proto().which()? else {
719-
return Err(crate::Error::failed("not a struct".into()))
713+
return Err(Error::from_kind(ErrorKind::NotAStruct))
720714
};
721715
self.builder.set_data_field::<u16>(
722716
st.get_discriminant_offset() as usize,

capnp/src/dynamic_value.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ impl<'a> Reader<'a> {
5959
}
6060
(value::Interface(()), TypeVariant::Capability) => Ok(Capability.into()),
6161
(value::AnyPointer(a), TypeVariant::AnyPointer) => Ok(a.into()),
62-
_ => Err(crate::Error::failed("type mismatch".into())),
62+
_ => Err(crate::Error::from_kind(crate::ErrorKind::TypeMismatch)),
6363
}
6464
}
6565

capnp/src/io.rs

+5-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
//! Custom I/O traits that roughly mirror `std::io::{Read, BufRead, Write}`.
22
//! This extra layer of indirection enables support of no-std environments.
33
4-
use alloc::string::ToString;
5-
6-
use crate::Result;
4+
use crate::{Error, ErrorKind, Result};
75

86
/// A rough approximation of std::io::Read.
97
pub trait Read {
@@ -26,9 +24,7 @@ pub trait Read {
2624
}
2725
}
2826
if !buf.is_empty() {
29-
Err(crate::Error::failed(
30-
"failed to fill the whole buffer".to_string(),
31-
))
27+
Err(Error::from_kind(ErrorKind::FailedToFillTheWholeBuffer))
3228
} else {
3329
Ok(())
3430
}
@@ -92,13 +88,14 @@ mod std_impls {
9288
#[cfg(not(feature = "std"))]
9389
mod no_std_impls {
9490
use crate::io::{BufRead, Read, Write};
95-
use crate::{Error, Result};
91+
use crate::{Error, ErrorKind, Result};
92+
#[cfg(feature = "alloc")]
9693
use alloc::string::ToString;
9794

9895
impl<'a> Write for &'a mut [u8] {
9996
fn write_all(&mut self, buf: &[u8]) -> Result<()> {
10097
if buf.len() > self.len() {
101-
return Err(Error::failed("buffer is not large enough".to_string()));
98+
return Err(Error::from_kind(ErrorKind::BufferNotLargeEnough));
10299
}
103100
let amt = buf.len();
104101
let (a, b) = core::mem::take(self).split_at_mut(amt);

0 commit comments

Comments
 (0)