tx3_lang/
cardano.rs

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}