use super::common::ensure_engine;
use crate::config::TuiConfig;
pub async fn run_jurisdiction_command(
action: &crate::cli::JurisdictionAction,
config: &TuiConfig,
) -> i32 {
match action {
crate::cli::JurisdictionAction::List { json } => run_jurisdiction_list(*json, config).await,
crate::cli::JurisdictionAction::Show { code, json } => {
run_jurisdiction_show(code, *json, config).await
}
}
}
async fn run_jurisdiction_list(json_output: bool, config: &TuiConfig) -> i32 {
let client = match ensure_engine(config).await {
Ok(c) => c,
Err(code) => return code,
};
match client.get_json("/jurisdictions").await {
Ok(result) => {
if let Some(err) = result.get("error") {
eprintln!("Error: {err}");
return 1;
}
if json_output {
println!(
"{}",
serde_json::to_string_pretty(&result).unwrap_or_default()
);
} else if let Some(jurisdictions) =
result.get("jurisdictions").and_then(|v| v.as_array())
{
println!(
"EU/EEA AI Act Jurisdictions ({} countries)\n",
jurisdictions.len()
);
println!(
"{:<6} {:<20} {:<50}",
"Code", "Country", "Market Surveillance Authority"
);
println!("{}", "-".repeat(76));
for j in jurisdictions {
let code = j.get("country_code").and_then(|v| v.as_str()).unwrap_or("");
let name = j.get("country_name").and_then(|v| v.as_str()).unwrap_or("");
let msa = j.get("msa_name").and_then(|v| v.as_str()).unwrap_or("");
println!("{code:<6} {name:<20} {msa:<50}");
}
}
0
}
Err(e) => {
eprintln!("Error: {e}");
1
}
}
}
async fn run_jurisdiction_show(code: &str, json_output: bool, config: &TuiConfig) -> i32 {
let client = match ensure_engine(config).await {
Ok(c) => c,
Err(code) => return code,
};
let url = format!("/jurisdictions/{}", code.to_lowercase());
match client.get_json(&url).await {
Ok(result) => {
if let Some(err) = result.get("error") {
eprintln!("Error: {err}");
return 1;
}
if json_output {
println!(
"{}",
serde_json::to_string_pretty(&result).unwrap_or_default()
);
} else {
let name = result
.get("country_name")
.and_then(|v| v.as_str())
.unwrap_or("Unknown");
let msa = result
.get("msa_name")
.and_then(|v| v.as_str())
.unwrap_or("");
let msa_url = result.get("msa_url").and_then(|v| v.as_str()).unwrap_or("");
let contact = result
.get("msa_contact")
.and_then(|v| v.as_str())
.unwrap_or("");
let enforcement = result
.get("enforcement_date")
.and_then(|v| v.as_str())
.unwrap_or("");
let lang = result
.get("language")
.and_then(|v| v.as_str())
.unwrap_or("");
println!("{} ({})", name, code.to_uppercase());
println!();
println!("Market Surveillance Authority:");
println!(" Name: {msa}");
println!(" URL: {msa_url}");
println!(" Contact: {contact}");
println!();
println!("Enforcement: {enforcement}");
println!("Language: {lang}");
if let Some(reqs) = result.get("local_requirements").and_then(|v| v.as_array()) {
println!();
println!("Local Requirements:");
for req in reqs {
if let Some(r) = req.as_str() {
println!(" - {r}");
}
}
}
if let Some(notes) = result.get("notes").and_then(|v| v.as_str())
&& !notes.is_empty()
{
println!();
println!("Notes: {notes}");
}
}
0
}
Err(e) => {
eprintln!("Error: {e}");
1
}
}
}