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 fn is_resolved(&self) -> bool {
49 self.drep.is_resolved() && self.stake.is_resolved()
50 }
51}
52
53impl IntoLower for VoteDelegationCertificate {
54 type Output = ir::AdHocDirective;
55
56 fn into_lower(&self) -> Result<Self::Output, crate::lowering::Error> {
57 Ok(ir::AdHocDirective {
58 name: "vote_delegation_certificate".to_string(),
59 data: HashMap::from([
60 ("drep".to_string(), self.drep.into_lower()?),
61 ("stake".to_string(), self.stake.into_lower()?),
62 ]),
63 })
64 }
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
68pub struct StakeDelegationCertificate {
69 pub pool: DataExpr,
70 pub stake: DataExpr,
71 pub span: Span,
72}
73
74impl AstNode for StakeDelegationCertificate {
75 const RULE: Rule = Rule::cardano_stake_delegation_certificate;
76
77 fn parse(pair: Pair<Rule>) -> Result<Self, Error> {
78 let span = pair.as_span().into();
79 let mut inner = pair.into_inner();
80
81 Ok(StakeDelegationCertificate {
82 pool: DataExpr::parse(inner.next().unwrap())?,
83 stake: DataExpr::parse(inner.next().unwrap())?,
84 span,
85 })
86 }
87
88 fn span(&self) -> &Span {
89 &self.span
90 }
91}
92
93impl Analyzable for StakeDelegationCertificate {
94 fn analyze(&mut self, parent: Option<Rc<Scope>>) -> AnalyzeReport {
95 let pool = self.pool.analyze(parent.clone());
96 let stake = self.stake.analyze(parent.clone());
97
98 pool + stake
99 }
100
101 fn is_resolved(&self) -> bool {
102 self.pool.is_resolved() && self.stake.is_resolved()
103 }
104}
105
106#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
107pub enum CardanoBlock {
108 VoteDelegationCertificate(VoteDelegationCertificate),
109 StakeDelegationCertificate(StakeDelegationCertificate),
110}
111
112impl AstNode for CardanoBlock {
113 const RULE: Rule = Rule::cardano_block;
114
115 fn parse(pair: Pair<Rule>) -> Result<Self, Error> {
116 let mut inner = pair.into_inner();
117
118 Ok(CardanoBlock::VoteDelegationCertificate(
119 VoteDelegationCertificate::parse(inner.next().unwrap())?,
120 ))
121 }
122
123 fn span(&self) -> &Span {
124 match self {
125 CardanoBlock::VoteDelegationCertificate(x) => x.span(),
126 CardanoBlock::StakeDelegationCertificate(x) => x.span(),
127 }
128 }
129}
130
131impl Analyzable for CardanoBlock {
132 fn analyze(&mut self, parent: Option<Rc<Scope>>) -> AnalyzeReport {
133 match self {
134 CardanoBlock::VoteDelegationCertificate(x) => x.analyze(parent),
135 _ => todo!(),
136 }
137 }
138
139 fn is_resolved(&self) -> bool {
140 match self {
141 CardanoBlock::VoteDelegationCertificate(x) => x.is_resolved(),
142 _ => false,
143 }
144 }
145}
146
147impl IntoLower for CardanoBlock {
148 type Output = ir::AdHocDirective;
149
150 fn into_lower(&self) -> Result<Self::Output, crate::lowering::Error> {
151 match self {
152 CardanoBlock::VoteDelegationCertificate(x) => x.into_lower(),
153 _ => todo!(),
154 }
155 }
156}