semaphore_rs_trees/
proof.rs1use std::fmt::Debug;
2
3use derive_where::derive_where;
4use semaphore_rs_hasher::Hasher;
5use serde::{Deserialize, Serialize};
6
7#[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#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
18pub enum Branch<T> {
19 Left(T),
21
22 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 #[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}