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
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}