Skip to content

Commit fe99f2b

Browse files
authored
Merge pull request #28 from godon-dev/target_schema_spec
feat: target schema rework - spec JSONB for type-specific fields
2 parents 0d7c7e4 + f4db45e commit fe99f2b

File tree

4 files changed

+26
-39
lines changed

4 files changed

+26
-39
lines changed

.github/workflows/ci.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -340,9 +340,11 @@ jobs:
340340
# Create test target YAML file
341341
echo 'name: "test-web-server"' > test_target.yml
342342
echo 'targetType: "ssh"' >> test_target.yml
343-
echo 'address: "192.168.1.100"' >> test_target.yml
344-
echo 'username: "deploy"' >> test_target.yml
345-
echo 'description: "Test web server"' >> test_target.yml
343+
echo 'spec:' >> test_target.yml
344+
echo ' address: "192.168.1.100"' >> test_target.yml
345+
echo ' username: "deploy"' >> test_target.yml
346+
echo 'metadata:' >> test_target.yml
347+
echo ' description: "Test web server"' >> test_target.yml
346348
347349
# Test target create
348350
echo "Testing: target create"

src/client.rs

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -525,31 +525,19 @@ impl GodonClient {
525525
None => return ApiResponse::error("Missing required field: targetType"),
526526
};
527527

528-
let address = match yaml_data.get("address").and_then(|v| v.as_str()) {
529-
Some(a) => a.to_string(),
530-
None => return ApiResponse::error("Missing required field: address"),
528+
let spec = match yaml_data.get("spec") {
529+
Some(s) => serde_json::to_value(s).unwrap_or_else(|_| serde_json::json!({})),
530+
None => return ApiResponse::error("Missing required field: spec"),
531531
};
532532

533533
let mut target_data = serde_json::json!({
534534
"name": name,
535535
"targetType": target_type,
536-
"address": address
536+
"spec": spec
537537
});
538538

539-
if let Some(v) = yaml_data.get("username").and_then(|v| v.as_str()) {
540-
target_data["username"] = serde_json::Value::String(v.to_string());
541-
}
542-
if let Some(v) = yaml_data.get("credentialId").and_then(|v| v.as_str()) {
543-
target_data["credentialId"] = serde_json::Value::String(v.to_string());
544-
}
545-
if let Some(v) = yaml_data.get("credentialName").and_then(|v| v.as_str()) {
546-
target_data["credentialName"] = serde_json::Value::String(v.to_string());
547-
}
548-
if let Some(v) = yaml_data.get("description").and_then(|v| v.as_str()) {
549-
target_data["description"] = serde_json::Value::String(v.to_string());
550-
}
551-
if let Some(v) = yaml_data.get("allowsDowntime").and_then(|v| v.as_bool()) {
552-
target_data["allowsDowntime"] = serde_json::Value::Bool(v);
539+
if let Some(m) = yaml_data.get("metadata") {
540+
target_data["metadata"] = serde_json::to_value(m).unwrap_or_else(|_| serde_json::json!({}));
553541
}
554542

555543
self.create_target(target_data).await

src/lib.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,9 @@ pub struct Target {
5959
pub name: String,
6060
#[serde(rename = "targetType")]
6161
pub target_type: String,
62-
pub address: String,
63-
pub username: Option<String>,
64-
#[serde(rename = "credentialId")]
65-
pub credential_id: Option<String>,
66-
#[serde(rename = "credentialName")]
67-
pub credential_name: Option<String>,
68-
pub description: Option<String>,
69-
#[serde(rename = "allowsDowntime")]
70-
pub allows_downtime: Option<bool>,
62+
pub spec: serde_json::Value,
63+
#[serde(skip_serializing_if = "Option::is_none")]
64+
pub metadata: Option<serde_json::Value>,
7165
#[serde(rename = "createdAt")]
7266
pub created_at: Option<String>,
7367
#[serde(rename = "lastUsedAt")]

src/main.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -279,11 +279,16 @@ fn format_credential_created(credential: &Credential) {
279279
fn format_target_list(targets: &[Target]) {
280280
println!("Targets:");
281281
for target in targets {
282+
let spec_summary = target
283+
.spec
284+
.get("address")
285+
.or_else(|| target.spec.get("url"))
286+
.and_then(|v| v.as_str())
287+
.unwrap_or("-");
282288
println!(" ID: {}", target.id);
283289
println!(" Name: {}", target.name);
284290
println!(" Type: {}", target.target_type);
285-
println!(" Address: {}", target.address);
286-
println!(" Description: {}", target.description.as_deref().unwrap_or(""));
291+
println!(" Spec: {}", spec_summary);
287292
println!(" Created: {}", target.created_at.as_deref().unwrap_or(""));
288293
println!(" ---");
289294
}
@@ -294,12 +299,10 @@ fn format_target(target: &Target) {
294299
println!(" ID: {}", target.id);
295300
println!(" Name: {}", target.name);
296301
println!(" Type: {}", target.target_type);
297-
println!(" Address: {}", target.address);
298-
println!(" Username: {}", target.username.as_deref().unwrap_or(""));
299-
println!(" Credential ID: {}", target.credential_id.as_deref().unwrap_or(""));
300-
println!(" Credential Name: {}", target.credential_name.as_deref().unwrap_or(""));
301-
println!(" Description: {}", target.description.as_deref().unwrap_or(""));
302-
println!(" Allows Downtime: {}", target.allows_downtime.map_or("N/A".to_string(), |v| v.to_string()));
302+
println!(" Spec: {}", serde_json::to_string_pretty(&target.spec).unwrap_or_default());
303+
if let Some(ref metadata) = target.metadata {
304+
println!(" Metadata: {}", serde_json::to_string_pretty(metadata).unwrap_or_default());
305+
}
303306
println!(" Created: {}", target.created_at.as_deref().unwrap_or(""));
304307
println!(" Last Used: {}", target.last_used_at.as_deref().unwrap_or(""));
305308
}
@@ -309,7 +312,7 @@ fn format_target_created(target: &Target) {
309312
println!(" ID: {}", target.id);
310313
println!(" Name: {}", target.name);
311314
println!(" Type: {}", target.target_type);
312-
println!(" Address: {}", target.address);
315+
println!(" Spec: {}", serde_json::to_string_pretty(&target.spec).unwrap_or_default());
313316
}
314317

315318
#[tokio::main]

0 commit comments

Comments
 (0)