blob: 2372c2c133267ac3a24aaafaa91d1baa94d04eb3 [file] [log] [blame]
David Tolnay30d214c2020-03-15 23:54:34 -07001#![allow(
David Tolnay4bc98152020-04-09 23:24:01 -07002 clippy::cognitive_complexity,
David Tolnay30d214c2020-03-15 23:54:34 -07003 clippy::inherent_to_string,
4 clippy::large_enum_variant,
5 clippy::new_without_default,
David Tolnayef665fd2020-11-15 17:25:31 -08006 clippy::nonminimal_bool,
David Tolnay97b69c62020-09-01 16:36:42 -07007 clippy::or_fun_call,
David Tolnayedff9c02020-11-27 20:53:56 -08008 clippy::too_many_arguments,
David Tolnay30d214c2020-03-15 23:54:34 -07009 clippy::toplevel_ref_arg
10)]
11
David Tolnay39fa3662020-07-30 20:23:18 -070012mod app;
David Tolnay7db73692019-10-20 14:51:12 -040013mod gen;
David Tolnaye2e47a32020-09-24 10:23:27 -040014mod output;
David Tolnay7db73692019-10-20 14:51:12 -040015mod syntax;
16
David Tolnaye2e47a32020-09-24 10:23:27 -040017use crate::gen::error::{report, Result};
David Tolnay700cd0c2020-10-28 12:40:27 -070018use crate::gen::fs;
19use crate::gen::include::{self, Include};
David Tolnaye2e47a32020-09-24 10:23:27 -040020use crate::output::Output;
David Tolnay7eb9c6b2020-01-27 21:52:09 -080021use std::io::{self, Write};
David Tolnay7db73692019-10-20 14:51:12 -040022use std::path::PathBuf;
David Tolnay9ef74ce2020-09-13 23:24:02 -040023use std::process;
David Tolnay7db73692019-10-20 14:51:12 -040024
David Tolnay39fa3662020-07-30 20:23:18 -070025#[derive(Debug)]
David Tolnay7db73692019-10-20 14:51:12 -040026struct Opt {
RS0a2d1172020-01-27 21:47:37 -080027 input: Option<PathBuf>,
David Tolnay7db73692019-10-20 14:51:12 -040028 header: bool,
Adrian Taylor21f0ff02020-07-21 16:21:48 -070029 cxx_impl_annotations: Option<String>,
David Tolnay700cd0c2020-10-28 12:40:27 -070030 include: Vec<Include>,
David Tolnayf0277562020-09-24 10:46:14 -040031 outputs: Vec<Output>,
David Tolnay7db73692019-10-20 14:51:12 -040032}
33
David Tolnay7eb9c6b2020-01-27 21:52:09 -080034fn main() {
David Tolnay9ef74ce2020-09-13 23:24:02 -040035 if let Err(err) = try_main() {
36 let _ = writeln!(io::stderr(), "cxxbridge: {}", report(err));
37 process::exit(1);
38 }
39}
40
David Tolnayf0277562020-09-24 10:46:14 -040041enum Kind {
42 GeneratedHeader,
43 GeneratedImplementation,
44 Header,
45}
46
David Tolnay9ef74ce2020-09-13 23:24:02 -040047fn try_main() -> Result<()> {
David Tolnay39fa3662020-07-30 20:23:18 -070048 let opt = app::from_args();
RS0a2d1172020-01-27 21:47:37 -080049
David Tolnayf0277562020-09-24 10:46:14 -040050 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 Tolnaye2e47a32020-09-24 10:23:27 -040065
David Tolnay33d30292020-03-18 18:02:02 -070066 let gen = gen::Opt {
67 include: opt.include,
Adrian Taylor21f0ff02020-07-21 16:21:48 -070068 cxx_impl_annotations: opt.cxx_impl_annotations,
David Tolnaye2e47a32020-09-24 10:23:27 -040069 gen_header,
David Tolnayf0277562020-09-24 10:46:14 -040070 gen_implementation,
David Tolnay75c23852020-10-27 21:07:53 -070071 ..Default::default()
David Tolnay33d30292020-03-18 18:02:02 -070072 };
73
David Tolnayf0277562020-09-24 10:46:14 -040074 let generated_code = if let Some(input) = opt.input {
75 gen::generate_from_path(&input, &gen)
76 } else {
77 Default::default()
David Tolnay9ef74ce2020-09-13 23:24:02 -040078 };
79
David Tolnayf0277562020-09-24 10:46:14 -040080 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 }
RS0a2d1172020-01-27 21:47:37 -080090 }
David Tolnay9ef74ce2020-09-13 23:24:02 -040091
92 Ok(())
David Tolnay7db73692019-10-20 14:51:12 -040093}