Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,10 @@ pub enum RuntimeCommands {
#[clap(alias("shot"), alias("snap"), alias("photo"))]
Screenshot,

/// Launch the given app.
#[clap(alias("start"), alias("execute"), alias("open"))]
Launch(LaunchArgs),

/// Restart the running app.
#[clap(alias("reload"))]
Restart,
Expand All @@ -334,6 +338,13 @@ pub enum RuntimeCommands {
Id,
}

#[derive(Debug, Parser)]
pub struct LaunchArgs {
/// The app ID to launch. For example, "lux.snek".
#[arg()]
pub id: String,
}

#[derive(Debug, Parser)]
pub struct ReplArgs {
/// Path to the project root.
Expand Down
1 change: 1 addition & 0 deletions src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ pub fn run_command(vfs: PathBuf, command: &Commands) -> anyhow::Result<()> {
NameCommands::Generate => cmd_name_generate(&vfs),
},
Runtime(root_args) => match &root_args.command {
RuntimeCommands::Launch(args) => cmd_launch(root_args, args),
RuntimeCommands::Restart => cmd_restart(root_args),
RuntimeCommands::Exit => cmd_exit(root_args),
RuntimeCommands::Id => cmd_id(root_args),
Expand Down
2 changes: 1 addition & 1 deletion src/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,6 @@ pub use monitor::cmd_monitor;
pub use name::{cmd_name_generate, cmd_name_get, cmd_name_set};
pub use new::cmd_new;
pub use repl::cmd_repl;
pub use runtime::{cmd_exit, cmd_id, cmd_restart, cmd_screenshot};
pub use runtime::{cmd_exit, cmd_id, cmd_launch, cmd_restart, cmd_screenshot};
pub use shots::cmd_shots_download;
pub use vfs::cmd_vfs;
39 changes: 35 additions & 4 deletions src/commands/runtime.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::args::RuntimeArgs;
use crate::args::{LaunchArgs, RuntimeArgs};
use crate::net::{connect, Stream};
use anyhow::{bail, Context, Result};
use firefly_types::serial;
Expand Down Expand Up @@ -26,6 +26,31 @@ pub fn cmd_restart(root_args: &RuntimeArgs) -> Result<()> {
wait_for_ok(stream)
}

pub fn cmd_launch(root_args: &RuntimeArgs, args: &LaunchArgs) -> Result<()> {
println!("⏳️ connecting...");
let mut stream = connect(root_args)?;
stream.set_timeout(2);

if args.id == "sys.connector" || args.id == "sys.disconnector" {
bail!("cannot connect or disconnect through CLI yet");
}
let Some((author_id, app_id)) = args.id.split_once('.') else {
bail!("the ID must contain a dot");
};
if let Err(err) = firefly_types::validate_id(author_id) {
bail!("invalid author ID: {err}");
}
if let Err(err) = firefly_types::validate_id(app_id) {
bail!("invalid app ID: {err}");
}

println!("⌛ launching {}...", args.id);
let id = (author_id.to_string(), app_id.to_string());
let req = serial::Request::Launch(id);
stream.send(&req).context("send request")?;
wait_for_ok(stream)
}

pub fn cmd_id(root_args: &RuntimeArgs) -> Result<()> {
eprintln!("⏳️ connecting...");
let mut stream = connect(root_args)?;
Expand Down Expand Up @@ -65,9 +90,15 @@ fn wait_for_ok(stream: Box<dyn Stream>) -> Result<()> {
let mut stream = stream;
for _ in 0..5 {
let resp = stream.next()?;
if matches!(resp, serial::Response::Ok) {
println!("✅ done");
return Ok(());
match resp {
serial::Response::Ok => {
println!("✅ done");
return Ok(());
}
serial::Response::Log(log) => {
println!("🪵 {log}");
}
_ => {}
}
}
bail!("timed out waiting for response")
Expand Down