cainome_parser/tokens/
function.rs1use 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 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}