use serde_json::Value;
use super::{OrchestratorBackend, required_str};
pub async fn try_dispatch<B: OrchestratorBackend>(
backend: &B,
name: &str,
args: &Value,
) -> Option<Result<Value, String>> {
let result = match name {
"project_list" => backend.project_list().await,
"project_register" => project_register(backend, args).await,
"project_get" => match required_str(args, "name") {
Ok(n) => backend.project_get(&n).await,
Err(e) => Err(e),
},
"project_resolve" => match required_str(args, "query") {
Ok(q) => backend.project_resolve(&q).await,
Err(e) => Err(e),
},
_ => return None,
};
Some(result)
}
async fn project_register<B: OrchestratorBackend>(
backend: &B,
args: &Value,
) -> Result<Value, String> {
let name = required_str(args, "name")?;
let repo_url = required_str(args, "repo_url")?;
let default_branch = args.get("default_branch").and_then(Value::as_str);
let stack_hint = args.get("stack_hint").and_then(Value::as_str);
let tags: Option<Vec<String>> = args.get("tags").and_then(Value::as_array).map(|arr| {
arr.iter()
.filter_map(Value::as_str)
.map(str::to_string)
.collect()
});
let description = args.get("description").and_then(Value::as_str);
let gh_user = args.get("gh_user").and_then(Value::as_str);
let gh_account = args.get("gh_account").and_then(Value::as_str);
backend
.project_register(
&name,
&repo_url,
default_branch,
stack_hint,
tags,
description,
gh_user,
gh_account,
)
.await
}