@@ -26,15 +26,16 @@ pub(crate) fn generate_kubernetes_conversion(
26
26
let src_lower = src_lower. parse :: < TokenStream > ( ) . expect ( "The versions always needs to be a valid TokenStream" ) ;
27
27
28
28
quote ! { ( Self :: #src, Self :: #dst) => {
29
- let resource: #src_lower:: #struct_ident = serde_json:: from_value( object_spec)
30
- . expect ( & format! ( "Failed to deserialize {}" , stringify!( #enum_ident) ) ) ;
29
+ let resource: #src_lower:: #struct_ident = serde_json:: from_value( object_spec. clone ( ) )
30
+ . map_err ( |err| ConversionError :: DeserializeObjectSpec { source : err , kind : stringify!( #enum_ident) . to_string ( ) } ) ? ;
31
31
32
32
#(
33
33
let resource: #version_chain_string:: #struct_ident = resource. into( ) ;
34
34
) *
35
35
36
36
converted. push(
37
- serde_json:: to_value( resource) . expect( & format!( "Failed to serialize {}" , stringify!( #enum_ident) ) )
37
+ serde_json:: to_value( resource)
38
+ . map_err( |err| ConversionError :: SerializeObjectSpec { source: err, kind: stringify!( #enum_ident) . to_string( ) } ) ?
38
39
) ;
39
40
} }
40
41
} ,
@@ -44,38 +45,46 @@ pub(crate) fn generate_kubernetes_conversion(
44
45
#[ automatically_derived]
45
46
impl #enum_ident {
46
47
pub fn convert( review: kube:: core:: conversion:: ConversionReview ) -> kube:: core:: conversion:: ConversionResponse {
48
+ Self :: try_convert( review) . expect( "Self::try_convert failed" )
49
+ }
50
+
51
+ fn try_convert( review: kube:: core:: conversion:: ConversionReview ) -> Result <kube:: core:: conversion:: ConversionResponse , stackable_versioned:: ConversionError > {
52
+ // Intentionally not using `snafu::ResultExt` here to keep the number of dependencies minimal
53
+ use stackable_versioned:: ConversionError ;
54
+
47
55
let request = kube:: core:: conversion:: ConversionRequest :: from_review( review)
48
- . unwrap( ) ;
49
- let desired_api_version = <Self as std:: str :: FromStr >:: from_str( & request. desired_api_version)
50
- . expect( & format!( "invalid desired version for {} resource" , stringify!( #enum_ident) ) ) ;
56
+ . map_err( |err| ConversionError :: ConvertReviewToRequest { source: err} ) ?;
57
+ let desired_object_version = <Self as std:: str :: FromStr >:: from_str( & request. desired_api_version)
58
+ . map_err( |err| ConversionError :: ParseDesiredResourceVersion {
59
+ source: err,
60
+ version: request. desired_api_version. to_string( )
61
+ } ) ?;
51
62
52
63
let mut converted: Vec <serde_json:: Value > = Vec :: with_capacity( request. objects. len( ) ) ;
53
64
for object in & request. objects {
54
- let object_spec = object
55
- . get( "spec" )
56
- . expect( "The passed object had no spec" )
57
- . clone( ) ;
58
- let kind = object
59
- . get( "kind" )
60
- . expect( "The objected asked to convert has no kind" ) ;
61
- let api_version = object
62
- . get( "apiVersion" )
63
- . expect( "The objected asked to convert has no apiVersion" )
64
- . as_str( )
65
- . expect( "The apiVersion of the objected asked to convert wasn't a String" ) ;
66
-
67
- assert_eq!( kind, stringify!( #enum_ident) ) ;
68
-
69
- let current_api_version = <Self as std:: str :: FromStr >:: from_str( api_version)
70
- . expect( & format!( "invalid current version for {} resource" , stringify!( #enum_ident) ) ) ;
71
-
72
- match ( & current_api_version, & desired_api_version) {
65
+ let object_spec = object. get( "spec" ) . ok_or_else( || ConversionError :: ObjectHasNoSpec { } ) ?;
66
+ let object_kind = object. get( "kind" ) . ok_or_else( || ConversionError :: ObjectHasNoKind { } ) ?;
67
+ let object_kind = object_kind. as_str( ) . ok_or_else( || ConversionError :: ObjectKindNotString { kind: object_kind. clone( ) } ) ?;
68
+ let object_version = object. get( "apiVersion" ) . ok_or_else( || ConversionError :: ObjectHasNoApiVersion { } ) ?;
69
+ let object_version = object_version. as_str( ) . ok_or_else( || ConversionError :: ObjectApiVersionNotString { api_version: object_version. clone( ) } ) ?;
70
+
71
+ if object_kind != stringify!( #enum_ident) {
72
+ return Err ( ConversionError :: WrongObjectKind { expected_kind: stringify!( #enum_ident) . to_string( ) , send_kind: object_kind. to_string( ) } ) ;
73
+ }
74
+
75
+ let current_object_version = <Self as std:: str :: FromStr >:: from_str( object_version)
76
+ . map_err( |err| ConversionError :: ParseCurrentResourceVersion {
77
+ source: err,
78
+ version: object_version. to_string( )
79
+ } ) ?;
80
+
81
+ match ( & current_object_version, & desired_object_version) {
73
82
#( #matches) , *
74
83
}
75
84
}
76
85
77
86
let response = kube:: core:: conversion:: ConversionResponse :: for_request( request) ;
78
- response. success( converted)
87
+ Ok ( response. success( converted) )
79
88
}
80
89
}
81
90
} )
0 commit comments