blob: 8bf992697198387517c99f6d34a280743e817a02 [file] [log] [blame]
David Tolnayaa17a5a2020-03-01 13:44:24 -08001#[cxx::bridge(namespace = org::example)]
David Tolnay7db73692019-10-20 14:51:12 -04002mod ffi {
3 struct SharedThing {
4 z: i32,
5 y: Box<ThingR>,
6 x: UniquePtr<ThingC>,
7 }
8
Myron Ahneba35cf2020-02-05 19:41:51 +07009 struct JsonBlob {
10 json: UniquePtr<CxxString>,
11 blob: UniquePtr<Vector<u8>>,
12 }
13
David Tolnay7db73692019-10-20 14:51:12 -040014 extern "C" {
15 include!("demo-cxx/demo.h");
16
17 type ThingC;
18 fn make_demo(appname: &str) -> UniquePtr<ThingC>;
David Tolnayb6a5f672020-04-17 15:04:56 -070019 fn get_name(thing: &ThingC) -> &CxxString;
Myron Ahneba35cf2020-02-05 19:41:51 +070020 fn do_thing(state: SharedThing) -> UniquePtr<Vector<u8>>;
21 fn get_jb(v: &Vec<u8>) -> JsonBlob;
David Tolnay7db73692019-10-20 14:51:12 -040022 }
23
24 extern "Rust" {
25 type ThingR;
26 fn print_r(r: &ThingR);
27 }
28}
29
30pub struct ThingR(usize);
31
32fn print_r(r: &ThingR) {
33 println!("called back with r={}", r.0);
34}
35
36fn main() {
37 let x = ffi::make_demo("demo of cxx::bridge");
David Tolnayb6a5f672020-04-17 15:04:56 -070038 println!("this is a {}", ffi::get_name(x.as_ref().unwrap()));
David Tolnay7db73692019-10-20 14:51:12 -040039
Myron Ahneba35cf2020-02-05 19:41:51 +070040 let vec = ffi::do_thing(ffi::SharedThing {
David Tolnay7db73692019-10-20 14:51:12 -040041 z: 222,
42 y: Box::new(ThingR(333)),
43 x,
44 });
Myron Ahneba35cf2020-02-05 19:41:51 +070045
46 println!("vec length = {}", vec.as_ref().unwrap().size());
47 for (i, v) in vec.as_ref().unwrap().into_iter().enumerate() {
48 println!("vec[{}] = {}", i, v);
49 }
50
51 let mut rv: Vec<u8> = Vec::new();
52 for _ in 0..1000 {
53 rv.push(33);
54 }
55 let jb = ffi::get_jb(&rv);
56 println!("json: {}", jb.json.as_ref().unwrap());
57 for (i, v) in jb.blob.as_ref().unwrap().into_iter().enumerate() {
58 println!("jb.blob[{}] = {}", i, v);
59 }
David Tolnay7db73692019-10-20 14:51:12 -040060}