cainome_parser/tokens/
function.rs

1use convert_case::{Case, Casing};
2
3use super::Token;
4
5#[derive(Debug, Clone, PartialEq)]
6pub enum StateMutability {
7    External,
8    View,
9}
10
11#[derive(Debug)]
12pub enum FunctionOutputKind {
13    NoOutput,
14    Cairo1,
15    Cairo0,
16}
17
18#[derive(Debug, Clone, PartialEq)]
19pub struct Function {
20    pub name: String,
21    pub state_mutability: StateMutability,
22    pub inputs: Vec<(String, Token)>,
23    pub outputs: Vec<Token>,
24    // Only cairo0 has named outputs.
25    pub named_outputs: Vec<(String, Token)>,
26}
27
28impl Function {
29    pub fn new(name: &str, state_mutability: StateMutability) -> Self {
30        Self {
31            name: name.to_string(),
32            state_mutability,
33            inputs: vec![],
34            outputs: vec![],
35            named_outputs: vec![],
36        }
37    }
38
39    pub fn apply_alias(&mut self, type_path: &str, alias: &str) {
40        for (_, ref mut t) in &mut self.inputs {
41            if let Token::Composite(ref mut c) = t {
42                c.apply_alias(type_path, alias);
43            }
44        }
45
46        for ref mut t in &mut self.outputs {
47            if let Token::Composite(ref mut c) = t {
48                c.apply_alias(type_path, alias);
49            }
50        }
51    }
52
53    pub fn get_output_kind(&self) -> FunctionOutputKind {
54        match (self.outputs.is_empty(), self.named_outputs.is_empty()) {
55            (true, true) => FunctionOutputKind::NoOutput,
56            (false, true) => FunctionOutputKind::Cairo1,
57            (true, false) => FunctionOutputKind::Cairo0,
58            (false, false) => panic!("Function's outputs and named outputs are exclusive!"),
59        }
60    }
61
62    pub fn get_cairo0_output_name(&self) -> String {
63        format!(
64            "{}Output",
65            self.name.from_case(Case::Snake).to_case(Case::Pascal)
66        )
67    }
68}