::ghost_lite
A lightweight implementation of ::ghost
with macro_rules
.
Usage
use ghost_lite::ghost;
ghost! {
pub struct MyPhantomData<T>
}
fn main() {
let _: MyPhantomData<i32> = MyPhantomData;
let _ = MyPhantomData::<&str>;
}
Caveats
-
derive
should be in inner attributes (#![derive(...)]
).
Only the following traits are supported.
ghost_lite::ghost! {
#![derive(Clone, Copy, Default, Hash, PartialOrd, Ord, PartialEq, Eq, Debug)]
pub struct MyPhantom<T>
}
fn test() -> impl Copy {
MyPhantom::<String>
}
# fn main() {}
derive
in outer attributes will be directly prepended to the generated enum
,
which works like normal derive macros.
ghost_lite::ghost! {
#[derive(Clone, Copy)]
pub struct MyPhantom<T>
}
fn test() -> impl Copy {
MyPhantom::<String>
}
# fn main() {}
-
The implementation relies on a mod
name.
To define multiple custom PhantomData types in the same module,
you must provide custom mod
name with
#![mod_value_namespace = my_phantom_data]
.
ghost_lite::ghost! {
struct MyPhantomData1<T>
}
ghost_lite::ghost! {
struct MyPhantomData2<T>
}
# fn main() {}
ghost_lite::ghost! {
struct MyPhantomData1<T>
}
ghost_lite::ghost! {
#![mod_value_namespace = my_phantom_data_2]
struct MyPhantomData2<T>
}
# fn main() {}
-
Move type generic bounds to where
clause if ghost!
reports error.
Parsing tokens is limited with macro_rules
,
so complex type bounds are not supported.
For example:
ghost_lite::ghost! {
struct MyPhantomData<T: Clone + PartialEq>
}
# fn main() {}
ghost_lite::ghost! {
struct MyPhantomData<T> where T: Clone + PartialEq
}
# fn main() {}
-
Please don't add a trailing semicolon ;
.
ghost_lite::ghost! {
struct MyPhantomData<T>;
}
# fn main() {}
ghost_lite::ghost! {
struct MyPhantomData<T>
}
# fn main() {}