code_gen/rust/function/
signature.rs

1use crate::rust::{
2    Receiver, RustType, Var, WithFnGenerics, WithReceiver, WithResult, WithUnsafeFlag,
3    WithVarParams,
4};
5use crate::{CodeBuffer, Expression, WithName};
6
7/// A function signature.
8#[derive(Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)]
9pub struct Signature {
10    is_unsafe: bool,
11    name: String,
12    generics: Vec<Var>,
13    receiver: Option<Receiver>,
14    params: Vec<Var>,
15    result: Option<RustType>,
16}
17
18impl<S: Into<String>> From<S> for Signature {
19    fn from(name: S) -> Self {
20        Self {
21            is_unsafe: false,
22            name: name.into(),
23            generics: Vec::default(),
24            receiver: None,
25            params: Vec::default(),
26            result: None,
27        }
28    }
29}
30
31impl WithUnsafeFlag for Signature {
32    fn is_unsafe(&self) -> bool {
33        self.is_unsafe
34    }
35
36    fn set_unsafe(&mut self) {
37        self.is_unsafe = true;
38    }
39}
40
41impl WithName for Signature {
42    fn name(&self) -> &str {
43        self.name.as_str()
44    }
45}
46
47impl WithFnGenerics for Signature {
48    fn generics(&self) -> &[Var] {
49        self.generics.as_slice()
50    }
51
52    fn add_generic<V>(&mut self, generic: V)
53    where
54        V: Into<Var>,
55    {
56        self.generics.push(generic.into());
57    }
58}
59
60impl WithReceiver for Signature {
61    fn receiver(&self) -> Option<Receiver> {
62        self.receiver
63    }
64
65    fn set_receiver(&mut self, receiver: Receiver) {
66        self.receiver = Some(receiver)
67    }
68}
69
70impl WithVarParams for Signature {
71    fn params(&self) -> &[Var] {
72        self.params.as_slice()
73    }
74
75    fn add_param<V>(&mut self, param: V)
76    where
77        V: Into<Var>,
78    {
79        self.params.push(param.into());
80    }
81}
82
83impl WithResult for Signature {
84    fn result(&self) -> Option<&RustType> {
85        self.result.as_ref()
86    }
87
88    fn set_result<T>(&mut self, result: T)
89    where
90        T: Into<RustType>,
91    {
92        self.result = Some(result.into());
93    }
94}
95
96impl Expression for Signature {
97    fn write(&self, b: &mut CodeBuffer) {
98        self.write_name(b);
99        self.write_generic_brackets(b);
100        b.write("(");
101        if let Some(receiver) = self.receiver {
102            receiver.write(b);
103            if !self.params.is_empty() {
104                b.write(", ");
105            }
106        }
107        self.write_params(b);
108        b.write(")");
109        self.write_result(b);
110        self.write_generic_where(b);
111    }
112}