eventify_primitives/
criteria.rs

1use std::{
2    fmt::{Display, Formatter},
3    str::FromStr,
4};
5
6use alloy_primitives::{Address, B256};
7use eyre::Result;
8use serde::{Deserialize, Serialize};
9use sqlx::prelude::FromRow;
10
11#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, Eq, FromRow)]
12pub struct Criteria {
13    pub address: Option<Vec<Address>>,
14    pub topics: Option<Vec<Vec<B256>>>,
15}
16
17impl Criteria {
18    pub fn new(address: Option<Vec<Address>>, topics: Option<Vec<Vec<B256>>>) -> Criteria {
19        Criteria { address, topics }
20    }
21}
22
23impl Display for Criteria {
24    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
25        write!(f, "{}", serde_json::to_string(&self).unwrap())
26    }
27}
28
29impl FromStr for Criteria {
30    type Err = serde_json::Error;
31
32    fn from_str(s: &str) -> Result<Self, Self::Err> {
33        serde_json::from_str(s)
34    }
35}
36
37impl From<&str> for Criteria {
38    fn from(s: &str) -> Self {
39        serde_json::from_str(s).expect("failed to parse criteria")
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn test_deserialize_criteria() {
49        let json = serde_json::json!(
50        {
51            "address": ["0x0000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000002"],
52            "topics": [
53                "0x326edc3ac586176abeebb61e309fff4802231bb425463a8b205dc4c6bee35089",
54                "0x24e6d6115f6446ccdee52f6150d0eb60d34dbe3072db714a11a601aeb3ee7503",
55                "0x843f098f2784e8517a5ee9d050daa270e91403e1e4eaafa90bc535ef5910518c",
56                "0x3ed3d15056b62bf1e6eae92a1eba5af40d8a7b42b2d05fdb94d1e3e1a61781c8"
57            ]
58        });
59        let res = serde_json::from_value::<Criteria>(json).unwrap();
60        assert_eq!(
61            res.address,
62            Some(vec![
63                Address::from_str("0x0000000000000000000000000000000000000001").unwrap(),
64                Address::from_str("0x0000000000000000000000000000000000000002").unwrap(),
65            ]),
66        );
67        assert_eq!(
68            res.topics,
69            Some(vec![vec![
70                B256::from_str(
71                    "0x326edc3ac586176abeebb61e309fff4802231bb425463a8b205dc4c6bee35089"
72                )
73                .unwrap(),
74                B256::from_str(
75                    "0x24e6d6115f6446ccdee52f6150d0eb60d34dbe3072db714a11a601aeb3ee7503"
76                )
77                .unwrap(),
78                B256::from_str(
79                    "0x843f098f2784e8517a5ee9d050daa270e91403e1e4eaafa90bc535ef5910518c"
80                )
81                .unwrap(),
82                B256::from_str(
83                    "0x3ed3d15056b62bf1e6eae92a1eba5af40d8a7b42b2d05fdb94d1e3e1a61781c8"
84                )
85                .unwrap()
86            ]]),
87        );
88    }
89
90    #[test]
91    fn test_deserialize_empty_criteria() {
92        let json = serde_json::json!({});
93
94        assert!(serde_json::from_value::<Criteria>(json).is_err());
95    }
96}