use std::fmt::Debug;
use http_uri::invariant::AbsoluteHttpUri;
use serde::Serialize;
use webid::WebId;
pub mod impl_;
pub trait AgentCredentials: Debug + Clone + Send + Sync + 'static {
fn webid(&self) -> &WebId;
}
pub type ClientId = String;
pub trait ClientCredentials: Debug + Clone + Send + Sync + 'static {
fn client_id(&self) -> &ClientId;
fn client_web_id(&self) -> Option<&WebId>;
}
pub trait IssuerCredentials: Debug + Clone + Send + Sync + 'static {
fn uri(&self) -> &AbsoluteHttpUri;
}
pub trait RequestCredentials: Debug + Default + Clone + Send + Sync + 'static + Serialize {
type AgentCredentials: AgentCredentials;
type ClientCredentials: ClientCredentials;
type IssuerCredentials: IssuerCredentials;
fn of_agent(&self) -> Option<&Self::AgentCredentials>;
fn of_client(&self) -> Option<&Self::ClientCredentials>;
fn of_issuer(&self) -> Option<&Self::IssuerCredentials>;
}
#[cfg(feature = "creds-context")]
pub use to_context_def::ToContext;
#[cfg(feature = "creds-context")]
mod to_context_def {
use std::ops::Deref;
use acp::model::context::{DContext, HContext};
use rdf_utils::model::{
description::{DescriptionExt, SimpleDescription},
graph::InfallibleMutableGraph,
term::ArcTerm,
};
use rdf_vocabularies::ns;
use super::RequestCredentials;
use crate::common::credentials::{AgentCredentials, ClientCredentials, IssuerCredentials};
pub trait ToContext: RequestCredentials {
fn to_context<G: InfallibleMutableGraph + Default>(
&self,
h_context: HContext<ArcTerm>,
) -> DContext<G, G> {
let mut context = DContext::new(h_context, G::default());
if let Some(agent_creds) = self.of_agent() {
context.add(&ns::acp::agent, agent_creds.webid());
context.add(&ns::acl::agent, agent_creds.webid());
}
if let Some(client_web_id) = self
.of_client()
.and_then(|of_client| of_client.client_web_id())
{
context.add(&ns::acp::client, client_web_id);
}
if let Some(issuer_creds) = self.of_issuer() {
context.add(&ns::acp::issuer, issuer_creds.uri().deref());
}
context
}
}
}