From ec39b1f3770e9e7043d1b1c2f0a8c846a0051d20 Mon Sep 17 00:00:00 2001 From: Mirko Brombin Date: Tue, 30 Dec 2025 20:03:15 +0100 Subject: [PATCH 1/2] feat: gRPC protocol --- src/main.rs | 58 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/src/main.rs b/src/main.rs index 0c94fdb..4754b3f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,4 @@ -use bottles_core::proto::NotifyRequest; -pub use bottles_core::proto::{HealthRequest, bottles_client::BottlesClient}; +use bottles_core::proto::bottles::{management_client::ManagementClient, CreateBottleRequest, DeleteBottleRequest, ListBottlesRequest}; use clap::{Parser, Subcommand}; use tracing_subscriber::EnvFilter; @@ -12,13 +11,15 @@ struct Cli { #[derive(Subcommand)] enum Command { - #[command(about = "Check the health of the server")] - Health, - #[command(about = "Notify the server")] - Notify { - #[arg(help = "The message to send")] - message: String, + Create { + name: String, + #[arg(short, long, default_value = "Gaming")] + r#type: String, }, + Delete { + name: String, + }, + List, } #[tokio::main] @@ -28,28 +29,37 @@ async fn main() -> Result<(), Box> { .init(); let args = Cli::parse(); + // Connect to Server let url = "http://[::1]:50052"; - let mut client = BottlesClient::connect(url).await?; + let mut client = ManagementClient::connect(url).await?; match args.command { - Command::Health => { - let request = HealthRequest {}; - let response = client.health(request).await?; - let response = response.get_ref(); - if response.ok { - tracing::info!("Server is healthy"); + Command::Create { name, r#type } => { + let request = CreateBottleRequest { + name, + r#type, + runner: String::new(), + }; + let response = client.create_bottle(request).await?; + let bottle = response.get_ref(); + println!("Created bottle: {} ({}) at {}", bottle.name, bottle.r#type, bottle.path); + } + Command::Delete { name } => { + let request = DeleteBottleRequest { name }; + let response = client.delete_bottle(request).await?; + if response.get_ref().success { + println!("Deleted bottle successfully"); } else { - tracing::info!("Server is unhealthy"); + eprintln!("Failed to delete bottle: {}", response.get_ref().error_message); } } - Command::Notify { message } => { - let request = NotifyRequest { message }; - let response = client.notify(request).await?; - let response = response.get_ref(); - if response.success { - tracing::info!("Message sent successfully"); - } else { - tracing::info!("Failed to send message"); + Command::List => { + let request = ListBottlesRequest {}; + let response = client.list_bottles(request).await?; + let list = response.get_ref(); + println!("Bottles:"); + for bottle in &list.bottles { + println!("- {} ({}) [{}]", bottle.name, bottle.r#type, if bottle.active { "Running" } else { "Stopped" }); } } } From 19225e85b068eb5b71941170377bb7969b908327 Mon Sep 17 00:00:00 2001 From: Mirko Brombin Date: Tue, 6 Jan 2026 22:15:55 +0100 Subject: [PATCH 2/2] feat: add Start/Stop/Restart commands --- src/main.rs | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 4754b3f..46ec243 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use bottles_core::proto::bottles::{management_client::ManagementClient, CreateBottleRequest, DeleteBottleRequest, ListBottlesRequest}; +use bottles_core::proto::bottles::{management_client::ManagementClient, CreateBottleRequest, DeleteBottleRequest, ListBottlesRequest, BottleRequest}; use clap::{Parser, Subcommand}; use tracing_subscriber::EnvFilter; @@ -20,6 +20,15 @@ enum Command { name: String, }, List, + Start { + name: String, + }, + Stop { + name: String, + }, + Restart { + name: String, + }, } #[tokio::main] @@ -62,6 +71,33 @@ async fn main() -> Result<(), Box> { println!("- {} ({}) [{}]", bottle.name, bottle.r#type, if bottle.active { "Running" } else { "Stopped" }); } } + Command::Start { name } => { + let request = BottleRequest { name }; + let response = client.start_bottle(request).await?; + if response.get_ref().success { + println!("Bottle started successfully"); + } else { + eprintln!("Failed to start bottle: {}", response.get_ref().error_message); + } + } + Command::Stop { name } => { + let request = BottleRequest { name }; + let response = client.stop_bottle(request).await?; + if response.get_ref().success { + println!("Bottle stopped successfully"); + } else { + eprintln!("Failed to stop bottle: {}", response.get_ref().error_message); + } + } + Command::Restart { name } => { + let request = BottleRequest { name }; + let response = client.restart_bottle(request).await?; + if response.get_ref().success { + println!("Bottle restarted successfully"); + } else { + eprintln!("Failed to restart bottle: {}", response.get_ref().error_message); + } + } } Ok(()) }