use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
fn is_false(v: &bool) -> bool {
!(*v)
}
fn is_empty_string(s: &str) -> bool {
s.is_empty()
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionStep {
#[serde(alias = "id")]
pub id: String,
#[serde(rename = "type", alias = "step_type")]
pub step_type: String,
#[serde(alias = "name")]
pub name: String,
#[serde(default, skip_serializing_if = "is_false", alias = "take_screenshot")]
pub take_screenshot: bool,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "screenshot_delay"
)]
pub screenshot_delay: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "playwright_script_id"
)]
pub playwright_script_id: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "playwright_script_content"
)]
pub playwright_script_content: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "playwright_target_url"
)]
pub playwright_target_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "prompt_id")]
pub prompt_id: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "prompt_content"
)]
pub prompt_content: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "action_type"
)]
pub action_type: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "target_image_id"
)]
pub target_image_id: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "target_image_name"
)]
pub target_image_name: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "screenshot_monitor"
)]
pub screenshot_monitor: Option<serde_json::Value>,
}
fn default_auto_include_contexts() -> bool {
true
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct AiWorkflow {
#[serde(alias = "id")]
pub id: String,
#[serde(alias = "name")]
pub name: String,
#[serde(
default,
skip_serializing_if = "is_empty_string",
alias = "description"
)]
pub description: String,
#[serde(default, skip_serializing_if = "Vec::is_empty", alias = "steps")]
pub steps: Vec<ExecutionStep>,
#[serde(default, skip_serializing_if = "is_empty_string", alias = "goal")]
pub goal: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "max_iterations"
)]
pub max_iterations: Option<u32>,
#[serde(
default,
skip_serializing_if = "is_false",
alias = "capture_input_validation"
)]
pub capture_input_validation: bool,
#[serde(default, skip_serializing_if = "is_empty_string", alias = "category")]
pub category: String,
#[serde(default, skip_serializing_if = "Vec::is_empty", alias = "tags")]
pub tags: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty", alias = "context_ids")]
pub context_ids: Vec<String>,
#[serde(
default,
skip_serializing_if = "Vec::is_empty",
alias = "disabled_context_ids"
)]
pub disabled_context_ids: Vec<String>,
#[serde(
default = "default_auto_include_contexts",
alias = "auto_include_contexts"
)]
pub auto_include_contexts: bool,
#[serde(alias = "created_at")]
pub created_at: String,
#[serde(alias = "modified_at")]
pub modified_at: String,
}