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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
use TokenStream;
use Span;
use quote;
use ;
use ;
use ;
/// Define a crate interface.
///
/// This attribute should be added above the definition of a trait. All traits
/// that use the attribute cannot have the same name, unless they are assigned
/// different namespaces with `namespace = "..."` option.
///
/// It is not necessary to define it in the same crate as the implementation,
/// but it is required that these crates are linked together.
///
/// See the [crate-level documentation](crate) for more details.
///
/// ## Calling Helper Functions
///
/// It is also possible to generate calling helper functions for each interface
/// function by enabling the `gen_caller` option.
///
/// ## Restrictions
///
/// ### No Receivers
///
/// Methods with receivers (`self`, `&self`, `&mut self`) are not
/// allowed. Only associated functions (static methods) are supported:
///
/// ```rust,compile_fail
/// # use crate_interface::*;
/// #[def_interface]
/// trait MyIf {
/// fn foo(&self); // error: methods with receiver (self) are not allowed
/// }
/// ```
///
/// ### No Generic Parameters
///
/// Generic parameters are not supported. Interface functions cannot
/// have generic type parameters, lifetime parameters, or const generic
/// parameters:
///
/// ```rust,compile_fail
/// # use crate_interface::*;
/// #[def_interface]
/// trait MyIf {
/// fn foo<T>(x: T); // error: generic parameters are not allowed
/// }
/// ```
/// Implement the crate interface for a struct.
///
/// This attribute should be added above the implementation of a trait for a
/// struct, and the trait must be defined with
/// [`#[def_interface]`](macro@crate::def_interface).
///
/// It is not necessary to implement it in the same crate as the definition, but
/// it is required that these crates are linked together.
///
/// See the [crate-level documentation](crate) for more details.
///
/// ## Restrictions
///
/// ### No Alias
///
/// The specified trait name must not be an alias to the originally defined
/// name; otherwise, it will result in a compile error.
///
/// ```rust,compile_fail
/// # use crate_interface::*;
/// #[def_interface]
/// trait MyIf {
/// fn foo();
/// }
///
/// use MyIf as MyIf2;
/// struct MyImpl;
/// #[impl_interface]
/// impl MyIf2 for MyImpl {
/// fn foo() {}
/// }
/// ```
///
/// ### No Namespace Mismatch
///
/// It's also mandatory to match the namespace if one is specified when defining
/// the interface. For example, the following will result in a compile error:
///
/// ```rust,compile_fail
/// # use crate_interface::*;
/// #[def_interface(namespace = MyNs)]
/// trait MyIf {
/// fn foo();
/// }
///
/// struct MyImpl;
///
/// #[impl_interface(namespace = OtherNs)] // error: namespace does not match
/// impl MyIf for MyImpl {
/// fn foo() {}
/// }
/// ```
///
/// ### No Receivers
///
/// Methods with receivers (`self`, `&self`, `&mut self`) are not
/// allowed in the implementation either:
///
/// ```rust,compile_fail
/// # use crate_interface::*;
/// trait MyIf {
/// fn foo(&self);
/// }
///
/// struct MyImpl;
///
/// #[impl_interface]
/// impl MyIf for MyImpl {
/// fn foo(&self) {} // error: methods with receiver (self) are not allowed
/// }
/// ```
///
/// ### No Generic Parameters
///
/// Generic parameters are not supported in the implementation either:
///
/// ```rust,compile_fail
/// # use crate_interface::*;
/// trait MyIf {
/// fn foo<T>(x: T);
/// }
///
/// struct MyImpl;
///
/// #[impl_interface]
/// impl MyIf for MyImpl {
/// fn foo<T>(x: T) {} // error: generic parameters are not allowed
/// }
/// ```
/// Call a function in a crate interface.
///
/// It is not necessary to call it in the same crate as the implementation, but
/// it is required that these crates are linked together.
///
/// See the [crate-level documentation](crate) for more details.