mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-05-01 13:14:15 +02:00
cli: prep 0.4.0 stable release
This commit is contained in:
@@ -68,12 +68,8 @@ pub struct SendArgs {
|
||||
/// Request, folder, or workspace ID
|
||||
pub id: String,
|
||||
|
||||
/// Execute requests sequentially (default)
|
||||
#[arg(long, conflicts_with = "parallel")]
|
||||
pub sequential: bool,
|
||||
|
||||
/// Execute requests in parallel
|
||||
#[arg(long, conflicts_with = "sequential")]
|
||||
#[arg(long)]
|
||||
pub parallel: bool,
|
||||
|
||||
/// Stop on first request failure when sending folders/workspaces
|
||||
@@ -342,8 +338,8 @@ pub enum EnvironmentCommands {
|
||||
1) yaak environment create <workspace_id> --name <name>
|
||||
2) yaak environment create --json '{"workspaceId":"wk_abc","name":"Production"}'
|
||||
3) yaak environment create '{"workspaceId":"wk_abc","name":"Production"}'
|
||||
|
||||
Do not combine <workspace_id> with --json."#)]
|
||||
4) yaak environment create <workspace_id> --json '{"name":"Production"}'
|
||||
"#)]
|
||||
Create {
|
||||
/// Workspace ID for flag-based mode, or positional JSON payload shorthand
|
||||
#[arg(value_name = "WORKSPACE_ID_OR_JSON")]
|
||||
|
||||
@@ -2,8 +2,8 @@ use crate::cli::{EnvironmentArgs, EnvironmentCommands};
|
||||
use crate::context::CliContext;
|
||||
use crate::utils::confirm::confirm_delete;
|
||||
use crate::utils::json::{
|
||||
apply_merge_patch, is_json_shorthand, parse_optional_json, parse_required_json, require_id,
|
||||
validate_create_id,
|
||||
apply_merge_patch, is_json_shorthand, merge_workspace_id_arg, parse_optional_json,
|
||||
parse_required_json, require_id, validate_create_id,
|
||||
};
|
||||
use crate::utils::schema::append_agent_hints;
|
||||
use schemars::schema_for;
|
||||
@@ -34,18 +34,13 @@ pub fn run(ctx: &CliContext, args: EnvironmentArgs) -> i32 {
|
||||
}
|
||||
|
||||
fn schema(pretty: bool) -> CommandResult {
|
||||
let mut schema =
|
||||
serde_json::to_value(schema_for!(Environment)).map_err(|e| format!(
|
||||
"Failed to serialize environment schema: {e}"
|
||||
))?;
|
||||
let mut schema = serde_json::to_value(schema_for!(Environment))
|
||||
.map_err(|e| format!("Failed to serialize environment schema: {e}"))?;
|
||||
append_agent_hints(&mut schema);
|
||||
|
||||
let output = if pretty {
|
||||
serde_json::to_string_pretty(&schema)
|
||||
} else {
|
||||
serde_json::to_string(&schema)
|
||||
}
|
||||
.map_err(|e| format!("Failed to format environment schema JSON: {e}"))?;
|
||||
let output =
|
||||
if pretty { serde_json::to_string_pretty(&schema) } else { serde_json::to_string(&schema) }
|
||||
.map_err(|e| format!("Failed to format environment schema JSON: {e}"))?;
|
||||
println!("{output}");
|
||||
Ok(())
|
||||
}
|
||||
@@ -83,17 +78,11 @@ fn create(
|
||||
name: Option<String>,
|
||||
json: Option<String>,
|
||||
) -> CommandResult {
|
||||
if json.is_some() && workspace_id.as_deref().is_some_and(|v| !is_json_shorthand(v)) {
|
||||
return Err(
|
||||
"environment create cannot combine workspace_id with --json payload".to_string()
|
||||
);
|
||||
}
|
||||
let json_shorthand =
|
||||
workspace_id.as_deref().filter(|v| is_json_shorthand(v)).map(str::to_owned);
|
||||
let workspace_id_arg = workspace_id.filter(|v| !is_json_shorthand(v));
|
||||
|
||||
let payload = parse_optional_json(
|
||||
json,
|
||||
workspace_id.clone().filter(|v| is_json_shorthand(v)),
|
||||
"environment create",
|
||||
)?;
|
||||
let payload = parse_optional_json(json, json_shorthand, "environment create")?;
|
||||
|
||||
if let Some(payload) = payload {
|
||||
if name.is_some() {
|
||||
@@ -103,10 +92,11 @@ fn create(
|
||||
validate_create_id(&payload, "environment")?;
|
||||
let mut environment: Environment = serde_json::from_value(payload)
|
||||
.map_err(|e| format!("Failed to parse environment create JSON: {e}"))?;
|
||||
|
||||
if environment.workspace_id.is_empty() {
|
||||
return Err("environment create JSON requires non-empty \"workspaceId\"".to_string());
|
||||
}
|
||||
merge_workspace_id_arg(
|
||||
workspace_id_arg.as_deref(),
|
||||
&mut environment.workspace_id,
|
||||
"environment create",
|
||||
)?;
|
||||
|
||||
if environment.parent_model.is_empty() {
|
||||
environment.parent_model = "environment".to_string();
|
||||
@@ -121,7 +111,7 @@ fn create(
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let workspace_id = workspace_id.ok_or_else(|| {
|
||||
let workspace_id = workspace_id_arg.ok_or_else(|| {
|
||||
"environment create requires workspace_id unless JSON payload is provided".to_string()
|
||||
})?;
|
||||
let name = name.ok_or_else(|| {
|
||||
|
||||
@@ -2,8 +2,8 @@ use crate::cli::{FolderArgs, FolderCommands};
|
||||
use crate::context::CliContext;
|
||||
use crate::utils::confirm::confirm_delete;
|
||||
use crate::utils::json::{
|
||||
apply_merge_patch, is_json_shorthand, parse_optional_json, parse_required_json, require_id,
|
||||
validate_create_id,
|
||||
apply_merge_patch, is_json_shorthand, merge_workspace_id_arg, parse_optional_json,
|
||||
parse_required_json, require_id, validate_create_id,
|
||||
};
|
||||
use yaak_models::models::Folder;
|
||||
use yaak_models::util::UpdateSource;
|
||||
@@ -58,15 +58,11 @@ fn create(
|
||||
name: Option<String>,
|
||||
json: Option<String>,
|
||||
) -> CommandResult {
|
||||
if json.is_some() && workspace_id.as_deref().is_some_and(|v| !is_json_shorthand(v)) {
|
||||
return Err("folder create cannot combine workspace_id with --json payload".to_string());
|
||||
}
|
||||
let json_shorthand =
|
||||
workspace_id.as_deref().filter(|v| is_json_shorthand(v)).map(str::to_owned);
|
||||
let workspace_id_arg = workspace_id.filter(|v| !is_json_shorthand(v));
|
||||
|
||||
let payload = parse_optional_json(
|
||||
json,
|
||||
workspace_id.clone().filter(|v| is_json_shorthand(v)),
|
||||
"folder create",
|
||||
)?;
|
||||
let payload = parse_optional_json(json, json_shorthand, "folder create")?;
|
||||
|
||||
if let Some(payload) = payload {
|
||||
if name.is_some() {
|
||||
@@ -74,12 +70,13 @@ fn create(
|
||||
}
|
||||
|
||||
validate_create_id(&payload, "folder")?;
|
||||
let folder: Folder = serde_json::from_value(payload)
|
||||
let mut folder: Folder = serde_json::from_value(payload)
|
||||
.map_err(|e| format!("Failed to parse folder create JSON: {e}"))?;
|
||||
|
||||
if folder.workspace_id.is_empty() {
|
||||
return Err("folder create JSON requires non-empty \"workspaceId\"".to_string());
|
||||
}
|
||||
merge_workspace_id_arg(
|
||||
workspace_id_arg.as_deref(),
|
||||
&mut folder.workspace_id,
|
||||
"folder create",
|
||||
)?;
|
||||
|
||||
let created = ctx
|
||||
.db()
|
||||
@@ -90,7 +87,7 @@ fn create(
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let workspace_id = workspace_id.ok_or_else(|| {
|
||||
let workspace_id = workspace_id_arg.ok_or_else(|| {
|
||||
"folder create requires workspace_id unless JSON payload is provided".to_string()
|
||||
})?;
|
||||
let name = name.ok_or_else(|| {
|
||||
|
||||
@@ -2,8 +2,8 @@ use crate::cli::{RequestArgs, RequestCommands, RequestSchemaType};
|
||||
use crate::context::CliContext;
|
||||
use crate::utils::confirm::confirm_delete;
|
||||
use crate::utils::json::{
|
||||
apply_merge_patch, is_json_shorthand, parse_optional_json, parse_required_json, require_id,
|
||||
validate_create_id,
|
||||
apply_merge_patch, is_json_shorthand, merge_workspace_id_arg, parse_optional_json,
|
||||
parse_required_json, require_id, validate_create_id,
|
||||
};
|
||||
use crate::utils::schema::append_agent_hints;
|
||||
use schemars::schema_for;
|
||||
@@ -11,8 +11,8 @@ use serde_json::{Map, Value, json};
|
||||
use std::collections::HashMap;
|
||||
use std::io::Write;
|
||||
use tokio::sync::mpsc;
|
||||
use yaak_http::sender::HttpResponseEvent as SenderHttpResponseEvent;
|
||||
use yaak::send::{SendHttpRequestByIdWithPluginsParams, send_http_request_by_id_with_plugins};
|
||||
use yaak_http::sender::HttpResponseEvent as SenderHttpResponseEvent;
|
||||
use yaak_models::models::{GrpcRequest, HttpRequest, WebsocketRequest};
|
||||
use yaak_models::queries::any_request::AnyRequest;
|
||||
use yaak_models::util::UpdateSource;
|
||||
@@ -336,15 +336,11 @@ fn create(
|
||||
url: Option<String>,
|
||||
json: Option<String>,
|
||||
) -> CommandResult {
|
||||
if json.is_some() && workspace_id.as_deref().is_some_and(|v| !is_json_shorthand(v)) {
|
||||
return Err("request create cannot combine workspace_id with --json payload".to_string());
|
||||
}
|
||||
let json_shorthand =
|
||||
workspace_id.as_deref().filter(|v| is_json_shorthand(v)).map(str::to_owned);
|
||||
let workspace_id_arg = workspace_id.filter(|v| !is_json_shorthand(v));
|
||||
|
||||
let payload = parse_optional_json(
|
||||
json,
|
||||
workspace_id.clone().filter(|v| is_json_shorthand(v)),
|
||||
"request create",
|
||||
)?;
|
||||
let payload = parse_optional_json(json, json_shorthand, "request create")?;
|
||||
|
||||
if let Some(payload) = payload {
|
||||
if name.is_some() || method.is_some() || url.is_some() {
|
||||
@@ -352,12 +348,13 @@ fn create(
|
||||
}
|
||||
|
||||
validate_create_id(&payload, "request")?;
|
||||
let request: HttpRequest = serde_json::from_value(payload)
|
||||
let mut request: HttpRequest = serde_json::from_value(payload)
|
||||
.map_err(|e| format!("Failed to parse request create JSON: {e}"))?;
|
||||
|
||||
if request.workspace_id.is_empty() {
|
||||
return Err("request create JSON requires non-empty \"workspaceId\"".to_string());
|
||||
}
|
||||
merge_workspace_id_arg(
|
||||
workspace_id_arg.as_deref(),
|
||||
&mut request.workspace_id,
|
||||
"request create",
|
||||
)?;
|
||||
|
||||
let created = ctx
|
||||
.db()
|
||||
@@ -368,7 +365,7 @@ fn create(
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let workspace_id = workspace_id.ok_or_else(|| {
|
||||
let workspace_id = workspace_id_arg.ok_or_else(|| {
|
||||
"request create requires workspace_id unless JSON payload is provided".to_string()
|
||||
})?;
|
||||
let name = name.unwrap_or_default();
|
||||
|
||||
@@ -63,6 +63,30 @@ pub fn validate_create_id(payload: &Value, context: &str) -> JsonResult<()> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn merge_workspace_id_arg(
|
||||
workspace_id_from_arg: Option<&str>,
|
||||
payload_workspace_id: &mut String,
|
||||
context: &str,
|
||||
) -> JsonResult<()> {
|
||||
if let Some(workspace_id_arg) = workspace_id_from_arg {
|
||||
if payload_workspace_id.is_empty() {
|
||||
*payload_workspace_id = workspace_id_arg.to_string();
|
||||
} else if payload_workspace_id != workspace_id_arg {
|
||||
return Err(format!(
|
||||
"{context} got conflicting workspace_id values between positional arg and JSON payload"
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
if payload_workspace_id.is_empty() {
|
||||
return Err(format!(
|
||||
"{context} requires non-empty \"workspaceId\" in JSON payload or positional workspace_id"
|
||||
));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn apply_merge_patch<T>(existing: &T, patch: &Value, id: &str, context: &str) -> JsonResult<T>
|
||||
where
|
||||
T: Serialize + DeserializeOwned,
|
||||
|
||||
Reference in New Issue
Block a user