1pub use rust_zw3d_raw as raw;
81
82mod encoding;
84
85pub mod error;
87
88pub mod editor;
92
93pub mod commands;
97
98pub use commands::*;
100
101pub use error::{ZwError, ZwResult};
103
104pub const SDK_VERSION: &str = raw::SDK_VERSION;
106
107#[doc(hidden)]
109pub use inventory;
110#[doc(hidden)]
111pub use paste;
112
113#[doc(hidden)]
115pub use encoding::{from_gbk_cstr, to_gbk_bytes};
116
117#[cfg(feature = "macros")]
119pub use rust_zw3d_macros::{callback, cmd};
120
121#[derive(Copy, Clone)]
125pub struct Command {
126 pub name: &'static str,
128 pub func: *mut core::ffi::c_void,
130 pub code: f64,
132}
133
134unsafe impl Sync for Command {}
135
136inventory::collect!(Command);
137
138#[derive(Copy, Clone)]
142pub struct Callback {
143 pub name: &'static str,
145 pub func: *mut core::ffi::c_void,
147}
148
149unsafe impl Sync for Callback {}
150
151inventory::collect!(Callback);
152
153#[macro_export]
155macro_rules! register_commands {
156 () => {{
157 inventory::iter::<rust_zw3d::Command>().for_each(|cmd| {
158 rust_zw3d::commands::cvxCmdFunc(cmd.name, cmd.func, cmd.code);
159 });
160 }};
161}
162
163#[macro_export]
165macro_rules! register_callbacks {
166 () => {{
167 inventory::iter::<rust_zw3d::Callback>().for_each(|cb| {
168 rust_zw3d::commands::cvxCmdCallback(cb.name, cb.func);
169 });
170 }};
171}
172
173#[macro_export]
175macro_rules! unregister_commands {
176 () => {{
177 inventory::iter::<rust_zw3d::Command>().for_each(|cmd| {
178 rust_zw3d::commands::cvxCmdFuncUnload(cmd.name);
179 });
180 }};
181}
182
183#[macro_export]
185macro_rules! unregister_callbacks {
186 () => {{
187 inventory::iter::<rust_zw3d::Callback>().for_each(|cb| {
188 rust_zw3d::commands::cvxCmdCallbackUnload(cb.name);
189 });
190 }};
191}
192
193#[macro_export]
231macro_rules! zw3d_module {
232 ($modulename:ident) => {
233 ::rust_zw3d::paste::paste! {
234 #[unsafe(no_mangle)]
235 pub extern "C" fn [<$modulename Init>](_code: core::ffi::c_int, _ptr: *const core::ffi::c_void) -> core::ffi::c_int {
236 rust_zw3d::register_commands!();
237 rust_zw3d::register_callbacks!();
238 0
239 }
240
241 #[unsafe(no_mangle)]
242 pub extern "C" fn [<$modulename Exit>](_code: core::ffi::c_int, _ptr: *const core::ffi::c_void) -> core::ffi::c_int {
243 rust_zw3d::unregister_callbacks!();
244 rust_zw3d::unregister_commands!();
245 0
246 }
247 }
248 };
249
250 ($modulename:ident, init: $init_fn:expr) => {
251 ::rust_zw3d::paste::paste! {
252 #[unsafe(no_mangle)]
253 pub extern "C" fn [<$modulename Init>](_code: core::ffi::c_int, _ptr: *const core::ffi::c_void) -> core::ffi::c_int {
254 let result = $init_fn();
255 if result != 0 {
256 return result;
257 }
258
259 rust_zw3d::register_commands!();
260 rust_zw3d::register_callbacks!();
261 0
262 }
263
264 #[unsafe(no_mangle)]
265 pub extern "C" fn [<$modulename Exit>](_code: core::ffi::c_int, _ptr: *const core::ffi::c_void) -> core::ffi::c_int {
266 rust_zw3d::unregister_callbacks!();
267 rust_zw3d::unregister_commands!();
268 0
269 }
270 }
271 };
272
273 ($modulename:ident, exit: $exit_fn:expr) => {
274 ::rust_zw3d::paste::paste! {
275 #[unsafe(no_mangle)]
276 pub extern "C" fn [<$modulename Init>](_code: core::ffi::c_int, _ptr: *const core::ffi::c_void) -> core::ffi::c_int {
277 rust_zw3d::register_commands!();
278 rust_zw3d::register_callbacks!();
279 0
280 }
281
282 #[unsafe(no_mangle)]
283 pub extern "C" fn [<$modulename Exit>](_code: core::ffi::c_int, _ptr: *const core::ffi::c_void) -> core::ffi::c_int {
284 rust_zw3d::unregister_callbacks!();
285 rust_zw3d::unregister_commands!();
286
287 $exit_fn()
288 }
289 }
290 };
291
292 ($modulename:ident, init: $init_fn:expr, exit: $exit_fn:expr) => {
293 ::rust_zw3d::paste::paste! {
294 #[unsafe(no_mangle)]
295 pub extern "C" fn [<$modulename Init>](_code: core::ffi::c_int, _ptr: *const core::ffi::c_void) -> core::ffi::c_int {
296 let result = $init_fn();
297 if result != 0 {
298 return result;
299 }
300
301 rust_zw3d::register_commands!();
302 rust_zw3d::register_callbacks!();
303 0
304 }
305
306 #[unsafe(no_mangle)]
307 pub extern "C" fn [<$modulename Exit>](_code: core::ffi::c_int, _ptr: *const core::ffi::c_void) -> core::ffi::c_int {
308 rust_zw3d::unregister_callbacks!();
309 rust_zw3d::unregister_commands!();
310
311 $exit_fn()
312 }
313 }
314 };
315}