code_gen/rust/function/
signature.rs1use crate::rust::{
2 Receiver, RustType, Var, WithFnGenerics, WithReceiver, WithResult, WithUnsafeFlag,
3 WithVarParams,
4};
5use crate::{CodeBuffer, Expression, WithName};
6
7#[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}