indy_data_types/anoncreds/
presentation.rs

1use std::collections::HashMap;
2
3use crate::identifiers::cred_def::CredentialDefinitionId;
4use crate::identifiers::rev_reg::RevocationRegistryId;
5use crate::identifiers::schema::SchemaId;
6use crate::Validatable;
7
8#[derive(Debug)]
9#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
10pub struct Presentation {
11    pub proof: cl_type!(Proof),
12    pub requested_proof: RequestedProof,
13    pub identifiers: Vec<Identifier>,
14}
15
16#[derive(Clone, Debug, Default, PartialEq, Eq)]
17#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
18pub struct RequestedProof {
19    pub revealed_attrs: HashMap<String, RevealedAttributeInfo>,
20    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "HashMap::is_empty"))]
21    #[cfg_attr(feature = "serde", serde(default))]
22    pub revealed_attr_groups: HashMap<String, RevealedAttributeGroupInfo>,
23    #[cfg_attr(feature = "serde", serde(default))]
24    pub self_attested_attrs: HashMap<String, String>,
25    #[cfg_attr(feature = "serde", serde(default))]
26    pub unrevealed_attrs: HashMap<String, SubProofReferent>,
27    #[cfg_attr(feature = "serde", serde(default))]
28    pub predicates: HashMap<String, SubProofReferent>,
29}
30
31#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
32#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
33pub struct SubProofReferent {
34    pub sub_proof_index: u32,
35}
36
37#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
38#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
39pub struct RevealedAttributeInfo {
40    pub sub_proof_index: u32,
41    pub raw: String,
42    pub encoded: String,
43}
44
45#[derive(Clone, Debug, PartialEq, Eq)]
46#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
47pub struct RevealedAttributeGroupInfo {
48    pub sub_proof_index: u32,
49    pub values: HashMap<String /* attribute name */, AttributeValue>,
50}
51
52#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
53#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
54pub struct AttributeValue {
55    pub raw: String,
56    pub encoded: String,
57}
58
59#[derive(Debug, Clone, PartialEq, Eq, Hash)]
60#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
61pub struct Identifier {
62    pub schema_id: SchemaId,
63    pub cred_def_id: CredentialDefinitionId,
64    pub rev_reg_id: Option<RevocationRegistryId>,
65    pub timestamp: Option<u64>,
66}
67
68impl Validatable for Presentation {}
69
70#[cfg(test)]
71mod tests {
72    #[cfg(feature = "serde")]
73    use super::*;
74
75    #[cfg(feature = "serde")]
76    #[test]
77    fn deserialize_requested_proof_with_empty_revealed_attr_groups() {
78        let mut req_proof_old: RequestedProof = Default::default();
79        req_proof_old.revealed_attrs.insert(
80            "attr1".to_string(),
81            RevealedAttributeInfo {
82                sub_proof_index: 0,
83                raw: "123".to_string(),
84                encoded: "123".to_string(),
85            },
86        );
87        let json = json!(req_proof_old).to_string();
88        let req_proof: RequestedProof = serde_json::from_str(&json).unwrap();
89        assert!(req_proof.revealed_attr_groups.is_empty())
90    }
91}