4 releases
0.1.3 | Jul 5, 2022 |
---|---|
0.1.2 | Jul 4, 2022 |
0.1.1 | Jul 4, 2022 |
0.1.0 | Jul 4, 2022 |
#2459 in Rust patterns
18KB
253 lines
🥯 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 elidePhantomData
fields#[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
~38K SLoC