diff --git a/.changeset/twelve-rats-dance.md b/.changeset/twelve-rats-dance.md new file mode 100644 index 000000000..71e3b57a0 --- /dev/null +++ b/.changeset/twelve-rats-dance.md @@ -0,0 +1,5 @@ +--- +'@lagon/cli': minor +--- + +Add `lagon link` command diff --git a/packages/cli/src/commands/deploy.rs b/packages/cli/src/commands/deploy.rs index 9723b2857..9d5160c2e 100644 --- a/packages/cli/src/commands/deploy.rs +++ b/packages/cli/src/commands/deploy.rs @@ -13,9 +13,9 @@ use crate::utils::{ }; #[derive(Deserialize, Debug)] -struct Organization { - name: String, - id: String, +pub struct Organization { + pub name: String, + pub id: String, } impl Display for Organization { @@ -24,7 +24,7 @@ impl Display for Organization { } } -type OrganizationsResponse = Vec; +pub type OrganizationsResponse = Vec; #[derive(Serialize, Debug)] struct CreateFunctionRequest { @@ -40,9 +40,9 @@ struct CreateFunctionResponse { } #[derive(Deserialize, Debug)] -struct Function { - id: String, - name: String, +pub struct Function { + pub id: String, + pub name: String, } impl Display for Function { @@ -51,7 +51,7 @@ impl Display for Function { } } -type FunctionsResponse = Vec; +pub type FunctionsResponse = Vec; pub async fn deploy( file: PathBuf, diff --git a/packages/cli/src/commands/link.rs b/packages/cli/src/commands/link.rs new file mode 100644 index 000000000..5d5a60e20 --- /dev/null +++ b/packages/cli/src/commands/link.rs @@ -0,0 +1,64 @@ +use anyhow::{anyhow, Result}; +use std::path::PathBuf; + +use dialoguer::Select; + +use crate::{ + commands::deploy::{FunctionsResponse, OrganizationsResponse}, + utils::{ + debug, get_function_config, success, validate_code_file, write_function_config, Config, + DeploymentConfig, TrpcClient, + }, +}; + +pub async fn link(file: PathBuf) -> Result<()> { + let config = Config::new()?; + + if config.token.is_none() { + return Err(anyhow!( + "You are not logged in. Please login with `lagon login`", + )); + } + + validate_code_file(&file)?; + + match get_function_config(&file)? { + None => { + println!("{}", debug("No deployment config found...")); + println!(); + + let trpc_client = TrpcClient::new(&config); + let response = trpc_client + .query::<(), OrganizationsResponse>("organizationsList", None) + .await?; + let organizations = response.result.data; + + let index = Select::new().items(&organizations).default(0).interact()?; + let organization = &organizations[index]; + + let response = trpc_client + .query::<(), FunctionsResponse>("functionsList", None) + .await?; + + let index = Select::new() + .items(&response.result.data) + .default(0) + .interact()?; + let function = &response.result.data[index]; + + write_function_config( + &file, + DeploymentConfig { + function_id: function.id.clone(), + organization_id: organization.id.clone(), + }, + )?; + + println!("{}", success("Function linked!")); + println!(); + + Ok(()) + } + Some(_) => Err(anyhow!("This file is already linked to a Function.")), + } +} diff --git a/packages/cli/src/commands/mod.rs b/packages/cli/src/commands/mod.rs index 183f81288..03fd9e075 100644 --- a/packages/cli/src/commands/mod.rs +++ b/packages/cli/src/commands/mod.rs @@ -1,6 +1,7 @@ mod build; mod deploy; mod dev; +mod link; mod login; mod logout; mod rm; @@ -8,6 +9,7 @@ mod rm; pub use build::build; pub use deploy::deploy; pub use dev::dev; +pub use link::link; pub use login::login; pub use logout::logout; pub use rm::rm; diff --git a/packages/cli/src/main.rs b/packages/cli/src/main.rs index ac51a1472..a68905f8d 100644 --- a/packages/cli/src/main.rs +++ b/packages/cli/src/main.rs @@ -85,6 +85,12 @@ enum Commands { #[clap(short, long, value_parser)] public_dir: Option, }, + /// Link a local Function file to an already deployed Function + Link { + /// Path to the file containing the Function + #[clap(value_parser)] + file: PathBuf, + }, } #[tokio::main] @@ -115,6 +121,7 @@ async fn main() { client, public_dir, } => commands::build(file, client, public_dir), + Commands::Link { file } => commands::link(file).await, } { println!("{}", error(&err.to_string())); }