moxy-derive 0.0.2

derive macros for moxy crate
Documentation
use moxy_derive::Default;

#[derive(Default)]
struct User {
    #[moxy(default = "bob")]
    pub name: String,
    email: Option<String>,
}

#[test]
fn test_partial_annotation() {
    let user = User::default();

    assert_eq!(user.name, "bob");
    assert_eq!(user.email, None);
}

#[derive(Default)]
struct Server {
    #[moxy(default = "0.0.0.0")]
    pub bind: String,
    #[moxy(default = 8080u16)]
    pub port: u16,
    #[moxy(default = true)]
    pub tls: bool,
}

#[test]
fn test_all_fields_annotated() {
    let s = Server::default();

    assert_eq!(s.bind, "0.0.0.0");
    assert_eq!(s.port, 8080);
    assert_eq!(s.tls, true);
}

const MAX_RETRIES: u32 = 3;

#[derive(Default)]
struct Client {
    #[moxy(default = MAX_RETRIES)]
    pub retries: u32,
}

#[test]
fn test_constant_default() {
    let c = Client::default();
    assert_eq!(c.retries, 3);
}

#[derive(Default)]
struct Collection {
    #[moxy(default = Vec::new())]
    pub items: Vec<String>,
    #[moxy(default = "prefix".to_string())]
    pub label: String,
}

#[test]
fn test_expression_default() {
    let c = Collection::default();

    assert!(c.items.is_empty());
    assert_eq!(c.label, "prefix");
}

#[derive(Default)]
struct Container<T: std::default::Default> {
    #[moxy(default = 10u32)]
    pub capacity: u32,
    pub value: T,
}

#[test]
fn test_generic_struct() {
    let c: Container<String> = Container::default();

    assert_eq!(c.capacity, 10);
    assert_eq!(c.value, String::default());
}

#[derive(Default)]
struct Pair(#[moxy(default = "hello")] String, u32);

#[test]
fn test_tuple_struct() {
    let p = Pair::default();

    assert_eq!(p.0, "hello");
    assert_eq!(p.1, 0);
}

#[derive(Default)]
struct Marker;

#[test]
fn test_unit_struct() {
    let _ = Marker::default();
}