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