semaphore_rs_trees/
proof.rs

1use std::fmt::Debug;
2
3use derive_where::derive_where;
4use semaphore_rs_hasher::Hasher;
5use serde::{Deserialize, Serialize};
6
7/// Merkle proof path, bottom to top.
8#[derive_where(Clone; <H as Hasher>::Hash: Clone)]
9#[derive_where(PartialEq; <H as Hasher>::Hash: PartialEq)]
10#[derive_where(Eq; <H as Hasher>::Hash: Eq)]
11#[derive_where(Debug; <H as Hasher>::Hash: Debug)]
12pub struct InclusionProof<H>(pub Vec<Branch<H::Hash>>)
13where
14    H: Hasher;
15
16/// Element of a Merkle proof
17#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
18pub enum Branch<T> {
19    /// Left branch taken, value is the right sibling hash.
20    Left(T),
21
22    /// Right branch taken, value is the left sibling hash.
23    Right(T),
24}
25
26impl<H> Serialize for InclusionProof<H>
27where
28    H: Hasher,
29    H::Hash: Serialize,
30{
31    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
32    where
33        S: serde::Serializer,
34    {
35        self.0.serialize(serializer)
36    }
37}
38
39impl<'de, H> Deserialize<'de> for InclusionProof<H>
40where
41    H: Hasher,
42    H::Hash: Deserialize<'de>,
43{
44    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
45    where
46        D: serde::Deserializer<'de>,
47    {
48        let branches = Vec::deserialize(deserializer)?;
49        Ok(InclusionProof(branches))
50    }
51}
52
53impl<T> Branch<T> {
54    /// Get the inner value
55    #[must_use]
56    pub fn into_inner(self) -> T {
57        match self {
58            Self::Left(sibling) => sibling,
59            Self::Right(sibling) => sibling,
60        }
61    }
62}
63
64impl<T: Debug> Debug for Branch<T> {
65    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
66        match self {
67            Self::Left(arg0) => f.debug_tuple("Left").field(arg0).finish(),
68            Self::Right(arg0) => f.debug_tuple("Right").field(arg0).finish(),
69        }
70    }
71}