@@ -4,8 +4,8 @@ use crate::introspect::TypeVariant;
4
4
use crate :: private:: layout;
5
5
use crate :: schema:: { Field , StructSchema } ;
6
6
use crate :: schema_capnp:: { field, node, value} ;
7
- use crate :: Result ;
8
7
use crate :: { dynamic_list, dynamic_value} ;
8
+ use crate :: { Error , ErrorKind , Result } ;
9
9
10
10
fn has_discriminant_value ( reader : field:: Reader ) -> bool {
11
11
reader. get_discriminant_value ( ) != field:: NO_DISCRIMINANT
@@ -18,7 +18,7 @@ pub(crate) fn struct_size_from_schema(schema: StructSchema) -> Result<layout::St
18
18
pointers : s. get_pointer_count ( ) ,
19
19
} )
20
20
} else {
21
- Err ( crate :: Error :: failed ( "not a struct" . into ( ) ) )
21
+ Err ( Error :: from_kind ( ErrorKind :: NotAStruct ) )
22
22
}
23
23
}
24
24
@@ -160,16 +160,14 @@ impl<'a> Reader<'a> {
160
160
( TypeVariant :: Capability , value:: Interface ( ( ) ) ) => {
161
161
Ok ( dynamic_value:: Reader :: Capability ( dynamic_value:: Capability ) )
162
162
}
163
- _ => Err ( crate :: Error :: failed ( "field and default mismatch" . into ( ) ) ) ,
163
+ _ => Err ( Error :: from_kind ( ErrorKind :: FieldAndDefaultMismatch ) ) ,
164
164
}
165
165
}
166
166
field:: Group ( _) => {
167
167
if let TypeVariant :: Struct ( schema) = ty. which ( ) {
168
168
Ok ( Reader :: new ( self . reader , schema. into ( ) ) . into ( ) )
169
169
} else {
170
- Err ( crate :: Error :: failed (
171
- "group field but type is not Struct" . into ( ) ,
172
- ) )
170
+ Err ( Error :: from_kind ( ErrorKind :: GroupFieldButTypeIsNotStruct ) )
173
171
}
174
172
}
175
173
}
@@ -184,7 +182,7 @@ impl<'a> Reader<'a> {
184
182
/// Otherwise, returns None.
185
183
pub fn which ( & self ) -> Result < Option < Field > > {
186
184
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 ) )
188
186
} ;
189
187
if st. get_discriminant_count ( ) == 0 {
190
188
Ok ( None )
@@ -202,7 +200,7 @@ impl<'a> Reader<'a> {
202
200
let proto = field. get_proto ( ) ;
203
201
if has_discriminant_value ( proto) {
204
202
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 ) )
206
204
} ;
207
205
208
206
let discrim = self
@@ -392,16 +390,14 @@ impl<'a> Builder<'a> {
392
390
( TypeVariant :: Capability , value:: Interface ( ( ) ) ) => Ok (
393
391
dynamic_value:: Builder :: Capability ( dynamic_value:: Capability ) ,
394
392
) ,
395
- _ => Err ( crate :: Error :: failed ( "field and default mismatch" . into ( ) ) ) ,
393
+ _ => Err ( Error :: from_kind ( ErrorKind :: FieldAndDefaultMismatch ) ) ,
396
394
}
397
395
}
398
396
field:: Group ( _) => {
399
397
if let TypeVariant :: Struct ( schema) = ty. which ( ) {
400
398
Ok ( Builder :: new ( self . builder , schema. into ( ) ) . into ( ) )
401
399
} else {
402
- Err ( crate :: Error :: failed (
403
- "group field but type is not Struct" . into ( ) ,
404
- ) )
400
+ Err ( Error :: from_kind ( ErrorKind :: GroupFieldButTypeIsNotStruct ) )
405
401
}
406
402
}
407
403
}
@@ -414,7 +410,7 @@ impl<'a> Builder<'a> {
414
410
415
411
pub fn which ( & self ) -> Result < Option < Field > > {
416
412
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 ) )
418
414
} ;
419
415
if st. get_discriminant_count ( ) == 0 {
420
416
Ok ( None )
@@ -518,28 +514,26 @@ impl<'a> Builder<'a> {
518
514
dynamic_value:: Reader :: Data ( t) => target. set_as ( t) ,
519
515
dynamic_value:: Reader :: Struct ( s) => target. set_as ( s) ,
520
516
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 ,
528
522
) ) ,
529
523
}
530
524
}
531
- ( TypeVariant :: Capability , _, _) => Err ( crate :: Error :: unimplemented (
532
- "setting dynamic capabilities is unsupported" . into ( ) ,
525
+ ( TypeVariant :: Capability , _, _) => Err ( Error :: from_kind (
526
+ ErrorKind :: SettingDynamicCapabilitiesIsUnsupported ,
533
527
) ) ,
534
- _ => Err ( crate :: Error :: failed ( "type mismatch" . into ( ) ) ) ,
528
+ _ => Err ( Error :: from_kind ( ErrorKind :: TypeMismatch ) ) ,
535
529
}
536
530
}
537
531
field:: Group ( _group) => {
538
532
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 ) )
540
534
} ;
541
535
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 ) )
543
537
} ;
544
538
if let Some ( union_field) = src. which ( ) ? {
545
539
dst. set ( union_field, src. get ( union_field) ?) ?;
@@ -583,15 +577,15 @@ impl<'a> Builder<'a> {
583
577
p. clear ( ) ;
584
578
Ok ( crate :: any_pointer:: Builder :: new ( p) . into ( ) )
585
579
}
586
- _ => Err ( crate :: Error :: failed (
587
- "init() is only valid for struct and AnyPointer fields" . into ( ) ,
580
+ _ => Err ( Error :: from_kind (
581
+ ErrorKind :: InitIsOnlyValidForStructAndAnyPointerFields ,
588
582
) ) ,
589
583
}
590
584
}
591
585
field:: Group ( _) => {
592
586
self . clear ( field) ?;
593
587
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 ) )
595
589
} ;
596
590
Ok ( ( Builder :: new ( self . builder , schema. into ( ) ) ) . into ( ) )
597
591
}
@@ -638,13 +632,13 @@ impl<'a> Builder<'a> {
638
632
. init_data ( size)
639
633
. into ( ) ) ,
640
634
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 ,
643
637
) ) ,
644
638
}
645
639
}
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 ,
648
642
) ) ,
649
643
}
650
644
}
@@ -689,7 +683,7 @@ impl<'a> Builder<'a> {
689
683
}
690
684
field:: Group ( _) => {
691
685
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 ) )
693
687
} ;
694
688
let mut group = Builder :: new ( self . builder . reborrow ( ) , schema. into ( ) ) ;
695
689
@@ -716,7 +710,7 @@ impl<'a> Builder<'a> {
716
710
fn set_in_union ( & mut self , field : Field ) -> Result < ( ) > {
717
711
if has_discriminant_value ( field. get_proto ( ) ) {
718
712
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 ) )
720
714
} ;
721
715
self . builder . set_data_field :: < u16 > (
722
716
st. get_discriminant_offset ( ) as usize ,
0 commit comments