refactor: colored text

This commit is contained in:
rzmk 2025-09-03 08:34:53 -04:00
parent fe656fc242
commit 572cfab8ca
2 changed files with 61 additions and 68 deletions

View file

@ -1,8 +1,10 @@
mod styles;
use crate::styles::{highlighted_text, important_text, step_text, success_text};
use anyhow::Result; use anyhow::Result;
use clap::Parser; use clap::Parser;
use human_panic::{metadata, setup_panic}; use human_panic::{metadata, setup_panic};
use inquire::Confirm; use inquire::Confirm;
use owo_colors::{OwoColorize, Stream::Stdout, Style};
use serde_json::json; use serde_json::json;
use std::{path::PathBuf, str::FromStr}; use std::{path::PathBuf, str::FromStr};
use xshell::cmd; use xshell::cmd;
@ -24,25 +26,20 @@ fn main() -> Result<()> {
let args = Args::parse(); let args = Args::parse();
// Color styles
let highlight_style = Style::new().on_blue().white();
let important_style = Style::new().on_bright_red().white();
let step_style = Style::new().on_magenta().white();
let success_style = Style::new().on_green().white();
println!("Welcome to the ckan-devstaller!"); println!("Welcome to the ckan-devstaller!");
println!( println!(
"ckan-devstaller is provided by datHere - {}\n", "ckan-devstaller is provided by datHere - {}\n",
"https://datHere.com".if_supports_color(Stdout, |t| t.style(highlight_style)), highlighted_text("https://datHere.com"),
); );
println!( println!(
"This installer should assist in setting up {} from a source installation along with ckan-compose (https://github.com/tino097/ckan-compose). If you have any issues, please report them at https://github.com/dathere/ckan-devstaller/issues.", "This installer should assist in setting up {} from a source installation along with ckan-compose (https://github.com/tino097/ckan-compose). If you have any issues, please report them at https://github.com/dathere/ckan-devstaller/issues.",
"CKAN 2.11.3".if_supports_color(Stdout, |t| t.style(highlight_style)) highlighted_text("CKAN 2.11.3")
); );
println!( println!(
"{}", "{}",
"This installer is only intended for a brand new installation of Ubuntu 22.04." important_text(
.if_supports_color(Stdout, |t| t.style(important_style)) "This installer is only intended for a brand new installation of Ubuntu 22.04."
)
); );
let ans = if args.default { let ans = if args.default {
@ -58,33 +55,27 @@ fn main() -> Result<()> {
let username = cmd!(sh, "whoami").read()?; let username = cmd!(sh, "whoami").read()?;
println!( println!(
"\n{} Running {} and {}...", "\n{} Running {} and {}...",
"1.".if_supports_color(Stdout, |t| t.style(step_style)), step_text("1."),
"sudo apt update -y".if_supports_color(Stdout, |t| t.style(highlight_style)), highlighted_text("sudo apt update -y"),
"sudo apt upgrade -y".if_supports_color(Stdout, |t| t.style(highlight_style)) highlighted_text("sudo apt upgrade -y")
); );
println!( println!(
"{}", "{}",
"You may need to provide your sudo password." important_text("You may need to provide your sudo password.")
.if_supports_color(Stdout, |t| t.style(important_style))
); );
cmd!(sh, "sudo apt update -y").run()?; cmd!(sh, "sudo apt update -y").run()?;
// Ignoring xrdp error with .ignore_status() for now // Ignoring xrdp error with .ignore_status() for now
cmd!(sh, "sudo apt upgrade -y").ignore_status().run()?; cmd!(sh, "sudo apt upgrade -y").ignore_status().run()?;
println!( println!(
"{}", "{}",
"✅ 1. Successfully ran update and upgrade commands." success_text("✅ 1. Successfully ran update and upgrade commands.")
.if_supports_color(Stdout, |t| t.style(success_style))
); );
println!( println!("\n{} Installing curl and enabling SSH...", step_text("2."));
"\n{} Installing curl and enabling SSH...",
"2.".if_supports_color(Stdout, |t| t.style(step_style)),
);
cmd!(sh, "sudo apt install curl openssh-server -y").run()?; cmd!(sh, "sudo apt install curl openssh-server -y").run()?;
println!( println!(
"{}", "{}",
"✅ 2. Successfully installed curl and enabled SSH." success_text("✅ 2. Successfully installed curl and enabled SSH.")
.if_supports_color(Stdout, |t| t.style(success_style))
); );
let dpkg_l_output = cmd!(sh, "dpkg -l").read()?; let dpkg_l_output = cmd!(sh, "dpkg -l").read()?;
@ -95,21 +86,14 @@ fn main() -> Result<()> {
.status .status
.success(); .success();
if !has_docker { if !has_docker {
println!( println!("{} Installing Docker...", step_text("3."),);
"{} Installing Docker...",
"3.".if_supports_color(Stdout, |t| t.style(step_style)),
);
cmd!( cmd!(
sh, sh,
"curl -fsSL https://get.docker.com -o /home/{username}/get-docker.sh" "curl -fsSL https://get.docker.com -o /home/{username}/get-docker.sh"
) )
.run()?; .run()?;
cmd!(sh, "sudo sh /home/{username}/get-docker.sh").run()?; cmd!(sh, "sudo sh /home/{username}/get-docker.sh").run()?;
println!( println!("{}", success_text("✅ 3. Successfully installed Docker."));
"{}",
"✅ 3. Successfully installed Docker."
.if_supports_color(Stdout, |t| t.style(success_style))
);
} }
let has_docker_compose = cmd!(sh, "grep docker-compose") let has_docker_compose = cmd!(sh, "grep docker-compose")
@ -122,23 +106,16 @@ fn main() -> Result<()> {
cmd!(sh, "sudo apt install docker-compose -y").run()?; cmd!(sh, "sudo apt install docker-compose -y").run()?;
} }
println!( println!("\n{} Installing Ahoy...", step_text("4."),);
"\n{} Installing Ahoy...",
"4.".if_supports_color(Stdout, |t| t.style(step_style)),
);
sh.change_dir(format!("/home/{username}")); sh.change_dir(format!("/home/{username}"));
cmd!(sh, "sudo curl -LO https://github.com/ahoy-cli/ahoy/releases/download/v2.5.0/ahoy-bin-linux-amd64").run()?; cmd!(sh, "sudo curl -LO https://github.com/ahoy-cli/ahoy/releases/download/v2.5.0/ahoy-bin-linux-amd64").run()?;
cmd!(sh, "mv ./ahoy-bin-linux-amd64 ./ahoy").run()?; cmd!(sh, "mv ./ahoy-bin-linux-amd64 ./ahoy").run()?;
cmd!(sh, "sudo chmod +x ./ahoy").run()?; cmd!(sh, "sudo chmod +x ./ahoy").run()?;
println!( println!("{}", success_text("✅ 4. Successfully installed Ahoy."));
"{}",
"✅ 4. Successfully installed Ahoy."
.if_supports_color(Stdout, |t| t.style(success_style))
);
println!( println!(
"\n{} Downloading, installing, and starting ckan-compose...", "\n{} Downloading, installing, and starting ckan-compose...",
"5.".if_supports_color(Stdout, |t| t.style(step_style)), step_text("5."),
); );
if !std::fs::exists(format!("/home/{username}/ckan-compose"))? { if !std::fs::exists(format!("/home/{username}/ckan-compose"))? {
cmd!(sh, "git clone https://github.com/tino097/ckan-compose.git").run()?; cmd!(sh, "git clone https://github.com/tino097/ckan-compose.git").run()?;
@ -150,16 +127,9 @@ DATASTORE_READONLY_PASSWORD=pass
POSTGRES_PASSWORD=pass"; POSTGRES_PASSWORD=pass";
std::fs::write(format!("/home/{username}/ckan-compose/.env"), env_data)?; std::fs::write(format!("/home/{username}/ckan-compose/.env"), env_data)?;
cmd!(sh, "sudo ../ahoy up").run()?; cmd!(sh, "sudo ../ahoy up").run()?;
println!( println!("{}", success_text("✅ 5. Successfully ran ckan-compose."));
"{}",
"✅ 5. Successfully ran ckan-compose."
.if_supports_color(Stdout, |t| t.style(success_style))
);
println!( println!("\n{} Installing CKAN 2.11.3...", step_text("6."),);
"\n{} Installing CKAN 2.11.3...",
"6.".if_supports_color(Stdout, |t| t.style(step_style)),
);
cmd!(sh, "sudo apt install python3-dev libpq-dev python3-pip python3-venv git-core redis-server -y").run()?; cmd!(sh, "sudo apt install python3-dev libpq-dev python3-pip python3-venv git-core redis-server -y").run()?;
cmd!(sh, "sudo mkdir -p /usr/lib/ckan/default").run()?; cmd!(sh, "sudo mkdir -p /usr/lib/ckan/default").run()?;
cmd!(sh, "sudo chown {username} /usr/lib/ckan/default").run()?; cmd!(sh, "sudo chown {username} /usr/lib/ckan/default").run()?;
@ -195,14 +165,11 @@ POSTGRES_PASSWORD=pass";
"ckan -c /etc/ckan/default/ckan.ini sysadmin add {username}" "ckan -c /etc/ckan/default/ckan.ini sysadmin add {username}"
) )
.run()?; .run()?;
println!( println!("{}", success_text("✅ 6. Installed CKAN 2.11.3."));
"{}",
"✅ 6. Installed CKAN 2.11.3.".if_supports_color(Stdout, |t| t.style(success_style))
);
println!( println!(
"\n{} Enabling DataStore plugin, adding config URLs in /etc/ckan/default/ckan.ini and updating permissions...", "\n{} Enabling DataStore plugin, adding config URLs in /etc/ckan/default/ckan.ini and updating permissions...",
"7.".if_supports_color(Stdout, |t| t.style(step_style)), step_text("7."),
); );
// TODO: use the ckan config-tool command instead of rust-ini // TODO: use the ckan config-tool command instead of rust-ini
let mut conf = ini::Ini::load_from_file("/etc/ckan/default/ckan.ini")?; let mut conf = ini::Ini::load_from_file("/etc/ckan/default/ckan.ini")?;
@ -246,13 +213,14 @@ POSTGRES_PASSWORD=pass";
cmd!(sh, "sudo docker exec {postgres_container_id} psql -U ckan_default --set ON_ERROR_STOP=1 -f permissions.sql").run()?; cmd!(sh, "sudo docker exec {postgres_container_id} psql -U ckan_default --set ON_ERROR_STOP=1 -f permissions.sql").run()?;
println!( println!(
"{}", "{}",
"✅ 7. Enabled DataStore plugin, set DataStore URLs in /etc/ckan/default/ckan.ini, and updated permissions." success_text(
.if_supports_color(Stdout, |t| t.style(success_style)) "✅ 7. Enabled DataStore plugin, set DataStore URLs in /etc/ckan/default/ckan.ini, and updated permissions."
)
); );
println!( println!(
"\n{} Installing ckanext-scheming and DataPusher+ extensions...", "{}",
"8.".if_supports_color(Stdout, |t| t.style(step_style)), step_text("\n{} Installing ckanext-scheming and DataPusher+ extensions..."),
); );
cmd!( cmd!(
sh, sh,
@ -393,14 +361,10 @@ ckanext.datapusher_plus.enable_form_redirect = true
.run()?; .run()?;
println!( println!(
"{}", "{}",
"✅ 8. Installed ckanext-scheming and DataPusher+ extensions." success_text("✅ 8. Installed ckanext-scheming and DataPusher+ extensions.")
.if_supports_color(Stdout, |t| t.style(success_style))
); );
println!( println!("\n{}", success_text("✅ 9. Running CKAN instance..."));
"\n{}",
"✅ 9. Running CKAN instance...".if_supports_color(Stdout, |t| t.style(success_style))
);
cmd!(sh, "ckan -c /etc/ckan/default/ckan.ini run").run()?; cmd!(sh, "ckan -c /etc/ckan/default/ckan.ini run").run()?;
} }
@ -417,7 +381,7 @@ fn get_config_from_prompts() -> Result<Config> {
.with_help_message( .with_help_message(
format!( format!(
"This step would install {}", "This step would install {}",
"openssh-server".if_supports_color(Stdout, |t| t.on_blue().white()) highlighted_text("openssh-server")
) )
.as_str(), .as_str(),
) )

29
src/styles.rs Normal file
View file

@ -0,0 +1,29 @@
use owo_colors::{OwoColorize, Stream::Stdout};
pub fn highlighted_text(text: &str) -> impl std::fmt::Display {
format!(
"{}",
text.if_supports_color(Stdout, |t| t.on_blue().white())
)
}
pub fn important_text(text: &str) -> impl std::fmt::Display {
format!(
"{}",
text.if_supports_color(Stdout, |t| t.on_bright_red().white())
)
}
pub fn step_text(text: &str) -> impl std::fmt::Display {
format!(
"{}",
text.if_supports_color(Stdout, |t| t.on_magenta().white())
)
}
pub fn success_text(text: &str) -> impl std::fmt::Display {
format!(
"{}",
text.if_supports_color(Stdout, |t| t.on_green().white())
)
}