starknet_abigen_parser_stopgap/
cairo_event.rs

1//! Event parsing.
2use starknet::core::types::contract::{AbiEvent, AbiNamedMember, EventFieldKind, TypedAbiEvent};
3
4use super::abi_types::{AbiType, AbiTypeAny};
5use super::{CairoEnum, CairoStruct};
6
7#[derive(Debug, Clone)]
8pub enum CairoEventInner {
9    Enum(CairoEnum),
10    Struct(CairoStruct),
11}
12
13#[derive(Debug, Clone)]
14pub struct CairoEvent {
15    pub abi: AbiTypeAny,
16    pub inner: CairoEventInner,
17    pub fields_kinds: Vec<EventFieldKind>,
18}
19
20impl CairoEvent {
21    /// Gets the name of the struct type.
22    pub fn get_name(&self) -> String {
23        self.abi.get_cairo_type_name()
24    }
25
26    /// Gets the count for each field kind (keys, data).
27    pub fn count_fields_kinds(&self) -> (usize, usize) {
28        let mut k = 0;
29        let mut d = 0;
30
31        for fk in &self.fields_kinds {
32            match fk {
33                EventFieldKind::Key => k += 1,
34                EventFieldKind::Data => d += 1,
35                _ => continue,
36            }
37        }
38
39        (k, d)
40    }
41
42    /// Initializes a new instance from the abi name and it's members.
43    pub fn new(abi_event: &AbiEvent) -> Option<CairoEvent> {
44        match abi_event {
45            AbiEvent::Typed(typed_e) => match typed_e {
46                TypedAbiEvent::Struct(s) => {
47                    if s.members.is_empty() {
48                        return None;
49                    }
50
51                    let name = &s.name;
52                    let mut kinds = vec![];
53                    let members = s
54                        .members
55                        .iter()
56                        .map(|m| {
57                            kinds.push(m.kind.clone());
58                            AbiNamedMember {
59                                name: m.name.clone(),
60                                r#type: m.r#type.clone(),
61                            }
62                        })
63                        .collect();
64
65                    let cs = CairoStruct::new(name, &members);
66
67                    Some(CairoEvent {
68                        abi: AbiTypeAny::from_string(name),
69                        inner: CairoEventInner::Struct(cs),
70                        fields_kinds: kinds,
71                    })
72                }
73                TypedAbiEvent::Enum(e) => {
74                    if e.variants.is_empty() {
75                        return None;
76                    }
77
78                    let name = &e.name;
79                    let mut kinds = vec![];
80                    let variants = e
81                        .variants
82                        .iter()
83                        .map(|v| {
84                            kinds.push(v.kind.clone());
85                            AbiNamedMember {
86                                name: v.name.clone(),
87                                r#type: v.r#type.clone(),
88                            }
89                        })
90                        .collect();
91
92                    let ce = CairoEnum::new(name, &variants);
93
94                    Some(CairoEvent {
95                        abi: AbiTypeAny::from_string(name),
96                        inner: CairoEventInner::Enum(ce),
97                        fields_kinds: kinds,
98                    })
99                }
100            },
101            AbiEvent::Untyped(_) => {
102                // Can we support this..?
103                //panic!("Untyped events are not supported");
104                None
105            }
106        }
107    }
108}