1#![feature(try_trait_v2)]
2#![allow(dead_code)]
3#![feature(trait_alias)]
4
5use std::fmt::Debug;
6use std::io;
7use std::process::Output as CmdOutput;
8
9use backtrace::Backtrace;
10
11pub use config::{Config, GoObjectPath, UnitLikeStructPath};
12
13use crate::generator::Generator;
14
15mod config;
16mod generator;
17mod go_os_arch_gen;
18mod os_arch;
19mod rust_os_arch_gen;
20#[cfg(not(feature = "no-codec"))]
21mod with_codec;
22#[cfg(feature = "no-codec")]
23mod without_codec;
24
25#[allow(dead_code)]
26enum GenMode {
27 Codec,
28 NoCodec,
29}
30
31#[cfg(feature = "no-codec")]
32const GEN_MODE: GenMode = GenMode::NoCodec;
33#[cfg(not(feature = "no-codec"))]
34const GEN_MODE: GenMode = GenMode::Codec;
35
36#[cfg(not(debug_assertions))]
37const BUILD_MODE: &'static str = "release";
38#[cfg(debug_assertions)]
39const BUILD_MODE: &'static str = "debug";
40
41pub fn generate_code(config: Config) {
42 Generator::generate(config)
43}
44
45const CODE_UNKNOWN: i32 = -1;
46const CODE_CMD_UNKNOWN: i32 = -2;
47const CODE_IO: i32 = -3;
48const CODE_GIT: i32 = -4;
49
50fn exit_with_warning(code: i32, message: impl AsRef<str>) {
51 let mut frames = vec![];
52 for bf in Backtrace::new().frames()[4..].as_ref() {
53 if bf
54 .symbols()
55 .get(0)
56 .unwrap()
57 .name()
58 .unwrap()
59 .to_string()
60 .starts_with("build_script_build::main::")
61 {
62 break;
63 }
64 frames.push(bf.clone());
65 }
66 println!(
67 "cargo:warning={}\nbacktrace:\n{:?}",
68 message.as_ref(),
69 Backtrace::from(frames)
70 );
71 std::process::exit(code);
72}
73
74fn deal_result<T, E: Debug>(code: i32, result: Result<T, E>) -> T {
75 match result {
76 Ok(t) => t,
77 Err(e) => {
78 exit_with_warning(code, format!("{e:?}"));
79 unreachable!()
80 }
81 }
82}
83
84fn deal_output(output: io::Result<CmdOutput>) {
85 match output {
86 Ok(output) => {
87 if !output.status.success() {
88 exit_with_warning(
89 output.status.code().unwrap_or(CODE_CMD_UNKNOWN),
90 format!("{output:?}"),
91 );
92 } else {
93 if output.stderr.is_empty() {
94 println!("{output:?}");
95 } else {
96 println!(
97 "cargo:warning={:?}",
98 String::from_utf8(output.stderr.clone()).unwrap_or(format!("{output:?}"))
99 );
100 }
101 }
102 }
103 Err(e) => {
104 exit_with_warning(CODE_UNKNOWN, format!("{e:?}"));
105 }
106 }
107}