trustchain_core/
issuer.rs1use crate::key_manager::KeyManagerError;
3use crate::resolver::TrustchainResolver;
4use crate::subject::Subject;
5use async_trait::async_trait;
6use ssi::jsonld::ContextLoader;
7use ssi::vc::{Credential, LinkedDataProofOptions};
8use thiserror::Error;
9
10#[derive(Error, Debug)]
12pub enum IssuerError {
13 #[error("A wrapped variant for an SSI VC error: {0}")]
15 VC(ssi::vc::Error),
16 #[error("A wrapped variant for an SSI LDP error: {0}")]
18 LDP(ssi::ldp::Error),
19 #[error("A wrapped variant for a key manager error: {0}")]
21 KeyManager(KeyManagerError),
22}
23
24impl From<ssi::vc::Error> for IssuerError {
25 fn from(err: ssi::vc::Error) -> Self {
26 IssuerError::VC(err)
27 }
28}
29
30impl From<ssi::ldp::Error> for IssuerError {
31 fn from(err: ssi::ldp::Error) -> Self {
32 IssuerError::LDP(err)
33 }
34}
35
36impl From<KeyManagerError> for IssuerError {
37 fn from(err: KeyManagerError) -> Self {
38 IssuerError::KeyManager(err)
39 }
40}
41
42#[async_trait]
44pub trait Issuer: Subject {
45 async fn sign(
47 &self,
48 credential: &Credential,
49 linked_data_proof_options: Option<LinkedDataProofOptions>,
50 key_id: Option<&str>,
51 resolver: &dyn TrustchainResolver,
52 context_loader: &mut ContextLoader,
53 ) -> Result<Credential, IssuerError>;
54}