use crate::didcomm::{Attachment, AttachmentData, JsonAttachmentData, PlainMessage};
use crate::error::Result;
use crate::message::{
Authorize, DIDCommPresentation, Party, Reject, Settle, TapMessageBody, Transfer,
};
use serde_json::json;
use std::collections::HashMap;
use std::str::FromStr;
use tap_caip::AssetId;
pub fn create_transfer_message_example() -> Result<PlainMessage> {
let originator = Party::new("did:example:alice");
let beneficiary = Party::new("did:example:bob");
let transfer_body = Transfer::builder()
.asset(AssetId::from_str("eip155:1/erc20:0x123456789abcdef").unwrap())
.originator(originator)
.beneficiary(beneficiary)
.amount("10.00".to_string())
.transaction_id(uuid::Uuid::new_v4().to_string())
.build();
let message =
transfer_body.to_didcomm("did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK")?;
Ok(message)
}
pub fn process_transfer_message_example(message: &PlainMessage) -> Result<()> {
if message.type_.contains("transfer") {
println!(
"Received message is a TAP message of type: {}",
message.type_
);
let transfer = Transfer::from_didcomm(message)?;
println!("Transfer amount: {}", transfer.amount);
println!("Asset: {:?}", transfer.asset);
if let Some(ref beneficiary) = transfer.beneficiary {
println!("Beneficiary: {}", beneficiary.id);
}
println!("Originator: {}", transfer.originator.id);
} else {
println!("Not a transfer message");
}
Ok(())
}
pub fn create_reject_message_example(transaction_id: &str) -> Result<PlainMessage> {
let reject_body = Reject {
transaction_id: transaction_id.to_string(),
reason: "COMPLIANCE_FAILURE: Unable to comply with transfer requirements. Further documentation needed.".to_string(),
};
let message =
reject_body.to_didcomm("did:key:z6MkmRsjkKHNrBiVz5mhiqhJVYf9E9mxg3MVGqgqMkRwCJd6")?;
Ok(message)
}
pub fn create_settle_message_example(transaction_id: &str) -> Result<PlainMessage> {
let settle_body = Settle {
transaction_id: transaction_id.to_string(),
settlement_id: "0x123456789abcdef".to_string(),
amount: Some("100.0".to_string()),
};
let message =
settle_body.to_didcomm("did:key:z6MkmRsjkKHNrBiVz5mhiqhJVYf9E9mxg3MVGqgqMkRwCJd6")?;
Ok(message)
}
pub fn create_presentation_with_attachments_example() -> Result<PlainMessage> {
let attachment = Attachment {
id: Some("test-attachment-id".to_string()),
media_type: Some("application/json".to_string()),
data: AttachmentData::Json {
value: JsonAttachmentData {
json: json!({
"@context": ["https://www.w3.org/2018/credentials/v1"],
"type": ["VerifiablePresentation"],
"verifiableCredential": [{
"@context": ["https://www.w3.org/2018/credentials/v1"],
"id": "https://example.com/credentials/1234",
"type": ["VerifiableCredential"],
"issuer": "did:example:issuer",
"issuanceDate": "2023-01-01T12:00:00Z",
"credentialSubject": {
"id": "did:example:subject",
"name": "Test User"
}
}]
}),
jws: None,
},
},
description: Some("Verifiable Presentation".to_string()),
filename: None,
format: Some("dif/presentation-exchange/submission@v1.0".to_string()),
lastmod_time: None,
byte_count: None,
};
let presentation = DIDCommPresentation {
id: uuid::Uuid::new_v4().to_string(),
formats: vec!["dif/presentation-exchange/submission@v1.0".to_string()],
attachments: vec![attachment],
thid: Some("test-thread-id".to_string()),
};
let message = presentation.to_didcomm("did:example:sender")?;
Ok(message)
}
pub fn process_any_tap_message_example(message: &PlainMessage) -> Result<()> {
let type_str = &message.type_;
match () {
_ if type_str.contains("transfer") => {
let transfer = Transfer::from_didcomm(message)?;
println!("Processing Transfer: {}", transfer.amount);
}
_ if type_str.contains("authorize") => {
let authorize = Authorize::from_didcomm(message)?;
println!(
"Processing Authorization for transfer: {}",
authorize.transaction_id
);
}
_ if type_str.contains("reject") => {
let reject = Reject::from_didcomm(message)?;
println!(
"Processing Rejection for transfer: {}",
reject.transaction_id
);
println!("Reason: {}", reject.reason);
}
_ if type_str.contains("settle") => {
let settle = Settle::from_didcomm(message)?;
println!(
"Processing Settlement for transfer: {}",
settle.transaction_id
);
println!("Settlement ID: {}", settle.settlement_id);
println!("Amount: {}", settle.amount.unwrap_or_default());
}
_ if type_str.contains("presentation") => {
let presentation = DIDCommPresentation::from_didcomm(message)?;
println!(
"Processing Presentation with {} attachments",
presentation.attachments.len()
);
for (i, attachment) in presentation.attachments.iter().enumerate() {
println!(
"Attachment {}: Format: {}",
i,
attachment.format.as_ref().unwrap_or(&"unknown".to_string())
);
match &attachment.data {
AttachmentData::Json { value } => {
println!(" JSON data: {}", value.json);
}
AttachmentData::Base64 { value } => {
println!(" Base64 data: {} (truncated)", &value.base64[..20]);
}
AttachmentData::Links { value } => {
println!(" Links: {:?}", value.links);
}
}
}
}
_ => {
println!("Unknown message type");
}
}
Ok(())
}