blob: de76d808fe2b1b16a435f82cd44822af99f11a12 [file] [log] [blame]
Adrian Taylor9fc08462020-08-14 10:51:00 -07001//! The CXX code generator for constructing and compiling C++ code.
2//!
3//! This is intended to be embedded into higher-level code generators.
4
5mod gen;
6mod syntax;
7
8use crate::gen::Opt;
9use proc_macro2::TokenStream;
10
Adrian Taylor593eddb2020-08-21 23:46:08 -070011pub use crate::gen::{Error, GeneratedCode, Result};
Adrian Taylor9fc08462020-08-14 10:51:00 -070012
13/// Generate C++ bindings code from a Rust token stream. This should be a Rust
14/// token stream which somewhere contains a `#[cxx::bridge] mod {}`.
15pub fn generate_header_and_cc(rust_source: TokenStream) -> Result<GeneratedCode> {
16 gen::do_generate_from_tokens(rust_source, Opt::default())
17}
Adrian Taylor593eddb2020-08-21 23:46:08 -070018
19#[cfg(test)]
20mod test {
21 use quote::quote;
22
23 #[test]
24 fn test_positive() {
25 let rs = quote! {
26 #[cxx::bridge]
27 mod ffi {
28 extern "C" {
29 fn in_C();
30 }
31 extern "Rust" {
32 fn in_rs();
33 }
34 }
35 };
36 let code = crate::generate_header_and_cc(rs).unwrap();
37 assert!(code.cxx.len() > 0);
38 assert!(code.header.len() > 0);
39 }
40
41 #[test]
42 fn test_negative() {
43 let rs = quote! {};
44 assert!(crate::generate_header_and_cc(rs).is_err())
45 }
46}