tap_msg/message/
policy.rs

1//! Agent policy types and structures.
2//!
3//! This module defines policies that agents can use according to TAIP-7.
4
5use serde::{Deserialize, Serialize};
6use std::collections::HashMap;
7
8/// FromType specifies who the policy applies to
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub enum FromType {
11    /// Specific DIDs
12    #[serde(rename = "from")]
13    From(Vec<String>),
14
15    /// Specific transaction roles
16    #[serde(rename = "fromRole")]
17    FromRole(Vec<String>),
18
19    /// Specific agent types
20    #[serde(rename = "fromAgent")]
21    FromAgent(Vec<String>),
22}
23
24/// RequireAuthorization policy requires authorization from specific parties
25#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
26pub struct RequireAuthorization {
27    /// Optional list of DIDs this policy applies to
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub from: Option<Vec<String>>,
30
31    /// Optional list of roles this policy applies to
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub from_role: Option<Vec<String>>,
34
35    /// Optional list of agent types this policy applies to
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub from_agent: Option<Vec<String>>,
38
39    /// Optional human-readable purpose for this requirement
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub purpose: Option<String>,
42}
43
44/// RequirePresentation policy requires verifiable credential presentation
45#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
46pub struct RequirePresentation {
47    /// JSON-LD context for additional schemas
48    #[serde(rename = "@context", skip_serializing_if = "Option::is_none")]
49    pub context: Option<Vec<String>>,
50
51    /// Optional list of DIDs this policy applies to
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub from: Option<Vec<String>>,
54
55    /// Optional list of roles this policy applies to
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub from_role: Option<Vec<String>>,
58
59    /// Optional list of agent types this policy applies to
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub from_agent: Option<Vec<String>>,
62
63    /// Party the presentation should be about
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub about_party: Option<String>,
66
67    /// Agent the presentation should be about
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub about_agent: Option<String>,
70
71    /// Optional human-readable purpose for this requirement
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub purpose: Option<String>,
74
75    /// URL to the presentation definition
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub presentation_definition: Option<String>,
78
79    /// Specific credentials required
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub credentials: Option<HashMap<String, Vec<String>>>,
82}
83
84/// RequireProofOfControl policy requires proving control of an account or address
85#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
86pub struct RequireProofOfControl {
87    /// Optional list of DIDs this policy applies to
88    #[serde(skip_serializing_if = "Option::is_none")]
89    pub from: Option<Vec<String>>,
90
91    /// Optional list of roles this policy applies to
92    #[serde(skip_serializing_if = "Option::is_none")]
93    pub from_role: Option<Vec<String>>,
94
95    /// Optional list of agent types this policy applies to
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub from_agent: Option<Vec<String>>,
98
99    /// ID of the account or address that needs to be proven
100    #[serde(default)]
101    pub address_id: String,
102
103    /// Optional human-readable purpose for this requirement
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub purpose: Option<String>,
106}
107
108/// RequireRelationshipConfirmation policy requires confirming a relationship
109#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
110pub struct RequireRelationshipConfirmation {
111    /// Optional list of roles this policy applies to
112    #[serde(skip_serializing_if = "Option::is_none")]
113    pub from_role: Option<String>,
114
115    /// Optional human-readable purpose for this requirement
116    #[serde(skip_serializing_if = "Option::is_none")]
117    pub purpose: Option<String>,
118
119    /// Optional nonce for security
120    #[serde(skip_serializing_if = "Option::is_none")]
121    pub nonce: Option<u64>,
122}
123
124/// Enum representing the different types of policies.
125#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
126#[serde(tag = "@type")]
127pub enum Policy {
128    /// Require authorization from specified agents
129    RequireAuthorization(RequireAuthorization),
130
131    /// Require verifiable credential presentation
132    RequirePresentation(RequirePresentation),
133
134    /// Require proof of control of an account or address
135    RequireProofOfControl(RequireProofOfControl),
136
137    /// Require confirmation of a relationship
138    RequireRelationshipConfirmation(RequireRelationshipConfirmation),
139}
140
141impl Policy {
142    /// Validates the policy based on its specific type
143    pub fn validate(&self) -> crate::error::Result<()> {
144        // Basic validation logic for policies
145        match self {
146            Policy::RequireAuthorization(_) => Ok(()),
147            Policy::RequirePresentation(_) => Ok(()),
148            Policy::RequireProofOfControl(_) => Ok(()),
149            Policy::RequireRelationshipConfirmation(_) => Ok(()),
150        }
151    }
152}
153
154/// Create default implementations for the various policy types
155impl Default for RequireAuthorization {
156    fn default() -> Self {
157        RequireAuthorization {
158            from: None,
159            from_role: None,
160            from_agent: None,
161            purpose: None,
162        }
163    }
164}