Skip to content

Commit 303c1db

Browse files
committed
Allow attributes in macro invocations
Allows `#[cfg]` to be used to make certain definitions conditional. Such as for library version feature flags.
1 parent db0f230 commit 303c1db

File tree

1 file changed

+42
-36
lines changed

1 file changed

+42
-36
lines changed

src/lib.rs

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -209,19 +209,22 @@ macro_rules! ffi_dispatch_static(
209209
#[macro_export]
210210
macro_rules! link_external_library(
211211
($link: expr,
212-
$(statics: $($sname: ident: $stype: ty),+,)|*
213-
$(functions: $(fn $fname: ident($($farg: ty),*) -> $fret:ty),+,)|*
214-
$(varargs: $(fn $vname: ident($($vargs: ty),+) -> $vret: ty),+,)|*
212+
$(statics: $($(#[$sattr:meta])* $sname: ident: $stype: ty),+,)|*
213+
$(functions: $($(#[$fattr:meta])* fn $fname: ident($($farg: ty),*) -> $fret:ty),+,)|*
214+
$(varargs: $($(#[$vattr:meta])* fn $vname: ident($($vargs: ty),+) -> $vret: ty),+,)|*
215215
) => (
216216
#[link(name = $link)]
217217
extern "C" {
218218
$($(
219+
$(#[$sattr])*
219220
pub static $sname: $stype;
220221
)+)*
221222
$($(
223+
$(#[$fattr])*
222224
pub fn $fname($(_: $farg),*) -> $fret;
223225
)+)*
224226
$($(
227+
$(#[$vattr])*
225228
pub fn $vname($(_: $vargs),+ , ...) -> $vret;
226229
)+)*
227230
}
@@ -262,51 +265,54 @@ impl std::fmt::Display for DlError {
262265
#[macro_export]
263266
macro_rules! dlopen_external_library(
264267
(__struct, $structname: ident,
265-
$(statics: $($sname: ident: $stype: ty),+,)|*
266-
$(functions: $(fn $fname: ident($($farg: ty),*) -> $fret:ty),+,)|*
267-
$(varargs: $(fn $vname: ident($($vargs: ty),+) -> $vret: ty),+,)|*
268+
$(statics: $($(#[$sattr:meta])* $sname: ident: $stype: ty),+,)|*
269+
$(functions: $($(#[$fattr:meta])* fn $fname: ident($($farg: ty),*) -> $fret:ty),+,)|*
270+
$(varargs: $($(#[$vattr:meta])* fn $vname: ident($($vargs: ty),+) -> $vret: ty),+,)|*
268271
) => (
269272
pub struct $structname {
270273
__lib: $crate::Library,
271274
$($(
275+
$(#[$sattr])*
272276
pub $sname: $crate::Symbol<'static, &'static $stype>,
273277
)+)*
274278
$($(
279+
$(#[$fattr])*
275280
pub $fname: $crate::Symbol<'static, unsafe extern "C" fn($($farg),*) -> $fret>,
276281
)+)*
277282
$($(
283+
$(#[$vattr])*
278284
pub $vname: $crate::Symbol<'static, unsafe extern "C" fn($($vargs),+ , ...) -> $vret>,
279285
)+)*
280286
}
281287
);
282288
(__impl, $structname: ident,
283-
$(statics: $($sname: ident: $stype: ty),+,)|*
284-
$(functions: $(fn $fname: ident($($farg: ty),*) -> $fret:ty),+,)|*
285-
$(varargs: $(fn $vname: ident($($vargs: ty),+) -> $vret: ty),+,)|*
289+
$(statics: $($(#[$sattr:meta])* $sname: ident: $stype: ty),+,)|*
290+
$(functions: $($(#[$fattr:meta])* fn $fname: ident($($farg: ty),*) -> $fret:ty),+,)|*
291+
$(varargs: $($(#[$vattr:meta])* fn $vname: ident($($vargs: ty),+) -> $vret: ty),+,)|*
286292
) => (
287293
impl $structname {
288294
pub unsafe fn open(name: &str) -> Result<$structname, $crate::DlError> {
289295
// we use it to ensure the 'static lifetime
290296
use std::mem::transmute;
291297
let lib = $crate::Library::new(name).map_err($crate::DlError::CantOpen)?;
292298
let s = $structname {
293-
$($($sname: {
299+
$($($(#[$sattr])* $sname: {
294300
let s_name = concat!(stringify!($sname), "\0");
295301
transmute(match lib.get::<&'static $stype>(s_name.as_bytes()) {
296302
Ok(s) => s,
297303
Err(_) => return Err($crate::DlError::MissingSymbol(s_name))
298304
})
299305
},
300306
)+)*
301-
$($($fname: {
307+
$($($(#[$fattr])* $fname: {
302308
let s_name = concat!(stringify!($fname), "\0");
303309
transmute(match lib.get::<unsafe extern "C" fn($($farg),*) -> $fret>(s_name.as_bytes()) {
304310
Ok(s) => s,
305311
Err(_) => return Err($crate::DlError::MissingSymbol(s_name))
306312
})
307313
},
308314
)+)*
309-
$($($vname: {
315+
$($($(#[$fattr])* $vname: {
310316
let s_name = concat!(stringify!($vname), "\0");
311317
transmute(match lib.get::<unsafe extern "C" fn($($vargs),+ , ...) -> $vret>(s_name.as_bytes()) {
312318
Ok(s) => s,
@@ -321,19 +327,19 @@ macro_rules! dlopen_external_library(
321327
}
322328
);
323329
($structname: ident,
324-
$(statics: $($sname: ident: $stype: ty),+,)|*
325-
$(functions: $(fn $fname: ident($($farg: ty),*) -> $fret:ty),+,)|*
326-
$(varargs: $(fn $vname: ident($($vargs: ty),+) -> $vret: ty),+,)|*
330+
$(statics: $($(#[$sattr:meta])* $sname: ident: $stype: ty),+,)|*
331+
$(functions: $($(#[$fattr:meta])* fn $fname: ident($($farg: ty),*) -> $fret:ty),+,)|*
332+
$(varargs: $($(#[$vattr:meta])* fn $vname: ident($($vargs: ty),+) -> $vret: ty),+,)|*
327333
) => (
328334
$crate::dlopen_external_library!(__struct,
329-
$structname, $(statics: $($sname: $stype),+,)|*
330-
$(functions: $(fn $fname($($farg),*) -> $fret),+,)|*
331-
$(varargs: $(fn $vname($($vargs),+) -> $vret),+,)|*
335+
$structname, $(statics: $($(#[$sattr])* $sname: $stype),+,)|*
336+
$(functions: $($(#[$fattr])* fn $fname($($farg),*) -> $fret),+,)|*
337+
$(varargs: $($(#[$vattr])* fn $vname($($vargs),+) -> $vret),+,)|*
332338
);
333339
$crate::dlopen_external_library!(__impl,
334-
$structname, $(statics: $($sname: $stype),+,)|*
335-
$(functions: $(fn $fname($($farg),*) -> $fret),+,)|*
336-
$(varargs: $(fn $vname($($vargs),+) -> $vret),+,)|*
340+
$structname, $(statics: $($(#[$sattr])* $sname: $stype),+,)|*
341+
$(functions: $($(#[$attr])* fn $fname($($farg),*) -> $fret),+,)|*
342+
$(varargs: $($(#[$vattr])* fn $vname($($vargs),+) -> $vret),+,)|*
337343
);
338344
unsafe impl Sync for $structname { }
339345
);
@@ -353,34 +359,34 @@ macro_rules! dlopen_external_library(
353359
#[macro_export]
354360
macro_rules! external_library(
355361
(feature=$feature: expr, $structname: ident, $link: expr,
356-
$(statics: $($sname: ident: $stype: ty),+,)|*
357-
$(functions: $(fn $fname: ident($($farg: ty),*) -> $fret:ty),+,)|*
358-
$(varargs: $(fn $vname: ident($($vargs: ty),+) -> $vret: ty),+,)|*
362+
$(statics: $($(#[$sattr:meta])* $sname: ident: $stype: ty),+,)|*
363+
$(functions: $($(#[$fattr:meta])* fn $fname: ident($($farg: ty),*) -> $fret:ty),+,)|*
364+
$(varargs: $($(#[$vattr:meta])* fn $vname: ident($($vargs: ty),+) -> $vret: ty),+,)|*
359365
) => (
360366
#[cfg(feature = $feature)]
361367
$crate::dlopen_external_library!(
362-
$structname, $(statics: $($sname: $stype),+,)|*
363-
$(functions: $(fn $fname($($farg),*) -> $fret),+,)|*
364-
$(varargs: $(fn $vname($($vargs),+) -> $vret),+,)|*
368+
$structname, $(statics: $($(#[$sattr])* $sname: $stype),+,)|*
369+
$(functions: $($(#[$fattr])* fn $fname($($farg),*) -> $fret),+,)|*
370+
$(varargs: $($(#[$vattr])* fn $vname($($vargs),+) -> $vret),+,)|*
365371
);
366372

367373
#[cfg(not(feature = $feature))]
368374
$crate::link_external_library!(
369-
$link, $(statics: $($sname: $stype),+,)|*
370-
$(functions: $(fn $fname($($farg),*) -> $fret),+,)|*
371-
$(varargs: $(fn $vname($($vargs),+) -> $vret),+,)|*
375+
$link, $(statics: $($(#[$sattr])* $sname: $stype),+,)|*
376+
$(functions: $($(#[$fattr])* fn $fname($($farg),*) -> $fret),+,)|*
377+
$(varargs: $($(#[$vattr])* fn $vname($($vargs),+) -> $vret),+,)|*
372378
);
373379
);
374380
($structname: ident, $link: expr,
375-
$(statics: $($sname: ident: $stype: ty),+,)|*
376-
$(functions: $(fn $fname: ident($($farg: ty),*) -> $fret:ty),+,)|*
377-
$(varargs: $(fn $vname: ident($($vargs: ty),+) -> $vret: ty),+,)|*
381+
$(statics: $($(#[$sattr:meta])* $sname: ident: $stype: ty),+,)|*
382+
$(functions: $($(#[$fattr:meta])* fn $fname: ident($($farg: ty),*) -> $fret:ty),+,)|*
383+
$(varargs: $($(#[$vattr:meta])* fn $vname: ident($($vargs: ty),+) -> $vret: ty),+,)|*
378384
) => (
379385
$crate::external_library!(
380386
feature="dlopen", $structname, $link,
381-
$(statics: $($sname: $stype),+,)|*
382-
$(functions: $(fn $fname($($farg),*) -> $fret),+,)|*
383-
$(varargs: $(fn $vname($($vargs),+) -> $vret),+,)|*
387+
$(statics: $($(#[$sattr])* $sname: $stype),+,)|*
388+
$(functions: $($(#[$fattr])* fn $fname($($farg),*) -> $fret),+,)|*
389+
$(varargs: $($(#[$vattr])* fn $vname($($vargs),+) -> $vret),+,)|*
384390
);
385391
);
386392
);

0 commit comments

Comments
 (0)