eventify_primitives/
criteria.rs1use 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}