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
205
206
207
208
209
210
// Copyright 2025 The Axvisor Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Procedural macros for the `axvisor_api` crate.
//!
//! This crate provides the procedural macros used to define and implement
//! AxVisor API interfaces. These macros are built on top of the
//! `ax-crate-interface` crate and provide a convenient way to create
//! link-time-resolved API interfaces.
//!
//! # Macros
//!
//! - [`api_def`] - Define an API interface trait.
//! - [`api_impl`] - Implement an API interface.
//!
//! # Usage
//!
//! This crate is re-exported by `axvisor_api` and should not be used directly.
//! Instead, use the macros through `axvisor_api`:
//!
//! ```rust,ignore
//! use axvisor_api::{api_def, api_impl};
//!
//! #[api_def]
//! pub trait MyApiIf {
//! fn my_function() -> u32;
//! }
//!
//! struct MyApiImpl;
//!
//! #[api_impl]
//! impl MyApiIf for MyApiImpl {
//! fn my_function() -> u32 {
//! 42
//! }
//! }
//! ```
//!
//! # How It Works
//!
//! The macros use `ax-crate-interface` under the hood, which leverages Rust's
//! link-time symbol resolution to connect API definitions with their
//! implementations. This allows for a cleaner API without explicit generic
//! parameters.
use TokenStream as TokenStream1;
use ;
use ;
use ;
use ;
/// Find the path to the `axvisor_api` crate.
///
/// This function determines the correct path to use when referring to
/// `axvisor_api` from within the generated code, handling both the case
/// where we're inside the `axvisor_api` crate itself and when we're in
/// an external crate.
/// Get the namespace identifier used for AxVisor APIs.
///
/// All AxVisor APIs share a common namespace to avoid conflicts with other
/// uses of `ax-crate-interface`.
/// Macro to assert that an attribute has no arguments.
/// Define an AxVisor API interface.
///
/// This attribute macro is applied to a trait definition to register it as
/// an AxVisor API interface. It generates caller functions for each method
/// in the trait, allowing the API to be called as regular functions.
///
/// # Usage
///
/// ```rust,ignore
/// use axvisor_api::api_def;
///
/// #[api_def]
/// pub trait MyApiIf {
/// /// Get a value.
/// fn get_value() -> u32;
///
/// /// Set a value.
/// fn set_value(value: u32);
/// }
///
/// // After the macro expansion, you can call:
/// // my_module::get_value()
/// // my_module::set_value(42)
/// ```
///
/// # Generated Code
///
/// The macro generates:
/// 1. The original trait definition with `ax_crate_interface::def_interface`
/// attribute.
/// 2. Free-standing caller functions for each trait method at the same
/// module level.
///
/// # Attributes
///
/// This macro does not accept any arguments.
///
/// # Implementation
///
/// This macro uses `ax_crate_interface::def_interface` internally with the
/// `gen_caller` option to generate the caller functions.
/// Implement an AxVisor API interface.
///
/// This attribute macro is applied to an `impl` block that implements a
/// trait previously defined with [`api_def`]. It registers the implementation
/// so that calls to the API functions are resolved to this implementation
/// at link time.
///
/// # Usage
///
/// ```rust,ignore
/// use axvisor_api::{api_def, api_impl};
///
/// #[api_def]
/// pub trait MyApiIf {
/// fn get_value() -> u32;
/// }
///
/// struct MyApiImpl;
///
/// #[api_impl]
/// impl MyApiIf for MyApiImpl {
/// fn get_value() -> u32 {
/// 42
/// }
/// }
/// ```
///
/// # Requirements
///
/// - The implemented trait must have been defined with [`api_def`].
/// - The implementing type should be an empty struct (marker type).
/// - Only one implementation per API trait is allowed in the final binary.
///
/// # Attributes
///
/// This macro does not accept any arguments.
///
/// # Implementation
///
/// This macro uses `ax_crate_interface::impl_interface` internally.