use crate::config::{lookup::ConfigLookup, ConfigValues};
use crate::{cli_state, HexByteVec};
use ockam_core::Result;
use ockam_identity::{IdentityIdentifier, IdentityVault, PublicIdentity};
use ockam_multiaddr::MultiAddr;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::path::PathBuf;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct OckamConfig {
#[serde(skip)]
pub dir: Option<PathBuf>,
#[serde(default = "default_lookup")]
pub lookup: ConfigLookup,
}
fn default_lookup() -> ConfigLookup {
ConfigLookup::default()
}
impl ConfigValues for OckamConfig {
fn default_values() -> Self {
Self {
dir: Some(Self::dir()),
lookup: default_lookup(),
}
}
}
impl OckamConfig {
pub fn dir() -> PathBuf {
cli_state::CliState::dir().unwrap()
}
pub fn lookup(&self) -> &ConfigLookup {
&self.lookup
}
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct AuthoritiesConfig {
authorities: BTreeMap<IdentityIdentifier, Authority>,
}
impl AuthoritiesConfig {
pub fn add_authority(&mut self, i: IdentityIdentifier, a: Authority) {
self.authorities.insert(i, a);
}
pub fn authorities(&self) -> impl Iterator<Item = (&IdentityIdentifier, &Authority)> {
self.authorities.iter()
}
pub async fn to_public_identities<V>(&self, vault: &V) -> Result<Vec<PublicIdentity>>
where
V: IdentityVault,
{
let mut v = Vec::new();
for a in self.authorities.values() {
v.push(PublicIdentity::import(a.identity.as_slice(), vault).await?)
}
Ok(v)
}
}
impl ConfigValues for AuthoritiesConfig {
fn default_values() -> Self {
Self::default()
}
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct Authority {
identity: HexByteVec,
access: MultiAddr,
}
impl Authority {
pub fn new(identity: Vec<u8>, addr: MultiAddr) -> Self {
Self {
identity: identity.into(),
access: addr,
}
}
pub fn identity(&self) -> &[u8] {
self.identity.as_slice()
}
pub fn access_route(&self) -> &MultiAddr {
&self.access
}
}