diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 65cf402..3c62ca1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -340,9 +340,11 @@ jobs: # Create test target YAML file echo 'name: "test-web-server"' > test_target.yml echo 'targetType: "ssh"' >> test_target.yml - echo 'address: "192.168.1.100"' >> test_target.yml - echo 'username: "deploy"' >> test_target.yml - echo 'description: "Test web server"' >> test_target.yml + echo 'spec:' >> test_target.yml + echo ' address: "192.168.1.100"' >> test_target.yml + echo ' username: "deploy"' >> test_target.yml + echo 'metadata:' >> test_target.yml + echo ' description: "Test web server"' >> test_target.yml # Test target create echo "Testing: target create" diff --git a/src/client.rs b/src/client.rs index e5d003b..a453576 100644 --- a/src/client.rs +++ b/src/client.rs @@ -525,31 +525,19 @@ impl GodonClient { None => return ApiResponse::error("Missing required field: targetType"), }; - let address = match yaml_data.get("address").and_then(|v| v.as_str()) { - Some(a) => a.to_string(), - None => return ApiResponse::error("Missing required field: address"), + let spec = match yaml_data.get("spec") { + Some(s) => serde_json::to_value(s).unwrap_or_else(|_| serde_json::json!({})), + None => return ApiResponse::error("Missing required field: spec"), }; let mut target_data = serde_json::json!({ "name": name, "targetType": target_type, - "address": address + "spec": spec }); - if let Some(v) = yaml_data.get("username").and_then(|v| v.as_str()) { - target_data["username"] = serde_json::Value::String(v.to_string()); - } - if let Some(v) = yaml_data.get("credentialId").and_then(|v| v.as_str()) { - target_data["credentialId"] = serde_json::Value::String(v.to_string()); - } - if let Some(v) = yaml_data.get("credentialName").and_then(|v| v.as_str()) { - target_data["credentialName"] = serde_json::Value::String(v.to_string()); - } - if let Some(v) = yaml_data.get("description").and_then(|v| v.as_str()) { - target_data["description"] = serde_json::Value::String(v.to_string()); - } - if let Some(v) = yaml_data.get("allowsDowntime").and_then(|v| v.as_bool()) { - target_data["allowsDowntime"] = serde_json::Value::Bool(v); + if let Some(m) = yaml_data.get("metadata") { + target_data["metadata"] = serde_json::to_value(m).unwrap_or_else(|_| serde_json::json!({})); } self.create_target(target_data).await diff --git a/src/lib.rs b/src/lib.rs index 56e0e4c..6960986 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -59,15 +59,9 @@ pub struct Target { pub name: String, #[serde(rename = "targetType")] pub target_type: String, - pub address: String, - pub username: Option, - #[serde(rename = "credentialId")] - pub credential_id: Option, - #[serde(rename = "credentialName")] - pub credential_name: Option, - pub description: Option, - #[serde(rename = "allowsDowntime")] - pub allows_downtime: Option, + pub spec: serde_json::Value, + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata: Option, #[serde(rename = "createdAt")] pub created_at: Option, #[serde(rename = "lastUsedAt")] diff --git a/src/main.rs b/src/main.rs index d599936..73e9cc5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -279,11 +279,16 @@ fn format_credential_created(credential: &Credential) { fn format_target_list(targets: &[Target]) { println!("Targets:"); for target in targets { + let spec_summary = target + .spec + .get("address") + .or_else(|| target.spec.get("url")) + .and_then(|v| v.as_str()) + .unwrap_or("-"); println!(" ID: {}", target.id); println!(" Name: {}", target.name); println!(" Type: {}", target.target_type); - println!(" Address: {}", target.address); - println!(" Description: {}", target.description.as_deref().unwrap_or("")); + println!(" Spec: {}", spec_summary); println!(" Created: {}", target.created_at.as_deref().unwrap_or("")); println!(" ---"); } @@ -294,12 +299,10 @@ fn format_target(target: &Target) { println!(" ID: {}", target.id); println!(" Name: {}", target.name); println!(" Type: {}", target.target_type); - println!(" Address: {}", target.address); - println!(" Username: {}", target.username.as_deref().unwrap_or("")); - println!(" Credential ID: {}", target.credential_id.as_deref().unwrap_or("")); - println!(" Credential Name: {}", target.credential_name.as_deref().unwrap_or("")); - println!(" Description: {}", target.description.as_deref().unwrap_or("")); - println!(" Allows Downtime: {}", target.allows_downtime.map_or("N/A".to_string(), |v| v.to_string())); + println!(" Spec: {}", serde_json::to_string_pretty(&target.spec).unwrap_or_default()); + if let Some(ref metadata) = target.metadata { + println!(" Metadata: {}", serde_json::to_string_pretty(metadata).unwrap_or_default()); + } println!(" Created: {}", target.created_at.as_deref().unwrap_or("")); println!(" Last Used: {}", target.last_used_at.as_deref().unwrap_or("")); } @@ -309,7 +312,7 @@ fn format_target_created(target: &Target) { println!(" ID: {}", target.id); println!(" Name: {}", target.name); println!(" Type: {}", target.target_type); - println!(" Address: {}", target.address); + println!(" Spec: {}", serde_json::to_string_pretty(&target.spec).unwrap_or_default()); } #[tokio::main]