Skip to main content

cargo_stitch/
lib.rs

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
50/// Run the cargo-stitch process
51/// # Errors
52/// Returns an error if a required tool (like `patch` or `ast-grep`) is missing,
53/// or if an underlying cargo build or patch operation fails.
54pub 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}