cainome_parser/tokens/
function.rs

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