3 releases
| 0.1.3 | Jul 5, 2022 |
|---|---|
| 0.1.2 |
|
| 0.1.1 | Jul 4, 2022 |
| 0.1.0 | Jul 4, 2022 |
#415 in #compile-time
Used in bagel
24KB
599 lines
dough
Consider using the bagel crate. The dough crate provides
supporting macros for bagel.
WARNING: Do not rely on the API of this crate
🥯 bagel: Always baked, never fried
bagel is a collection of macros and other things that we frequently use at Skytable,
primarily to get work done at compile-time (because we like it baked :P). This crate contains some of the stuff we use, and we'll add more of the "magic" soon.
Importing
bagel = "0.1"
What bagel can do
def: Use the default declaration syntaxCtor: Derive constructors:- Full lifetimes, generics and where clause support
#[phantom]: Auto elidePhantomDatafields#[ctor_const]: Make the constructor aconst fn
Gtor: Derive getters:- Full lifetimes, generics and where clause support
- Advanced attributes:
#[gtor_const],#[gtor_copy],#[gtor_skip],#[phantom]and#[gtor]
Stor: Derive setters- Full lifetimes, generics and where clause support
- Skip setter with
#[stor_skip]or#[phantom]
Constdef: Derive constant, compile-time default implementations. See an example here
Default declaration syntax
The default declaration syntax is an alternative way to implement defaults for your structs (and enums soon). It looks like this:
- Use the default trait:
field: type - Use your specified expression:
field: type = expression
Here's an example:
use bagel::def;
def! {
#[derive(Debug)]
pub struct MyOven {
starting_temperature: u8,
increment_temp_by: u8 = 1,
oven_name: &'static str = "my_kitchen_wifi_oven1",
items_to_bake: [&'static str; 4] = [
"bagels",
"hashbrowns",
"cookies",
"pie",
],
people_buffer: Vec<String> = vec![
"one for Jamie".into(),
"another for Sophie".into()
],
}
}
let mut myoven = MyOven::default();
assert_eq!(myoven.starting_temperature, 0);
assert_eq!(myoven.oven_name, "my_kitchen_wifi_oven1");
assert_eq!(myoven.items_to_bake[3], "pie");
assert_eq!(myoven.people_buffer.len(), 2);
Constdef example
use bagel::Constdef;
#[derive(Constdef)]
struct Port {
requests: usize,
admin: bool,
}
#[derive(Constdef)]
struct PortLogger {
ports: [Port; 65536],
root_pid: usize,
}
const PORT_LOGGER: PortLogger = PortLogger::default();
assert_eq!(PORT_LOGGER.ports[0].requests, 0);
assert_eq!(PORT_LOGGER.ports[65535].admin, false);
License
The dough and bagel libraries are distributed under the Apache-2.0 License.
Dependencies
~1.5MB
~39K SLoC