@@ -4,8 +4,8 @@ use crate::introspect::TypeVariant;
44use crate :: private:: layout;
55use crate :: schema:: { Field , StructSchema } ;
66use crate :: schema_capnp:: { field, node, value} ;
7- use crate :: Result ;
87use crate :: { dynamic_list, dynamic_value} ;
8+ use crate :: { Error , ErrorKind , Result } ;
99
1010fn 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 ,
0 commit comments