@@ -27,59 +27,78 @@ fn map_option_to_init_error<T>(t: Option<T>, message: &'static str) -> Result<T,
27
27
}
28
28
}
29
29
30
- unsafe fn find_api_ptr (
31
- core_api : * const godot_gdnative_core_api_struct ,
30
+ unsafe fn find_version (
31
+ mut api : * const godot_gdnative_api_struct ,
32
32
api_type : GDNATIVE_API_TYPES ,
33
33
version_major : u32 ,
34
34
version_minor : u32 ,
35
- ) -> Result < * const godot_gdnative_api_struct , InitError > {
35
+ ) -> Option < Result < * const godot_gdnative_api_struct , InitError > > {
36
36
let mut got = None ;
37
- let mut api = core_api as * const godot_gdnative_api_struct ;
38
37
if ( * api) . type_ as u32 == api_type as u32 {
39
38
while !api. is_null ( ) {
40
39
// The boolean expression below SHOULD always be true;
41
40
// we will double check to be safe.
42
41
if ( * api) . type_ as u32 == api_type as u32 {
43
42
let ( major, minor) = ( ( * api) . version . major , ( * api) . version . minor ) ;
44
43
if major == version_major && minor == version_minor {
45
- return Ok ( api) ;
44
+ return Some ( Ok ( api) ) ;
46
45
} else {
47
46
got = Some ( godot_gdnative_api_version { major, minor } ) ;
48
47
}
49
48
}
50
49
api = ( * api) . next ;
51
50
}
52
51
}
53
- for i in 0 ..( * core_api) . num_extensions {
54
- let mut extension =
55
- * ( * core_api) . extensions . offset ( i as _ ) as * const godot_gdnative_api_struct ;
56
- if ( * extension) . type_ as u32 == api_type as u32 {
57
- while !extension. is_null ( ) {
58
- // The boolean expression below SHOULD always be true;
59
- // we will double check to be safe.
60
- if ( * extension) . type_ as u32 == api_type as u32 {
61
- let ( major, minor) = ( ( * extension) . version . major , ( * extension) . version . minor ) ;
62
- if major == version_major && minor == version_minor {
63
- return Ok ( extension) ;
64
- } else {
65
- got = Some ( godot_gdnative_api_version { major, minor } ) ;
66
- }
67
- }
68
- extension = ( * extension) . next ;
69
- }
70
- }
71
- }
72
- match got {
73
- Some ( got) => Err ( InitError :: VersionMismatch {
52
+ got. map ( |got| {
53
+ Err ( InitError :: VersionMismatch {
74
54
want : godot_gdnative_api_version {
75
55
major : version_major,
76
56
minor : version_minor,
77
57
} ,
78
58
got,
79
59
api_type,
80
- } ) ,
81
- None => Err ( InitError :: Generic {
82
- message : format ! ( "Couldn't find API struct with type {}" , api_type) ,
83
- } ) ,
60
+ } )
61
+ } )
62
+ }
63
+
64
+ unsafe fn find_api_ptr (
65
+ core_api : * const godot_gdnative_core_api_struct ,
66
+ api_type : GDNATIVE_API_TYPES ,
67
+ version_major : u32 ,
68
+ version_minor : u32 ,
69
+ ) -> Result < * const godot_gdnative_api_struct , InitError > {
70
+ let mut last_error = None ;
71
+ match find_version (
72
+ core_api as * const godot_gdnative_api_struct ,
73
+ api_type,
74
+ version_major,
75
+ version_minor,
76
+ ) {
77
+ Some ( Ok ( api) ) => {
78
+ return Ok ( api) ;
79
+ }
80
+ Some ( Err ( error) ) => {
81
+ last_error = Some ( error) ;
82
+ }
83
+ None => { }
84
+ }
85
+ for i in 0 ..( * core_api) . num_extensions {
86
+ match find_version (
87
+ * ( * core_api) . extensions . offset ( i as _ ) ,
88
+ api_type,
89
+ version_major,
90
+ version_minor,
91
+ ) {
92
+ Some ( Ok ( api) ) => {
93
+ return Ok ( api) ;
94
+ }
95
+ Some ( Err ( error) ) => {
96
+ last_error = Some ( error) ;
97
+ }
98
+ None => { }
99
+ }
84
100
}
101
+ Err ( last_error. unwrap_or ( InitError :: Generic {
102
+ message : format ! ( "Couldn't find API struct with type {}" , api_type) ,
103
+ } ) )
85
104
}
0 commit comments