#default-value #struct-fields #optional #macro #macro-derive #initialization #helper

optional-default

帮助宏,允许为结构体的某些字段指定默认值

1个不稳定版本

0.1.0 2024年7月21日

1697过程宏

Download history 100/week @ 2024-07-18 44/week @ 2024-07-25 4/week @ 2024-08-01 1/week @ 2024-08-08

149 每月下载量
用于 deepseek-api-client

MIT 许可证

12KB
162

optional-default

帮助宏,允许为Rust结构体的一些字段指定默认值,同时要求其他字段手动初始化。

使用方法

optional-default添加到你的crate依赖项中:cargo add optional-default

  1. 使用OptionalDefault派生宏注解你的结构体。
  2. 使用#[optional]注解任何可选字段。
  3. 如果字段应该有除Default之外的其他默认值,或者其类型不实现Default特质,你可以在#[optional(default = <value>)]中指定自己的默认值。
  4. 该宏将生成一个与你的结构体同名的第二个宏。使用此宏初始化具有指定默认值的结构体

示例

use optional_default::OptionalDefault;

#[derive(Debug, OptionalDefault)]
struct Example {
    foo: i32, // Required field
    #[optional] 
    bar: i32 // Optional, default = i32::default() = 0
    #[optional(default = 10)]
    baz: i32, // Optional, default = 10
    
}

fn example() {
    // Use the macro as if it was a struct declaration
    let example1 = Example! {
        foo: 1 
        // The other fields are set to their default values
    };

    println!("{:?}", example1); // Example { foo:1, bar: 0, baz: 10 }

    let example2 = Example! {
        foo: 1,
        bar: 5
    };

    println!("{:?}", example2); // Example { foo:1, bar: 5, baz: 10 }

    let example3 = Example! {
        foo: 20,
        baz: 0 // You can override the default values
    };

    println!("{:?}", example1); // Example { foo:1, bar: 0, baz: 20 }

    let does_not_work = Example! {
        baz: 0  
    }; // Error: missing required field foo

}

限制

目前,该宏只能放置在结构体上。虽然可以将此方法实现为枚举,但初始化语法将与常规枚举初始化不一致,因为Enum::Variant不是一个有效的宏名。

依赖

~300–760KB
~18K SLoC