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;