1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
use interoptopus::lang::c::{CType, Function, PrimitiveType};
use interoptopus::patterns::service::Service;
use interoptopus::writer::IndentWriter;
use interoptopus::{indented, Error};
mod dotnet;
mod unity;
use crate::{CSharpTypeConverter, Config};
pub use dotnet::DotNet;
use interoptopus::patterns::TypePattern;
pub use unity::Unity;
#[doc(hidden)]
pub struct Helper<'a> {
pub config: &'a Config,
pub converter: &'a dyn CSharpTypeConverter,
}
#[doc(hidden)]
pub trait OverloadWriter {
fn write_imports(&self, w: &mut IndentWriter, h: Helper) -> Result<(), Error>;
fn write_function_overload(&self, w: &mut IndentWriter, h: Helper, function: &Function) -> Result<(), Error>;
fn write_service_method_overload(&self, w: &mut IndentWriter, h: Helper, class: &Service, function: &Function, fn_pretty: &str) -> Result<(), Error>;
fn write_pattern_slice_overload(&self, w: &mut IndentWriter, h: Helper, context_type_name: &str, type_string: &str) -> Result<(), Error>;
fn write_pattern_slice_unsafe_copied_fragment(&self, w: &mut IndentWriter, h: Helper, type_string: &str) -> Result<(), Error>;
}
#[rustfmt::skip]
fn write_function_overloaded_invoke_with_error_handling(w: &mut IndentWriter, function: &Function, fn_call: &str) -> Result<(), Error> {
match function.signature().rval() {
CType::Pattern(TypePattern::FFIErrorEnum(e)) => {
indented!(w, [_], r#"var rval = {};"#, fn_call)?;
indented!(w, [_], r#"if (rval != {}.{})"#, e.the_enum().rust_name(), e.success_variant().name())?;
indented!(w, [_], r#"{{"#)?;
indented!(w, [_ _], r#"throw new Exception($"Something went wrong: {{rval}}");"#)?;
indented!(w, [_], r#"}}"#)?;
}
CType::Primitive(PrimitiveType::Void) => {
indented!(w, [_], r#"{};"#, fn_call)?;
}
_ => {
indented!(w, [_], r#"return {};"#, fn_call)?;
}
}
Ok(())
}