use std::sync::Arc;
use toolkit_contract::policy::{PolicyStack, TracingPolicy};
use toolkit_contract::wiring::ClientWiring;
use crate::context::GearCtx;
pub fn read_wiring(ctx: &GearCtx, key: &str) -> anyhow::Result<ClientWiring> {
let raw = ctx.raw_config();
let Some(section) = raw.get("client_wiring") else {
return Ok(ClientWiring::Local);
};
let Some(per_contract) = section.get(key) else {
return Ok(ClientWiring::Local);
};
serde_json::from_value::<ClientWiring>(per_contract.clone()).map_err(|e| {
anyhow::anyhow!(
"gear `{gear}`: invalid client_wiring.{key}: {e}",
gear = ctx.gear_name()
)
})
}
#[must_use]
pub fn default_policy_stack() -> Arc<PolicyStack> {
let mut s = PolicyStack::new();
s.push(Arc::new(TracingPolicy));
Arc::new(s)
}
#[must_use]
pub fn policy_stack_from(
policies: Vec<Arc<dyn toolkit_contract::policy::Policy>>,
) -> Arc<PolicyStack> {
let mut s = PolicyStack::new();
for p in policies {
s.push(p);
}
Arc::new(s)
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
#[path = "wiring_tests.rs"]
mod tests;