gradle_util_rs/
lib.rs

1use anyhow::Context;
2use std::io::Write;
3use std::path::PathBuf;
4use std::process::Stdio;
5use termcolor::WriteColor;
6
7pub fn log_error<D: std::fmt::Display>(err: D) {
8    let stderr = termcolor::StandardStream::stderr(termcolor::ColorChoice::Auto);
9    let mut stderr = stderr.lock();
10    let _ = stderr.set_color(termcolor::ColorSpec::new().set_fg(Some(termcolor::Color::Red)));
11    let _ = stderr.write(b"error");
12    let _ = stderr.reset();
13    let _ = writeln!(stderr, ": {}", err);
14}
15
16pub fn log_error_with_timestamp<D: std::fmt::Display>(err: D) {
17    let stderr = termcolor::StandardStream::stderr(termcolor::ColorChoice::Auto);
18    let mut stderr = stderr.lock();
19    let _ = write!(stderr, "[{}]", chrono::Local::now());
20    let _ = stderr.set_color(termcolor::ColorSpec::new().set_fg(Some(termcolor::Color::Red)));
21    let _ = stderr.write(b"error");
22    let _ = stderr.reset();
23    let _ = writeln!(stderr, ": {}", err);
24}
25
26pub fn log_warn<D: std::fmt::Display>(warn: D) {
27    let stderr = termcolor::StandardStream::stderr(termcolor::ColorChoice::Auto);
28    let mut stderr = stderr.lock();
29    let _ = stderr.set_color(termcolor::ColorSpec::new().set_fg(Some(termcolor::Color::Yellow)));
30    let _ = stderr.write(b"warning");
31    let _ = stderr.reset();
32    let _ = writeln!(stderr, ": {}", warn);
33}
34
35#[cfg(windows)]
36const GRADLEW: &str = "gradlew.bat";
37#[cfg(not(windows))]
38const GRADLEW: &str = "gradlew";
39
40fn run_gradlew_wrapper(
41    project_dir: PathBuf,
42    args: &[&str],
43    stdout: Stdio,
44) -> anyhow::Result<Vec<u8>> {
45    let mut wrapper = project_dir;
46    wrapper.push(GRADLEW);
47    std::process::Command::new(wrapper)
48        .args(args)
49        .stdout(stdout)
50        .output()
51        .context("failed to run `gradlew`")
52        .and_then(|output| {
53            if !output.status.success() {
54                Err(handle_gradlew_status(output.status))
55            } else {
56                Ok(output.stdout)
57            }
58        })
59}
60
61fn handle_gradlew_status(status: std::process::ExitStatus) -> anyhow::Error {
62    match status.code() {
63        Some(code) => anyhow::anyhow!("`gradlew` exited with status code: {}", code),
64        None => anyhow::anyhow!("`gradlew` terminated by signal."),
65    }
66}
67
68pub mod chver;
69pub mod set_new;
70pub mod utils;