fcplug_build/
lib.rs

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}