| David Tolnay | 30d214c | 2020-03-15 23:54:34 -0700 | [diff] [blame] | 1 | #![allow( |
| David Tolnay | 4bc9815 | 2020-04-09 23:24:01 -0700 | [diff] [blame] | 2 | clippy::cognitive_complexity, |
| David Tolnay | 30d214c | 2020-03-15 23:54:34 -0700 | [diff] [blame] | 3 | clippy::inherent_to_string, |
| 4 | clippy::large_enum_variant, |
| 5 | clippy::new_without_default, |
| David Tolnay | ef665fd | 2020-11-15 17:25:31 -0800 | [diff] [blame] | 6 | clippy::nonminimal_bool, |
| David Tolnay | 97b69c6 | 2020-09-01 16:36:42 -0700 | [diff] [blame] | 7 | clippy::or_fun_call, |
| David Tolnay | edff9c0 | 2020-11-27 20:53:56 -0800 | [diff] [blame^] | 8 | clippy::too_many_arguments, |
| David Tolnay | 30d214c | 2020-03-15 23:54:34 -0700 | [diff] [blame] | 9 | clippy::toplevel_ref_arg |
| 10 | )] |
| 11 | |
| David Tolnay | 39fa366 | 2020-07-30 20:23:18 -0700 | [diff] [blame] | 12 | mod app; |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 13 | mod gen; |
| David Tolnay | e2e47a3 | 2020-09-24 10:23:27 -0400 | [diff] [blame] | 14 | mod output; |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 15 | mod syntax; |
| 16 | |
| David Tolnay | e2e47a3 | 2020-09-24 10:23:27 -0400 | [diff] [blame] | 17 | use crate::gen::error::{report, Result}; |
| David Tolnay | 700cd0c | 2020-10-28 12:40:27 -0700 | [diff] [blame] | 18 | use crate::gen::fs; |
| 19 | use crate::gen::include::{self, Include}; |
| David Tolnay | e2e47a3 | 2020-09-24 10:23:27 -0400 | [diff] [blame] | 20 | use crate::output::Output; |
| David Tolnay | 7eb9c6b | 2020-01-27 21:52:09 -0800 | [diff] [blame] | 21 | use std::io::{self, Write}; |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 22 | use std::path::PathBuf; |
| David Tolnay | 9ef74ce | 2020-09-13 23:24:02 -0400 | [diff] [blame] | 23 | use std::process; |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 24 | |
| David Tolnay | 39fa366 | 2020-07-30 20:23:18 -0700 | [diff] [blame] | 25 | #[derive(Debug)] |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 26 | struct Opt { |
| RS | 0a2d117 | 2020-01-27 21:47:37 -0800 | [diff] [blame] | 27 | input: Option<PathBuf>, |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 28 | header: bool, |
| Adrian Taylor | 21f0ff0 | 2020-07-21 16:21:48 -0700 | [diff] [blame] | 29 | cxx_impl_annotations: Option<String>, |
| David Tolnay | 700cd0c | 2020-10-28 12:40:27 -0700 | [diff] [blame] | 30 | include: Vec<Include>, |
| David Tolnay | f027756 | 2020-09-24 10:46:14 -0400 | [diff] [blame] | 31 | outputs: Vec<Output>, |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 32 | } |
| 33 | |
| David Tolnay | 7eb9c6b | 2020-01-27 21:52:09 -0800 | [diff] [blame] | 34 | fn main() { |
| David Tolnay | 9ef74ce | 2020-09-13 23:24:02 -0400 | [diff] [blame] | 35 | if let Err(err) = try_main() { |
| 36 | let _ = writeln!(io::stderr(), "cxxbridge: {}", report(err)); |
| 37 | process::exit(1); |
| 38 | } |
| 39 | } |
| 40 | |
| David Tolnay | f027756 | 2020-09-24 10:46:14 -0400 | [diff] [blame] | 41 | enum Kind { |
| 42 | GeneratedHeader, |
| 43 | GeneratedImplementation, |
| 44 | Header, |
| 45 | } |
| 46 | |
| David Tolnay | 9ef74ce | 2020-09-13 23:24:02 -0400 | [diff] [blame] | 47 | fn try_main() -> Result<()> { |
| David Tolnay | 39fa366 | 2020-07-30 20:23:18 -0700 | [diff] [blame] | 48 | let opt = app::from_args(); |
| RS | 0a2d117 | 2020-01-27 21:47:37 -0800 | [diff] [blame] | 49 | |
| David Tolnay | f027756 | 2020-09-24 10:46:14 -0400 | [diff] [blame] | 50 | let mut outputs = Vec::new(); |
| 51 | let mut gen_header = false; |
| 52 | let mut gen_implementation = false; |
| 53 | for output in opt.outputs { |
| 54 | let kind = if opt.input.is_none() { |
| 55 | Kind::Header |
| 56 | } else if opt.header || output.ends_with(".h") { |
| 57 | gen_header = true; |
| 58 | Kind::GeneratedHeader |
| 59 | } else { |
| 60 | gen_implementation = true; |
| 61 | Kind::GeneratedImplementation |
| 62 | }; |
| 63 | outputs.push((output, kind)); |
| 64 | } |
| David Tolnay | e2e47a3 | 2020-09-24 10:23:27 -0400 | [diff] [blame] | 65 | |
| David Tolnay | 33d3029 | 2020-03-18 18:02:02 -0700 | [diff] [blame] | 66 | let gen = gen::Opt { |
| 67 | include: opt.include, |
| Adrian Taylor | 21f0ff0 | 2020-07-21 16:21:48 -0700 | [diff] [blame] | 68 | cxx_impl_annotations: opt.cxx_impl_annotations, |
| David Tolnay | e2e47a3 | 2020-09-24 10:23:27 -0400 | [diff] [blame] | 69 | gen_header, |
| David Tolnay | f027756 | 2020-09-24 10:46:14 -0400 | [diff] [blame] | 70 | gen_implementation, |
| David Tolnay | 75c2385 | 2020-10-27 21:07:53 -0700 | [diff] [blame] | 71 | ..Default::default() |
| David Tolnay | 33d3029 | 2020-03-18 18:02:02 -0700 | [diff] [blame] | 72 | }; |
| 73 | |
| David Tolnay | f027756 | 2020-09-24 10:46:14 -0400 | [diff] [blame] | 74 | let generated_code = if let Some(input) = opt.input { |
| 75 | gen::generate_from_path(&input, &gen) |
| 76 | } else { |
| 77 | Default::default() |
| David Tolnay | 9ef74ce | 2020-09-13 23:24:02 -0400 | [diff] [blame] | 78 | }; |
| 79 | |
| David Tolnay | f027756 | 2020-09-24 10:46:14 -0400 | [diff] [blame] | 80 | for (output, kind) in outputs { |
| 81 | let content = match kind { |
| 82 | Kind::GeneratedHeader => &generated_code.header, |
| 83 | Kind::GeneratedImplementation => &generated_code.implementation, |
| 84 | Kind::Header => include::HEADER.as_bytes(), |
| 85 | }; |
| 86 | match output { |
| 87 | Output::Stdout => drop(io::stdout().write_all(content)), |
| 88 | Output::File(path) => fs::write(path, content)?, |
| 89 | } |
| RS | 0a2d117 | 2020-01-27 21:47:37 -0800 | [diff] [blame] | 90 | } |
| David Tolnay | 9ef74ce | 2020-09-13 23:24:02 -0400 | [diff] [blame] | 91 | |
| 92 | Ok(()) |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 93 | } |