@@ -4,7 +4,7 @@ use super::{CodegenTest, ExpectedCHeader, ExpectedRustTokens, ExpectedSwiftCode}
4
4
use proc_macro2:: TokenStream ;
5
5
use quote:: quote;
6
6
7
- /// Test code generation for Rust function that accepts and returns a Result<T, E>
7
+ /// Test code generation for Rust function that accepts a Result<T, E>
8
8
/// where T and E are Strings.
9
9
mod extern_rust_fn_result_string {
10
10
use super :: * ;
@@ -64,6 +64,72 @@ void __swift_bridge__$some_function(struct __private__ResultPtrAndPtr arg);
64
64
}
65
65
}
66
66
67
+ /// Test code generation for Rust function that returns a Result<T, E>
68
+ /// where T and E are Strings.
69
+ mod extern_rust_fn_return_result_string {
70
+ use super :: * ;
71
+
72
+ fn bridge_module_tokens ( ) -> TokenStream {
73
+ quote ! {
74
+ mod ffi {
75
+ extern "Rust" {
76
+ fn some_function( ) -> Result <String , String >;
77
+ }
78
+ }
79
+ }
80
+ }
81
+
82
+ fn expected_rust_tokens ( ) -> ExpectedRustTokens {
83
+ ExpectedRustTokens :: Contains ( quote ! {
84
+ #[ export_name = "__swift_bridge__$some_function" ]
85
+ pub extern "C" fn __swift_bridge__some_function(
86
+ ) -> swift_bridge:: result:: ResultPtrAndPtr {
87
+ match super :: some_function( ) {
88
+ Ok ( ok) => {
89
+ swift_bridge:: result:: ResultPtrAndPtr {
90
+ is_ok: true ,
91
+ ok_or_err: swift_bridge:: string:: RustString ( ok) . box_into_raw( ) as * mut std:: ffi:: c_void
92
+ }
93
+ }
94
+ Err ( err) => {
95
+ swift_bridge:: result:: ResultPtrAndPtr {
96
+ is_ok: false ,
97
+ ok_or_err: swift_bridge:: string:: RustString ( err) . box_into_raw( ) as * mut std:: ffi:: c_void
98
+ }
99
+ }
100
+ }
101
+ }
102
+ } )
103
+ }
104
+
105
+ fn expected_swift_code ( ) -> ExpectedSwiftCode {
106
+ ExpectedSwiftCode :: ContainsAfterTrim (
107
+ r#"
108
+ public func some_function() throws -> RustString {
109
+ try { let val = __swift_bridge__$some_function(); if val.is_ok { return RustString(ptr: val.ok_or_err!) } else { throw RustString(ptr: val.ok_or_err!) } }()
110
+ }
111
+ "# ,
112
+ )
113
+ }
114
+
115
+ const EXPECTED_C_HEADER : ExpectedCHeader = ExpectedCHeader :: ExactAfterTrim (
116
+ r#"
117
+ struct __private__ResultPtrAndPtr __swift_bridge__$some_function(void);
118
+ "# ,
119
+ ) ;
120
+
121
+ #[ test]
122
+ fn extern_rust_fn_return_result_string ( ) {
123
+ CodegenTest {
124
+ bridge_module : bridge_module_tokens ( ) . into ( ) ,
125
+ expected_rust_tokens : expected_rust_tokens ( ) ,
126
+ expected_swift_code : expected_swift_code ( ) ,
127
+ expected_c_header : EXPECTED_C_HEADER ,
128
+ }
129
+ . test ( ) ;
130
+ }
131
+ }
132
+
67
133
/// Test code generation for Rust function that accepts a Result<T, E> where T and E are
68
134
/// opaque Rust types.
69
135
mod extern_rust_fn_arg_result_opaque_rust {
@@ -449,7 +515,7 @@ public func some_function() throws -> SomeOkType {
449
515
r#"
450
516
typedef enum __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Tag {__swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$ResultOk, __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$ResultErr} __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Tag;
451
517
union __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Fields {void* ok; struct __swift_bridge__$SomeErrEnum err;};
452
- typedef struct __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum{__swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Tag tag; union __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Fields payload;} __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum;
518
+ typedef struct __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum{__swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Tag tag; union __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Fields payload;} __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum;
453
519
"# ,
454
520
r#"struct __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum __swift_bridge__$some_function(void)"# ,
455
521
] )
@@ -531,7 +597,7 @@ public func some_function() throws -> SomeOkEnum {
531
597
r#"
532
598
typedef enum __swift_bridge__$ResultSomeOkEnumAndSomeErrType$Tag {__swift_bridge__$ResultSomeOkEnumAndSomeErrType$ResultOk, __swift_bridge__$ResultSomeOkEnumAndSomeErrType$ResultErr} __swift_bridge__$ResultSomeOkEnumAndSomeErrType$Tag;
533
599
union __swift_bridge__$ResultSomeOkEnumAndSomeErrType$Fields {struct __swift_bridge__$SomeOkEnum ok; void* err;};
534
- typedef struct __swift_bridge__$ResultSomeOkEnumAndSomeErrType{__swift_bridge__$ResultSomeOkEnumAndSomeErrType$Tag tag; union __swift_bridge__$ResultSomeOkEnumAndSomeErrType$Fields payload;} __swift_bridge__$ResultSomeOkEnumAndSomeErrType;
600
+ typedef struct __swift_bridge__$ResultSomeOkEnumAndSomeErrType{__swift_bridge__$ResultSomeOkEnumAndSomeErrType$Tag tag; union __swift_bridge__$ResultSomeOkEnumAndSomeErrType$Fields payload;} __swift_bridge__$ResultSomeOkEnumAndSomeErrType;
535
601
"# ,
536
602
r#"struct __swift_bridge__$ResultSomeOkEnumAndSomeErrType __swift_bridge__$some_function(void)"# ,
537
603
] )
@@ -606,7 +672,7 @@ public func some_function() throws -> () {
606
672
r#"
607
673
typedef enum __swift_bridge__$ResultVoidAndSomeErrEnum$Tag {__swift_bridge__$ResultVoidAndSomeErrEnum$ResultOk, __swift_bridge__$ResultVoidAndSomeErrEnum$ResultErr} __swift_bridge__$ResultVoidAndSomeErrEnum$Tag;
608
674
union __swift_bridge__$ResultVoidAndSomeErrEnum$Fields {struct __swift_bridge__$SomeErrEnum err;};
609
- typedef struct __swift_bridge__$ResultVoidAndSomeErrEnum{__swift_bridge__$ResultVoidAndSomeErrEnum$Tag tag; union __swift_bridge__$ResultVoidAndSomeErrEnum$Fields payload;} __swift_bridge__$ResultVoidAndSomeErrEnum;
675
+ typedef struct __swift_bridge__$ResultVoidAndSomeErrEnum{__swift_bridge__$ResultVoidAndSomeErrEnum$Tag tag; union __swift_bridge__$ResultVoidAndSomeErrEnum$Fields payload;} __swift_bridge__$ResultVoidAndSomeErrEnum;
610
676
"# ,
611
677
r#"struct __swift_bridge__$ResultVoidAndSomeErrEnum __swift_bridge__$some_function(void)"# ,
612
678
] )
@@ -689,7 +755,7 @@ public func some_function() throws -> (Int32, UInt32) {
689
755
r#"
690
756
typedef enum __swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Tag {__swift_bridge__$ResultTupleI32U32AndSomeErrEnum$ResultOk, __swift_bridge__$ResultTupleI32U32AndSomeErrEnum$ResultErr} __swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Tag;
691
757
union __swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Fields {struct __swift_bridge__$tuple$I32U32 ok; struct __swift_bridge__$SomeErrEnum err;};
692
- typedef struct __swift_bridge__$ResultTupleI32U32AndSomeErrEnum{__swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Tag tag; union __swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Fields payload;} __swift_bridge__$ResultTupleI32U32AndSomeErrEnum;
758
+ typedef struct __swift_bridge__$ResultTupleI32U32AndSomeErrEnum{__swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Tag tag; union __swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Fields payload;} __swift_bridge__$ResultTupleI32U32AndSomeErrEnum;
693
759
"# ,
694
760
r#"struct __swift_bridge__$ResultTupleI32U32AndSomeErrEnum __swift_bridge__$some_function(void)"# ,
695
761
r#"typedef struct __swift_bridge__$tuple$I32U32 { int32_t _0; uint32_t _1; } __swift_bridge__$tuple$I32U32;"# ,
0 commit comments