use napi::Result;
use napi_derive::napi;
#[napi(object)]
pub struct NodeClientConfig {
pub api_key: String,
pub server_url: String,
}
#[napi(object)]
pub struct NodeClientInfo {
pub client_id: String,
pub permissions: Vec<String>,
pub rate_limit_rps: Option<u32>,
}
#[napi]
pub fn has_permission(info: NodeClientInfo, permission: String) -> bool {
info.permissions.iter().any(|p| p == &permission)
}
#[napi]
pub fn parse_validation_response(json: String) -> Result<NodeClientInfo> {
let parsed: serde_json::Value = serde_json::from_str(&json)
.map_err(|e| napi::Error::from_reason(format!("Invalid JSON: {}", e)))?;
let valid = parsed["valid"].as_bool().unwrap_or(false);
if !valid {
return Err(napi::Error::from_reason(
"Validation response indicates invalid key",
));
}
let client = &parsed["client"];
let client_id = client["client_id"]
.as_str()
.ok_or_else(|| napi::Error::from_reason("Missing client.client_id"))?
.to_string();
let permissions = client["permissions"]
.as_array()
.ok_or_else(|| napi::Error::from_reason("Missing client.permissions"))?
.iter()
.filter_map(|v| v.as_str().map(String::from))
.collect();
let rate_limit_rps = client["rate_limit_rps"].as_u64().map(|v| v as u32);
Ok(NodeClientInfo {
client_id,
permissions,
rate_limit_rps,
})
}