blob: adcd4fc263be9de4cf01689b717b52172efccbf5 [file] [log] [blame]
David Tolnaya95b2342020-04-09 23:26:05 -07001#![allow(
2 clippy::boxed_local,
3 clippy::ptr_arg,
4 clippy::trivially_copy_pass_by_ref
5)]
David Tolnay265f6a02020-03-18 20:13:55 -07006
David Tolnayad5b8af2020-01-26 16:59:13 -08007use cxx::{CxxString, UniquePtr};
David Tolnayb6c5ea72020-03-16 13:36:28 -07008use std::fmt::{self, Display};
David Tolnayad5b8af2020-01-26 16:59:13 -08009
David Tolnay97c72102020-01-25 16:49:00 -080010#[cxx::bridge(namespace = tests)]
11pub mod ffi {
David Tolnayad5b8af2020-01-26 16:59:13 -080012 struct Shared {
13 z: usize,
14 }
15
David Tolnay97c72102020-01-25 16:49:00 -080016 extern "C" {
17 include!("tests/ffi/tests.h");
David Tolnayad5b8af2020-01-26 16:59:13 -080018
19 type C;
20
21 fn c_return_primitive() -> usize;
22 fn c_return_shared() -> Shared;
David Tolnaybe13d8a2020-03-06 15:45:39 -080023 fn c_return_box() -> Box<R>;
David Tolnayad5b8af2020-01-26 16:59:13 -080024 fn c_return_unique_ptr() -> UniquePtr<C>;
25 fn c_return_ref(shared: &Shared) -> &usize;
26 fn c_return_str(shared: &Shared) -> &str;
Adrian Taylorf5dd5522020-04-13 16:50:14 -070027 fn c_return_sliceu8(shared: &Shared) -> &[u8];
David Tolnayad5b8af2020-01-26 16:59:13 -080028 fn c_return_rust_string() -> String;
29 fn c_return_unique_ptr_string() -> UniquePtr<CxxString>;
30
31 fn c_take_primitive(n: usize);
32 fn c_take_shared(shared: Shared);
33 fn c_take_box(r: Box<R>);
34 fn c_take_unique_ptr(c: UniquePtr<C>);
David Tolnaya7d00e82020-03-06 15:50:14 -080035 fn c_take_ref_r(r: &R);
David Tolnayad5b8af2020-01-26 16:59:13 -080036 fn c_take_ref_c(c: &C);
37 fn c_take_str(s: &str);
Adrian Taylorf5dd5522020-04-13 16:50:14 -070038 fn c_take_sliceu8(s: &[u8]);
David Tolnayad5b8af2020-01-26 16:59:13 -080039 fn c_take_rust_string(s: String);
40 fn c_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnay75dca2e2020-03-25 20:17:52 -070041 fn c_take_callback(callback: fn(String) -> usize);
David Tolnayebef4a22020-03-17 15:33:47 -070042
43 fn c_try_return_void() -> Result<()>;
44 fn c_try_return_primitive() -> Result<usize>;
45 fn c_fail_return_primitive() -> Result<usize>;
David Tolnay99642622020-03-25 13:07:35 -070046 fn c_try_return_box() -> Result<Box<R>>;
47 fn c_try_return_ref(s: &String) -> Result<&String>;
48 fn c_try_return_str(s: &str) -> Result<&str>;
Adrian Taylorf5dd5522020-04-13 16:50:14 -070049 fn c_try_return_sliceu8(s: &[u8]) -> Result<&[u8]>;
David Tolnay99642622020-03-25 13:07:35 -070050 fn c_try_return_rust_string() -> Result<String>;
51 fn c_try_return_unique_ptr_string() -> Result<UniquePtr<CxxString>>;
David Tolnay97c72102020-01-25 16:49:00 -080052 }
David Tolnayad5b8af2020-01-26 16:59:13 -080053
54 extern "Rust" {
55 type R;
56
57 fn r_return_primitive() -> usize;
58 fn r_return_shared() -> Shared;
David Tolnay5cd8d612020-03-06 15:56:30 -080059 fn r_return_box() -> Box<R>;
David Tolnay4b3a66e2020-03-06 16:14:00 -080060 fn r_return_unique_ptr() -> UniquePtr<C>;
David Tolnayad5b8af2020-01-26 16:59:13 -080061 fn r_return_ref(shared: &Shared) -> &usize;
62 fn r_return_str(shared: &Shared) -> &str;
63 fn r_return_rust_string() -> String;
David Tolnay85db24862020-03-06 16:24:41 -080064 fn r_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnayad5b8af2020-01-26 16:59:13 -080065
66 fn r_take_primitive(n: usize);
67 fn r_take_shared(shared: Shared);
68 fn r_take_box(r: Box<R>);
69 fn r_take_unique_ptr(c: UniquePtr<C>);
70 fn r_take_ref_r(r: &R);
71 fn r_take_ref_c(c: &C);
72 fn r_take_str(s: &str);
Adrian Taylorf5dd5522020-04-13 16:50:14 -070073 fn r_take_sliceu8(s: &[u8]);
David Tolnayad5b8af2020-01-26 16:59:13 -080074 fn r_take_rust_string(s: String);
75 fn r_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnayb6c5ea72020-03-16 13:36:28 -070076
David Tolnaycecada62020-03-17 01:45:58 -070077 fn r_try_return_void() -> Result<()>;
David Tolnayb6c5ea72020-03-16 13:36:28 -070078 fn r_try_return_primitive() -> Result<usize>;
79 fn r_fail_return_primitive() -> Result<usize>;
David Tolnayad5b8af2020-01-26 16:59:13 -080080 }
81}
82
David Tolnaybe13d8a2020-03-06 15:45:39 -080083pub type R = usize;
David Tolnayad5b8af2020-01-26 16:59:13 -080084
David Tolnayb6c5ea72020-03-16 13:36:28 -070085#[derive(Debug)]
86struct Error;
87
88impl std::error::Error for Error {}
89
90impl Display for Error {
91 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
92 f.write_str("rust error")
93 }
94}
95
David Tolnayad5b8af2020-01-26 16:59:13 -080096fn r_return_primitive() -> usize {
97 2020
98}
99
100fn r_return_shared() -> ffi::Shared {
101 ffi::Shared { z: 2020 }
102}
103
David Tolnay5cd8d612020-03-06 15:56:30 -0800104fn r_return_box() -> Box<R> {
105 Box::new(2020)
106}
107
David Tolnay4b3a66e2020-03-06 16:14:00 -0800108fn r_return_unique_ptr() -> UniquePtr<ffi::C> {
109 extern "C" {
110 fn cxx_test_suite_get_unique_ptr() -> *mut ffi::C;
111 }
112 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr()) }
113}
114
David Tolnayad5b8af2020-01-26 16:59:13 -0800115fn r_return_ref(shared: &ffi::Shared) -> &usize {
116 &shared.z
117}
118
119fn r_return_str(shared: &ffi::Shared) -> &str {
120 let _ = shared;
121 "2020"
122}
123
124fn r_return_rust_string() -> String {
125 "2020".to_owned()
126}
127
David Tolnay85db24862020-03-06 16:24:41 -0800128fn r_return_unique_ptr_string() -> UniquePtr<CxxString> {
129 extern "C" {
130 fn cxx_test_suite_get_unique_ptr_string() -> *mut CxxString;
131 }
132 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr_string()) }
133}
134
David Tolnayad5b8af2020-01-26 16:59:13 -0800135fn r_take_primitive(n: usize) {
David Tolnayf306da42020-02-22 19:55:43 -0800136 assert_eq!(n, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800137}
138
139fn r_take_shared(shared: ffi::Shared) {
David Tolnayf306da42020-02-22 19:55:43 -0800140 assert_eq!(shared.z, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800141}
142
143fn r_take_box(r: Box<R>) {
144 let _ = r;
145}
146
147fn r_take_unique_ptr(c: UniquePtr<ffi::C>) {
148 let _ = c;
149}
150
151fn r_take_ref_r(r: &R) {
152 let _ = r;
153}
154
155fn r_take_ref_c(c: &ffi::C) {
156 let _ = c;
157}
158
159fn r_take_str(s: &str) {
David Tolnayf306da42020-02-22 19:55:43 -0800160 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800161}
162
163fn r_take_rust_string(s: String) {
David Tolnayf306da42020-02-22 19:55:43 -0800164 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800165}
166
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700167fn r_take_sliceu8(s: &[u8]) {
168 assert_eq!(s.len(), 5);
169 assert_eq!(std::str::from_utf8(s).unwrap(), "2020\u{0}");
170}
171
David Tolnayad5b8af2020-01-26 16:59:13 -0800172fn r_take_unique_ptr_string(s: UniquePtr<CxxString>) {
David Tolnayf306da42020-02-22 19:55:43 -0800173 assert_eq!(s.as_ref().unwrap().to_str().unwrap(), "2020");
David Tolnay97c72102020-01-25 16:49:00 -0800174}
David Tolnayb6c5ea72020-03-16 13:36:28 -0700175
David Tolnaycecada62020-03-17 01:45:58 -0700176fn r_try_return_void() -> Result<(), Error> {
177 Ok(())
178}
179
David Tolnayb6c5ea72020-03-16 13:36:28 -0700180fn r_try_return_primitive() -> Result<usize, Error> {
181 Ok(2020)
182}
183
184fn r_fail_return_primitive() -> Result<usize, Error> {
185 Err(Error)
186}