use failure::format_err;
use kubos_system::Config as ServiceConfig;
use std::time::Duration;
type AppResult<T> = Result<T, failure::Error>;
pub fn query(
config: &ServiceConfig,
query: &str,
timeout: Option<Duration>,
) -> AppResult<serde_json::Value> {
let client = match timeout {
Some(time) => reqwest::Client::builder().timeout(time).build()?,
None => reqwest::Client::builder().build()?,
};
let uri = format!(
"http://{}",
config
.hosturl()
.ok_or_else(|| format_err!("Unable to fetch addr for service"))?
);
let mut map = ::std::collections::HashMap::new();
map.insert("query", query);
let response: serde_json::Value = client.post(&uri).json(&map).send()?.json()?;
if let Some(errs) = response.get("errors") {
if errs.is_string() {
let errs_str = errs.as_str().unwrap();
if !errs_str.is_empty() {
return Err(format_err!("{}", errs_str.to_string()));
}
} else if !errs.is_null() {
match errs.get("message") {
Some(message) => {
return Err(format_err!("{}", message.as_str().unwrap().to_string()));
}
None => {
return Err(format_err!("{}", serde_json::to_string(errs).unwrap()));
}
}
}
}
match response.get(0) {
Some(err) if err.get("message").is_some() => {
return Err(format_err!(
"{}",
err["message"].as_str().unwrap().to_string(),
));
}
_ => {}
}
match response.get("data") {
Some(result) => Ok(result.clone()),
None => Err(format_err!(
"No result returned in 'data' key: {}",
serde_json::to_string(&response).unwrap()
)),
}
}