use crate::{protocol::limits::{GlobalLimitName, Limit, LimitScope, LimitSet}, config::Common};
use anyhow::{bail, Result};
use netidx::{
pack::Pack, pool::Pooled, protocol::value::Value,
utils::pack,
};
use netidx_protocols::{call_rpc, rpc::client::Proc};
pub struct OmsLimitsApi {
set_limits: Proc,
get_limits: Proc,
get_global_limits: Proc,
}
impl OmsLimitsApi {
pub async fn new(common: &Common) -> Result<Self> {
let base = common.paths.core_limit();
Ok(Self {
set_limits: Proc::new(&common.subscriber, base.append("set-limits")).await?,
get_limits: Proc::new(&common.subscriber, base.append("get-limits")).await?,
get_global_limits: Proc::new(&common.subscriber, base.append("get-global-limits")).await?,
})
}
pub async fn set_limits(&self, limits: &Pooled<Vec<Limit>>) -> Result<()> {
let limits = Value::Bytes(pack(limits)?.freeze());
let res = call_rpc!(&self.set_limits, limits: limits).await?;
match res {
Value::Error(e) => bail!(e.to_string()),
Value::Ok => Ok(()),
_ => bail!("unexpected response"),
}
}
pub async fn get_limits(
&self,
query: &Pooled<Vec<(LimitSet, LimitScope)>>,
) -> Result<Pooled<Vec<Limit>>> {
let query = Value::Bytes(pack(query)?.freeze());
let res = call_rpc!(&self.get_limits, query: query).await?;
match res {
Value::Error(e) => bail!(e.to_string()),
Value::Bytes(b) => Ok(Pack::decode(&mut &*b)?),
_ => bail!("unexpected response"),
}
}
pub async fn get_global_limits(
&self,
query: &Pooled<Vec<GlobalLimitName>>,
) -> Result<Pooled<Vec<Limit>>> {
let query = Value::Bytes(pack(query)?.freeze());
let res = call_rpc!(&self.get_global_limits, query: query).await?;
match res {
Value::Error(e) => bail!(e.to_string()),
Value::Bytes(b) => Ok(Pack::decode(&mut &*b)?),
_ => bail!("unexpected response"),
}
}
}