use std::collections::HashMap;
use serde_json::Value;
use super::VtaClient;
use crate::did_templates::{DidTemplate, DidTemplateRecord};
use crate::error::VtaError;
use crate::protocols::did_template_management as proto;
use crate::trust_tasks;
fn create_uri(template: &DidTemplate) -> &'static str {
if template.schema_version >= 2 {
trust_tasks::TASK_DID_TEMPLATES_CREATE_3_0
} else {
trust_tasks::TASK_DID_TEMPLATES_CREATE_2_0
}
}
fn update_uri(template: &DidTemplate) -> &'static str {
if template.schema_version >= 2 {
trust_tasks::TASK_DID_TEMPLATES_UPDATE_3_0
} else {
trust_tasks::TASK_DID_TEMPLATES_UPDATE_2_0
}
}
impl VtaClient {
pub async fn list_did_templates(&self) -> Result<Vec<DidTemplateRecord>, VtaError> {
let resp: proto::list::ListDidTemplatesResultBody = self
.rpc_tt(
trust_tasks::TASK_DID_TEMPLATES_LIST_3_0,
serde_json::to_value(proto::list::ListDidTemplatesBody { context_id: None })?,
30,
)
.await?;
Ok(resp.templates)
}
pub async fn get_did_template(&self, name: &str) -> Result<DidTemplateRecord, VtaError> {
self.rpc_tt(
trust_tasks::TASK_DID_TEMPLATES_GET_3_0,
serde_json::to_value(proto::get::GetDidTemplateBody {
context_id: None,
name: name.to_string(),
})?,
30,
)
.await
}
pub async fn create_did_template(
&self,
template: DidTemplate,
) -> Result<DidTemplateRecord, VtaError> {
let payload = serde_json::to_value(proto::create::CreateDidTemplateBody {
context_id: None,
template: template.clone(),
})?;
self.rpc_tt(create_uri(&template), payload, 30).await
}
pub async fn update_did_template(
&self,
name: &str,
template: DidTemplate,
) -> Result<DidTemplateRecord, VtaError> {
let payload = serde_json::to_value(proto::update::UpdateDidTemplateBody {
context_id: None,
name: name.to_string(),
template: template.clone(),
})?;
self.rpc_tt(update_uri(&template), payload, 30).await
}
pub async fn delete_did_template(&self, name: &str) -> Result<(), VtaError> {
self.rpc_tt_void(
trust_tasks::TASK_DID_TEMPLATES_DELETE_2_0,
serde_json::to_value(proto::delete::DeleteDidTemplateBody {
context_id: None,
name: name.to_string(),
})?,
30,
)
.await
}
pub async fn render_did_template(
&self,
name: &str,
vars: HashMap<String, Value>,
) -> Result<Value, VtaError> {
let payload = serde_json::to_value(proto::render::RenderDidTemplateBody {
context_id: None,
name: name.to_string(),
vars: vars.clone(),
})?;
let resp: proto::render::RenderDidTemplateResultBody = self
.rpc_tt(trust_tasks::TASK_DID_TEMPLATES_RENDER_2_0, payload, 30)
.await?;
Ok(resp.document)
}
pub async fn list_context_did_templates(
&self,
context_id: &str,
) -> Result<Vec<DidTemplateRecord>, VtaError> {
let resp: proto::list::ListDidTemplatesResultBody = self
.rpc_tt(
trust_tasks::TASK_DID_TEMPLATES_LIST_3_0,
serde_json::to_value(proto::list::ListDidTemplatesBody {
context_id: Some(context_id.to_string()),
})?,
30,
)
.await?;
Ok(resp.templates)
}
pub async fn get_context_did_template(
&self,
context_id: &str,
name: &str,
) -> Result<DidTemplateRecord, VtaError> {
self.rpc_tt(
trust_tasks::TASK_DID_TEMPLATES_GET_3_0,
serde_json::to_value(proto::get::GetDidTemplateBody {
context_id: Some(context_id.to_string()),
name: name.to_string(),
})?,
30,
)
.await
}
pub async fn create_context_did_template(
&self,
context_id: &str,
template: DidTemplate,
) -> Result<DidTemplateRecord, VtaError> {
let payload = serde_json::to_value(proto::create::CreateDidTemplateBody {
context_id: Some(context_id.to_string()),
template: template.clone(),
})?;
self.rpc_tt(create_uri(&template), payload, 30).await
}
pub async fn update_context_did_template(
&self,
context_id: &str,
name: &str,
template: DidTemplate,
) -> Result<DidTemplateRecord, VtaError> {
let payload = serde_json::to_value(proto::update::UpdateDidTemplateBody {
context_id: Some(context_id.to_string()),
name: name.to_string(),
template: template.clone(),
})?;
self.rpc_tt(update_uri(&template), payload, 30).await
}
pub async fn delete_context_did_template(
&self,
context_id: &str,
name: &str,
) -> Result<(), VtaError> {
self.rpc_tt_void(
trust_tasks::TASK_DID_TEMPLATES_DELETE_2_0,
serde_json::to_value(proto::delete::DeleteDidTemplateBody {
context_id: Some(context_id.to_string()),
name: name.to_string(),
})?,
30,
)
.await
}
pub async fn render_context_did_template(
&self,
context_id: &str,
name: &str,
vars: HashMap<String, Value>,
) -> Result<Value, VtaError> {
let payload = serde_json::to_value(proto::render::RenderDidTemplateBody {
context_id: Some(context_id.to_string()),
name: name.to_string(),
vars: vars.clone(),
})?;
let resp: proto::render::RenderDidTemplateResultBody = self
.rpc_tt(trust_tasks::TASK_DID_TEMPLATES_RENDER_2_0, payload, 30)
.await?;
Ok(resp.document)
}
}