Skip to content

Commit db73038

Browse files
committed
Revert "Support Rust returning -> Result<_, String> (#296)"
This reverts commit c45a38c.
1 parent 225380e commit db73038

File tree

4 files changed

+18
-112
lines changed

4 files changed

+18
-112
lines changed

SwiftRustIntegrationTestRunner/SwiftRustIntegrationTestRunnerTests/ResultTests.swift

+12-28
Original file line numberDiff line numberDiff line change
@@ -13,30 +13,14 @@ class ResultTests: XCTestCase {
1313
rust_func_takes_result_string(.Ok("Success Message"))
1414
rust_func_takes_result_string(.Err("Error Message"))
1515
}
16-
17-
/// Verify that we can return a Result<String, String> from Rust -> Swift.
18-
///
19-
/// The Err case evidences Swift’s `Error` protocol is implemented correctly
20-
/// for `RustStringRef`, i.e. `extension RustStringRef: Error {}`
21-
func testSwiftCallRustReturnsResultString() throws {
22-
let resultOk = try! rust_func_returns_result_string(true)
23-
XCTAssertEqual(resultOk.toString(), "Success Message")
24-
25-
do {
26-
let _ = try rust_func_returns_result_string(false)
27-
XCTFail("The function should have returned an error.")
28-
} catch let error as RustString {
29-
XCTAssertEqual(error.toString(), "Error Message")
30-
}
31-
}
32-
16+
3317
/// Verify that we can pass a Result<OpaqueRust, OpaqueRust> from Swift -> Rust
3418
func testSwiftCallRustResultOpaqueRust() throws {
3519
let reflectedOk = try! rust_func_reflect_result_opaque_rust(
3620
.Ok(ResultTestOpaqueRustType(111))
3721
)
3822
XCTAssertEqual(reflectedOk.val(), 111)
39-
23+
4024
do {
4125
let _ = try rust_func_reflect_result_opaque_rust(
4226
.Err(ResultTestOpaqueRustType(222))
@@ -46,7 +30,7 @@ class ResultTests: XCTestCase {
4630
XCTAssertEqual(error.val(), 222)
4731
}
4832
}
49-
33+
5034
/// Verify that we can pass a Result<OpaqueSwift, OpaqueSwift> from Swift -> Rust
5135
func testSwiftCallRustResultOpaqueSwift() throws {
5236
rust_func_takes_result_opaque_swift(
@@ -80,7 +64,7 @@ class ResultTests: XCTestCase {
8064
XCTAssertEqual(error.val(), 222)
8165
}
8266
}
83-
67+
8468
/// Verify that we can receive a Result<OpaqueRust, TransparentEnum> from Rust
8569
func testResultOpaqueRustTransparentEnum() throws {
8670
XCTContext.runActivity(named: "Should return a ResultTestOpaqueRustType") {
@@ -91,7 +75,7 @@ class ResultTests: XCTestCase {
9175
XCTFail()
9276
}
9377
}
94-
78+
9579
XCTContext.runActivity(named: "Should throw an error") {
9680
_ in
9781
do {
@@ -111,7 +95,7 @@ class ResultTests: XCTestCase {
11195
}
11296
}
11397
}
114-
98+
11599
/// Verify that we can receive a Result<TransparentEnum, OpaqueRust> from Rust
116100
func testResultTransparentEnumOpaqueRust() throws {
117101
XCTContext.runActivity(named: "Should return a ResultTestOpaqueRustType") {
@@ -130,7 +114,7 @@ class ResultTests: XCTestCase {
130114
XCTFail()
131115
}
132116
}
133-
117+
134118
XCTContext.runActivity(named: "Should throw an error") {
135119
_ in
136120
do {
@@ -143,7 +127,7 @@ class ResultTests: XCTestCase {
143127
}
144128
}
145129
}
146-
130+
147131
/// Verify that we can receive a Result<(), TransparentEnum> from Rust
148132
func testResultUnitTypeTransparentEnum() throws {
149133
XCTContext.runActivity(named: "Should return a Unit type") {
@@ -154,7 +138,7 @@ class ResultTests: XCTestCase {
154138
XCTFail()
155139
}
156140
}
157-
141+
158142
XCTContext.runActivity(named: "Should throw an error") {
159143
_ in
160144
do {
@@ -174,7 +158,7 @@ class ResultTests: XCTestCase {
174158
}
175159
}
176160
}
177-
161+
178162
/// Verify that we can receive a Result<(primitive type, OpaqueRustType, String), TransparentEnum> from Rust
179163
func testResultTupleTransparentEnum() throws {
180164
XCTContext.runActivity(named: "Should return a tuple type") {
@@ -188,7 +172,7 @@ class ResultTests: XCTestCase {
188172
XCTFail()
189173
}
190174
}
191-
175+
192176
XCTContext.runActivity(named: "Should throw an error") {
193177
_ in
194178
do {
@@ -265,7 +249,7 @@ class ResultTests: XCTestCase {
265249
XCTAssertEqual(UInt32(i), value.val())
266250
}
267251
}
268-
252+
269253
/// Verify that we can use throwing initializers defined on the Rust side.
270254
func testThrowingInitializers() throws {
271255
XCTContext.runActivity(named: "Should fail") {

crates/swift-bridge-build/src/generate_core/rust_string.swift

+1-4
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,6 @@ extension RustStringRef {
4747
__swift_bridge__$RustString$trim(ptr)
4848
}
4949
}
50-
/// exercised in SwiftRustIntegrationTestRunner/SwiftRustIntegrationTestRunnerTests/ResultTests.swift:
51-
/// - see `func testSwiftCallRustReturnsResultString`
52-
extension RustStringRef: Error {}
5350
extension RustString: Vectorizable {
5451
public static func vecOfSelfNew() -> UnsafeMutableRawPointer {
5552
__swift_bridge__$Vec_RustString$new()
@@ -97,4 +94,4 @@ extension RustString: Vectorizable {
9794
public static func vecOfSelfLen(vecPtr: UnsafeMutableRawPointer) -> UInt {
9895
__swift_bridge__$Vec_RustString$len(vecPtr)
9996
}
100-
}
97+
}

crates/swift-bridge-ir/src/codegen/codegen_tests/result_codegen_tests.rs

+5-71
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use super::{CodegenTest, ExpectedCHeader, ExpectedRustTokens, ExpectedSwiftCode}
44
use proc_macro2::TokenStream;
55
use quote::quote;
66

7-
/// Test code generation for Rust function that accepts a Result<T, E>
7+
/// Test code generation for Rust function that accepts and returns a Result<T, E>
88
/// where T and E are Strings.
99
mod extern_rust_fn_result_string {
1010
use super::*;
@@ -64,72 +64,6 @@ void __swift_bridge__$some_function(struct __private__ResultPtrAndPtr arg);
6464
}
6565
}
6666

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-
13367
/// Test code generation for Rust function that accepts a Result<T, E> where T and E are
13468
/// opaque Rust types.
13569
mod extern_rust_fn_arg_result_opaque_rust {
@@ -515,7 +449,7 @@ public func some_function() throws -> SomeOkType {
515449
r#"
516450
typedef enum __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Tag {__swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$ResultOk, __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$ResultErr} __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Tag;
517451
union __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Fields {void* ok; struct __swift_bridge__$SomeErrEnum err;};
518-
typedef struct __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum{__swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Tag tag; union __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Fields payload;} __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum;
452+
typedef struct __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum{__swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Tag tag; union __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum$Fields payload;} __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum;
519453
"#,
520454
r#"struct __swift_bridge__$ResultSomeOkTypeAndSomeErrEnum __swift_bridge__$some_function(void)"#,
521455
])
@@ -597,7 +531,7 @@ public func some_function() throws -> SomeOkEnum {
597531
r#"
598532
typedef enum __swift_bridge__$ResultSomeOkEnumAndSomeErrType$Tag {__swift_bridge__$ResultSomeOkEnumAndSomeErrType$ResultOk, __swift_bridge__$ResultSomeOkEnumAndSomeErrType$ResultErr} __swift_bridge__$ResultSomeOkEnumAndSomeErrType$Tag;
599533
union __swift_bridge__$ResultSomeOkEnumAndSomeErrType$Fields {struct __swift_bridge__$SomeOkEnum ok; void* err;};
600-
typedef struct __swift_bridge__$ResultSomeOkEnumAndSomeErrType{__swift_bridge__$ResultSomeOkEnumAndSomeErrType$Tag tag; union __swift_bridge__$ResultSomeOkEnumAndSomeErrType$Fields payload;} __swift_bridge__$ResultSomeOkEnumAndSomeErrType;
534+
typedef struct __swift_bridge__$ResultSomeOkEnumAndSomeErrType{__swift_bridge__$ResultSomeOkEnumAndSomeErrType$Tag tag; union __swift_bridge__$ResultSomeOkEnumAndSomeErrType$Fields payload;} __swift_bridge__$ResultSomeOkEnumAndSomeErrType;
601535
"#,
602536
r#"struct __swift_bridge__$ResultSomeOkEnumAndSomeErrType __swift_bridge__$some_function(void)"#,
603537
])
@@ -672,7 +606,7 @@ public func some_function() throws -> () {
672606
r#"
673607
typedef enum __swift_bridge__$ResultVoidAndSomeErrEnum$Tag {__swift_bridge__$ResultVoidAndSomeErrEnum$ResultOk, __swift_bridge__$ResultVoidAndSomeErrEnum$ResultErr} __swift_bridge__$ResultVoidAndSomeErrEnum$Tag;
674608
union __swift_bridge__$ResultVoidAndSomeErrEnum$Fields {struct __swift_bridge__$SomeErrEnum err;};
675-
typedef struct __swift_bridge__$ResultVoidAndSomeErrEnum{__swift_bridge__$ResultVoidAndSomeErrEnum$Tag tag; union __swift_bridge__$ResultVoidAndSomeErrEnum$Fields payload;} __swift_bridge__$ResultVoidAndSomeErrEnum;
609+
typedef struct __swift_bridge__$ResultVoidAndSomeErrEnum{__swift_bridge__$ResultVoidAndSomeErrEnum$Tag tag; union __swift_bridge__$ResultVoidAndSomeErrEnum$Fields payload;} __swift_bridge__$ResultVoidAndSomeErrEnum;
676610
"#,
677611
r#"struct __swift_bridge__$ResultVoidAndSomeErrEnum __swift_bridge__$some_function(void)"#,
678612
])
@@ -755,7 +689,7 @@ public func some_function() throws -> (Int32, UInt32) {
755689
r#"
756690
typedef enum __swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Tag {__swift_bridge__$ResultTupleI32U32AndSomeErrEnum$ResultOk, __swift_bridge__$ResultTupleI32U32AndSomeErrEnum$ResultErr} __swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Tag;
757691
union __swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Fields {struct __swift_bridge__$tuple$I32U32 ok; struct __swift_bridge__$SomeErrEnum err;};
758-
typedef struct __swift_bridge__$ResultTupleI32U32AndSomeErrEnum{__swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Tag tag; union __swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Fields payload;} __swift_bridge__$ResultTupleI32U32AndSomeErrEnum;
692+
typedef struct __swift_bridge__$ResultTupleI32U32AndSomeErrEnum{__swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Tag tag; union __swift_bridge__$ResultTupleI32U32AndSomeErrEnum$Fields payload;} __swift_bridge__$ResultTupleI32U32AndSomeErrEnum;
759693
"#,
760694
r#"struct __swift_bridge__$ResultTupleI32U32AndSomeErrEnum __swift_bridge__$some_function(void)"#,
761695
r#"typedef struct __swift_bridge__$tuple$I32U32 { int32_t _0; uint32_t _1; } __swift_bridge__$tuple$I32U32;"#,

crates/swift-integration-tests/src/result.rs

-9
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ mod ffi {
1010
) -> Result<ResultTestOpaqueRustType, ResultTestOpaqueRustType>;
1111

1212
fn rust_func_takes_result_string(arg: Result<String, String>);
13-
fn rust_func_returns_result_string(ok: bool) -> Result<String, String>;
14-
1513
fn rust_func_takes_result_opaque_swift(
1614
arg: Result<ResultTestOpaqueSwiftType, ResultTestOpaqueSwiftType>,
1715
);
@@ -111,13 +109,6 @@ fn rust_func_takes_result_string(arg: Result<String, String>) {
111109
}
112110
}
113111

114-
fn rust_func_returns_result_string(ok: bool) -> Result<String, String> {
115-
if !ok {
116-
return Err("Error Message".to_string());
117-
}
118-
Ok("Success Message".to_string())
119-
}
120-
121112
fn rust_func_reflect_result_opaque_rust(
122113
arg: Result<ResultTestOpaqueRustType, ResultTestOpaqueRustType>,
123114
) -> Result<ResultTestOpaqueRustType, ResultTestOpaqueRustType> {

0 commit comments

Comments
 (0)