1use std::env;
2use std::process::Command;
3
4use terrors::OneOf;
5
6#[cfg(not(unix))]
7compile_error!("cargo-stitch only supports Unix platforms (Linux, macOS, BSD)");
8
9mod error;
10mod fs;
11mod stitch;
12mod subcommand;
13mod wrapper;
14
15pub use error::{
16 AstGrepFailed, CargoFailed, IoError, MissingEnvVar, MissingStitchSet, MissingTool,
17 MissingWorkspaceRoot, PatchFailed,
18};
19
20pub const WRAPPER_ENV: &str = "__CARGO_STITCH_WRAP";
21pub const WORKSPACE_ROOT_ENV: &str = "__CARGO_STITCH_WORKSPACE_ROOT";
22pub const STITCH_MANIFEST_ENV: &str = "__CARGO_STITCH_MANIFEST";
23
24pub type Error = OneOf<(
25 IoError,
26 PatchFailed,
27 AstGrepFailed,
28 CargoFailed,
29 MissingEnvVar,
30 MissingTool,
31 MissingWorkspaceRoot,
32 MissingStitchSet,
33)>;
34
35pub(crate) fn check_required_tools(
36 need_patch: bool,
37 need_sg: bool,
38) -> Result<(), OneOf<(MissingTool,)>> {
39 if need_patch && Command::new("patch").arg("--version").output().is_err() {
40 return Err(OneOf::new(error::MissingTool("patch")));
41 }
42
43 if need_sg && Command::new("ast-grep").arg("--version").output().is_err() {
44 return Err(OneOf::new(error::MissingTool("ast-grep")));
45 }
46
47 Ok(())
48}
49
50pub fn run() -> Result<(), Error> {
55 if env::var_os(WRAPPER_ENV).is_some() {
56 wrapper::run_wrapper().map_err(OneOf::broaden)
57 } else {
58 subcommand::run_subcommand().map_err(OneOf::broaden)
59 }
60}