use anyhow::Result;
use colored::*;
use tabled::{Table, Tabled};
use minifly::ApiClient;
pub async fn list(client: &ApiClient, app_name: &str) -> Result<()> {
if !client.health_check().await? {
println!("{}", "â Minifly API server is not running".red());
println!("Start it with: {}", "minifly serve".cyan());
return Ok(());
}
println!("{}", format!("đ Listing machines for app '{}'...", app_name).blue());
match client.list_machines(app_name).await {
Ok(machines) => {
if machines.is_empty() {
println!("{}", "No machines found".yellow());
println!("Create one with: {}", format!("minifly machines create --app {} --image <image>", app_name).cyan());
} else {
let table_data: Vec<MachineRow> = machines.into_iter().map(|machine| MachineRow {
id: machine.id,
name: machine.name,
state: machine.state,
region: machine.region,
image: machine.config.image,
private_ip: machine.private_ip,
}).collect();
let table = Table::new(table_data);
println!("{}", table);
}
}
Err(e) => {
println!("{}", format!("â Failed to list machines: {}", e).red());
}
}
Ok(())
}
pub async fn create(
client: &ApiClient,
app_name: &str,
image: &str,
name: Option<String>,
region: Option<String>,
) -> Result<()> {
if !client.health_check().await? {
println!("{}", "â Minifly API server is not running".red());
println!("Start it with: {}", "minifly serve".cyan());
return Ok(());
}
println!("{}", format!("đ Creating machine for app '{}'...", app_name).blue());
println!(" âĸ Image: {}", image.cyan());
if let Some(ref name) = name {
println!(" âĸ Name: {}", name.cyan());
}
if let Some(ref region) = region {
println!(" âĸ Region: {}", region.cyan());
}
match client.create_machine(app_name, image, name, region).await {
Ok(machine) => {
println!("{}", format!("â
Machine '{}' created successfully!", machine.id).green());
println!(" âĸ ID: {}", machine.id.cyan());
println!(" âĸ State: {}", machine.state.yellow());
println!(" âĸ Region: {}", machine.region.cyan());
println!(" âĸ Private IP: {}", machine.private_ip.cyan());
}
Err(e) => {
println!("{}", format!("â Failed to create machine: {}", e).red());
}
}
Ok(())
}
pub async fn start(client: &ApiClient, machine_id: &str) -> Result<()> {
if !client.health_check().await? {
println!("{}", "â Minifly API server is not running".red());
println!("Start it with: {}", "minifly serve".cyan());
return Ok(());
}
println!("{}", format!("âļī¸ Starting machine '{}'...", machine_id).blue());
match client.start_machine(machine_id).await {
Ok(machine) => {
println!("{}", format!("â
Machine '{}' started successfully!", machine.id).green());
println!(" âĸ State: {}", machine.state.yellow());
}
Err(e) => {
println!("{}", format!("â Failed to start machine: {}", e).red());
}
}
Ok(())
}
pub async fn stop(client: &ApiClient, machine_id: &str) -> Result<()> {
if !client.health_check().await? {
println!("{}", "â Minifly API server is not running".red());
println!("Start it with: {}", "minifly serve".cyan());
return Ok(());
}
println!("{}", format!("âšī¸ Stopping machine '{}'...", machine_id).yellow());
match client.stop_machine(machine_id).await {
Ok(machine) => {
println!("{}", format!("â
Machine '{}' stopped successfully!", machine.id).green());
println!(" âĸ State: {}", machine.state.yellow());
}
Err(e) => {
println!("{}", format!("â Failed to stop machine: {}", e).red());
}
}
Ok(())
}
pub async fn delete(client: &ApiClient, machine_id: &str, force: bool) -> Result<()> {
if !client.health_check().await? {
println!("{}", "â Minifly API server is not running".red());
println!("Start it with: {}", "minifly serve".cyan());
return Ok(());
}
let action = if force { "Force deleting" } else { "Deleting" };
println!("{}", format!("đī¸ {} machine '{}'...", action, machine_id).yellow());
match client.delete_machine(machine_id, force).await {
Ok(_) => {
println!("{}", format!("â
Machine '{}' deleted successfully!", machine_id).green());
}
Err(e) => {
println!("{}", format!("â Failed to delete machine: {}", e).red());
}
}
Ok(())
}
#[derive(Tabled)]
struct MachineRow {
#[tabled(rename = "ID")]
id: String,
#[tabled(rename = "Name")]
name: String,
#[tabled(rename = "State")]
state: String,
#[tabled(rename = "Region")]
region: String,
#[tabled(rename = "Image")]
image: String,
#[tabled(rename = "Private IP")]
private_ip: String,
}