| David Tolnay | 30d214c | 2020-03-15 23:54:34 -0700 | [diff] [blame] | 1 | #![allow( |
| 2 | clippy::inherent_to_string, |
| 3 | clippy::large_enum_variant, |
| 4 | clippy::new_without_default, |
| 5 | clippy::toplevel_ref_arg |
| 6 | )] |
| 7 | |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 8 | mod gen; |
| 9 | mod syntax; |
| 10 | |
| David Tolnay | 7eb9c6b | 2020-01-27 21:52:09 -0800 | [diff] [blame] | 11 | use gen::include; |
| 12 | use std::io::{self, Write}; |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 13 | use std::path::PathBuf; |
| 14 | use structopt::StructOpt; |
| 15 | |
| 16 | #[derive(StructOpt, Debug)] |
| David Tolnay | fa66e2a | 2020-01-27 23:05:22 -0800 | [diff] [blame] | 17 | #[structopt( |
| 18 | name = "cxxbridge", |
| 19 | author, |
| 20 | about = "https://github.com/dtolnay/cxx", |
| 21 | usage = "\ |
| 22 | cxxbridge <input>.rs Emit .cc file for bridge to stdout |
| 23 | cxxbridge <input>.rs --header Emit .h file for bridge to stdout |
| David Tolnay | 736cbca | 2020-03-11 16:49:18 -0700 | [diff] [blame] | 24 | cxxbridge --header Emit rust/cxx.h header to stdout", |
| David Tolnay | fa66e2a | 2020-01-27 23:05:22 -0800 | [diff] [blame] | 25 | help_message = "Print help information", |
| 26 | version_message = "Print version information" |
| 27 | )] |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 28 | struct Opt { |
| 29 | /// Input Rust source file containing #[cxx::bridge] |
| David Tolnay | 4aea275 | 2020-01-27 22:55:55 -0800 | [diff] [blame] | 30 | #[structopt(parse(from_os_str), required_unless = "header")] |
| RS | 0a2d117 | 2020-01-27 21:47:37 -0800 | [diff] [blame] | 31 | input: Option<PathBuf>, |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 32 | |
| David Tolnay | 7eb9c6b | 2020-01-27 21:52:09 -0800 | [diff] [blame] | 33 | /// Emit header with declarations only |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 34 | #[structopt(long)] |
| 35 | header: bool, |
| 36 | } |
| 37 | |
| David Tolnay | 4aea275 | 2020-01-27 22:55:55 -0800 | [diff] [blame] | 38 | fn write(content: impl AsRef<[u8]>) { |
| 39 | let _ = io::stdout().lock().write_all(content.as_ref()); |
| 40 | } |
| 41 | |
| David Tolnay | 7eb9c6b | 2020-01-27 21:52:09 -0800 | [diff] [blame] | 42 | fn main() { |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 43 | let opt = Opt::from_args(); |
| RS | 0a2d117 | 2020-01-27 21:47:37 -0800 | [diff] [blame] | 44 | |
| David Tolnay | 4aea275 | 2020-01-27 22:55:55 -0800 | [diff] [blame] | 45 | match (opt.input, opt.header) { |
| 46 | (Some(input), true) => write(gen::do_generate_header(&input)), |
| 47 | (Some(input), false) => write(gen::do_generate_bridge(&input)), |
| 48 | (None, true) => write(include::HEADER), |
| 49 | (None, false) => unreachable!(), // enforced by required_unless |
| RS | 0a2d117 | 2020-01-27 21:47:37 -0800 | [diff] [blame] | 50 | } |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 51 | } |