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.
bagel = "0.1"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
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);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);The dough and bagel libraries are distributed under the Apache-2.0 License.