1use std::{collections::HashMap, rc::Rc};
2
3use pest::iterators::Pair;
4use serde::{Deserialize, Serialize};
5
6use crate::{
7 analyzing::{Analyzable, AnalyzeReport},
8 ast::{DataExpr, Scope, Span},
9 ir,
10 lowering::IntoLower,
11 parsing::{AstNode, Error, Rule},
12};
13
14#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
15pub struct VoteDelegationCertificate {
16 pub drep: DataExpr,
17 pub stake: DataExpr,
18 pub span: Span,
19}
20
21impl AstNode for VoteDelegationCertificate {
22 const RULE: Rule = Rule::cardano_vote_delegation_certificate;
23
24 fn parse(pair: Pair<Rule>) -> Result<Self, Error> {
25 let span = pair.as_span().into();
26 let mut inner = pair.into_inner();
27
28 Ok(VoteDelegationCertificate {
29 drep: DataExpr::parse(inner.next().unwrap())?,
30 stake: DataExpr::parse(inner.next().unwrap())?,
31 span,
32 })
33 }
34
35 fn span(&self) -> &Span {
36 &self.span
37 }
38}
39
40impl Analyzable for VoteDelegationCertificate {
41 fn analyze(&mut self, parent: Option<Rc<Scope>>) -> AnalyzeReport {
42 let drep = self.drep.analyze(parent.clone());
43 let stake = self.stake.analyze(parent.clone());
44
45 drep + stake
46 }
47}
48
49impl IntoLower for VoteDelegationCertificate {
50 type Output = ir::AdHocDirective;
51
52 fn into_lower(&self) -> Result<Self::Output, crate::lowering::Error> {
53 Ok(ir::AdHocDirective {
54 name: "vote_delegation_certificate".to_string(),
55 data: HashMap::from([
56 ("drep".to_string(), self.drep.into_lower()?),
57 ("stake".to_string(), self.stake.into_lower()?),
58 ]),
59 })
60 }
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
64pub struct StakeDelegationCertificate {
65 pub pool: DataExpr,
66 pub stake: DataExpr,
67 pub span: Span,
68}
69
70impl AstNode for StakeDelegationCertificate {
71 const RULE: Rule = Rule::cardano_stake_delegation_certificate;
72
73 fn parse(pair: Pair<Rule>) -> Result<Self, Error> {
74 let span = pair.as_span().into();
75 let mut inner = pair.into_inner();
76
77 Ok(StakeDelegationCertificate {
78 pool: DataExpr::parse(inner.next().unwrap())?,
79 stake: DataExpr::parse(inner.next().unwrap())?,
80 span,
81 })
82 }
83
84 fn span(&self) -> &Span {
85 &self.span
86 }
87}
88
89impl Analyzable for StakeDelegationCertificate {
90 fn analyze(&mut self, parent: Option<Rc<Scope>>) -> AnalyzeReport {
91 let pool = self.pool.analyze(parent.clone());
92 let stake = self.stake.analyze(parent.clone());
93
94 pool + stake
95 }
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
99pub enum CardanoBlock {
100 VoteDelegationCertificate(VoteDelegationCertificate),
101 StakeDelegationCertificate(StakeDelegationCertificate),
102}
103
104impl AstNode for CardanoBlock {
105 const RULE: Rule = Rule::cardano_block;
106
107 fn parse(pair: Pair<Rule>) -> Result<Self, Error> {
108 let mut inner = pair.into_inner();
109
110 Ok(CardanoBlock::VoteDelegationCertificate(
111 VoteDelegationCertificate::parse(inner.next().unwrap())?,
112 ))
113 }
114
115 fn span(&self) -> &Span {
116 match self {
117 CardanoBlock::VoteDelegationCertificate(x) => x.span(),
118 CardanoBlock::StakeDelegationCertificate(x) => x.span(),
119 }
120 }
121}
122
123impl Analyzable for CardanoBlock {
124 fn analyze(&mut self, parent: Option<Rc<Scope>>) -> AnalyzeReport {
125 match self {
126 CardanoBlock::VoteDelegationCertificate(x) => x.analyze(parent),
127 _ => todo!(),
128 }
129 }
130}
131
132impl IntoLower for CardanoBlock {
133 type Output = ir::AdHocDirective;
134
135 fn into_lower(&self) -> Result<Self::Output, crate::lowering::Error> {
136 match self {
137 CardanoBlock::VoteDelegationCertificate(x) => x.into_lower(),
138 _ => todo!(),
139 }
140 }
141}