blob: c7230393c2bbc89a199597b51e3f8c349bc32880 [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 Tolnay97b69c62020-09-01 16:36:42 -07006 clippy::or_fun_call,
David Tolnay30d214c2020-03-15 23:54:34 -07007 clippy::toplevel_ref_arg
8)]
9
David Tolnay39fa3662020-07-30 20:23:18 -070010mod app;
David Tolnay7db73692019-10-20 14:51:12 -040011mod gen;
David Tolnaye2e47a32020-09-24 10:23:27 -040012mod output;
David Tolnay7db73692019-10-20 14:51:12 -040013mod syntax;
14
David Tolnaye2e47a32020-09-24 10:23:27 -040015use crate::gen::error::{report, Result};
David Tolnay700cd0c2020-10-28 12:40:27 -070016use crate::gen::fs;
17use crate::gen::include::{self, Include};
David Tolnaye2e47a32020-09-24 10:23:27 -040018use crate::output::Output;
David Tolnay7eb9c6b2020-01-27 21:52:09 -080019use std::io::{self, Write};
David Tolnay7db73692019-10-20 14:51:12 -040020use std::path::PathBuf;
David Tolnay9ef74ce2020-09-13 23:24:02 -040021use std::process;
David Tolnay7db73692019-10-20 14:51:12 -040022
David Tolnay39fa3662020-07-30 20:23:18 -070023#[derive(Debug)]
David Tolnay7db73692019-10-20 14:51:12 -040024struct Opt {
RS0a2d1172020-01-27 21:47:37 -080025 input: Option<PathBuf>,
David Tolnay7db73692019-10-20 14:51:12 -040026 header: bool,
Adrian Taylor21f0ff02020-07-21 16:21:48 -070027 cxx_impl_annotations: Option<String>,
David Tolnay700cd0c2020-10-28 12:40:27 -070028 include: Vec<Include>,
David Tolnayf0277562020-09-24 10:46:14 -040029 outputs: Vec<Output>,
David Tolnay7db73692019-10-20 14:51:12 -040030}
31
David Tolnay7eb9c6b2020-01-27 21:52:09 -080032fn main() {
David Tolnay9ef74ce2020-09-13 23:24:02 -040033 if let Err(err) = try_main() {
34 let _ = writeln!(io::stderr(), "cxxbridge: {}", report(err));
35 process::exit(1);
36 }
37}
38
David Tolnayf0277562020-09-24 10:46:14 -040039enum Kind {
40 GeneratedHeader,
41 GeneratedImplementation,
42 Header,
43}
44
David Tolnay9ef74ce2020-09-13 23:24:02 -040045fn try_main() -> Result<()> {
David Tolnay39fa3662020-07-30 20:23:18 -070046 let opt = app::from_args();
RS0a2d1172020-01-27 21:47:37 -080047
David Tolnayf0277562020-09-24 10:46:14 -040048 let mut outputs = Vec::new();
49 let mut gen_header = false;
50 let mut gen_implementation = false;
51 for output in opt.outputs {
52 let kind = if opt.input.is_none() {
53 Kind::Header
54 } else if opt.header || output.ends_with(".h") {
55 gen_header = true;
56 Kind::GeneratedHeader
57 } else {
58 gen_implementation = true;
59 Kind::GeneratedImplementation
60 };
61 outputs.push((output, kind));
62 }
David Tolnaye2e47a32020-09-24 10:23:27 -040063
David Tolnay33d30292020-03-18 18:02:02 -070064 let gen = gen::Opt {
65 include: opt.include,
Adrian Taylor21f0ff02020-07-21 16:21:48 -070066 cxx_impl_annotations: opt.cxx_impl_annotations,
David Tolnaye2e47a32020-09-24 10:23:27 -040067 gen_header,
David Tolnayf0277562020-09-24 10:46:14 -040068 gen_implementation,
David Tolnay75c23852020-10-27 21:07:53 -070069 ..Default::default()
David Tolnay33d30292020-03-18 18:02:02 -070070 };
71
David Tolnayf0277562020-09-24 10:46:14 -040072 let generated_code = if let Some(input) = opt.input {
73 gen::generate_from_path(&input, &gen)
74 } else {
75 Default::default()
David Tolnay9ef74ce2020-09-13 23:24:02 -040076 };
77
David Tolnayf0277562020-09-24 10:46:14 -040078 for (output, kind) in outputs {
79 let content = match kind {
80 Kind::GeneratedHeader => &generated_code.header,
81 Kind::GeneratedImplementation => &generated_code.implementation,
82 Kind::Header => include::HEADER.as_bytes(),
83 };
84 match output {
85 Output::Stdout => drop(io::stdout().write_all(content)),
86 Output::File(path) => fs::write(path, content)?,
87 }
RS0a2d1172020-01-27 21:47:37 -080088 }
David Tolnay9ef74ce2020-09-13 23:24:02 -040089
90 Ok(())
David Tolnay7db73692019-10-20 14:51:12 -040091}