字段的默认值

use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct Request {
    // 如果输入中没有包含 "resource",则将一个函数的结果用作默认值。
    #[serde(default = "default_resource")]
    resource: String,

    // 如果输入中没有包含 "timeout",则使用类型实现的std::default::Default 作为默认值。
    #[serde(default)]
    timeout: Timeout,

    // 如果输入中没有包含 "priority",则使用类型的方法作为默认值。这也可以是一个特质方法。
    #[serde(default = "Priority::lowest")]
    priority: Priority,
}

fn default_resource() -> String {
    "/".to_string()
}

/// 超时时间(秒)。
#[derive(Deserialize, Debug)]
struct Timeout(u32);
impl Default for Timeout {
    fn default() -> Self {
        Timeout(30)
    }
}

#[derive(Deserialize, Debug)]
enum Priority { ExtraHigh, High, Normal, Low, ExtraLow }
impl Priority {
    fn lowest() -> Self { Priority::ExtraLow }
}

fn main() {
    let json = r#"
        [
          {
            "resource": "/users"
          },
          {
            "timeout": 5,
            "priority": "High"
          }
        ]
    "#;

    let requests: Vec<Request> = serde_json::from_str(json).unwrap();

    // 第一个请求的 resource 为 "/users",timeout 为 30,priority为ExtraLow
    println!("{:?}", requests[0]);

    // 第二个请求的 resource 为 "/",timeout 为 5,priority 为 sHigh
    println!("{:?}", requests[1]);
}