Skip to content

Externally tagged enum variants where all fields have #[serde(default)] should allow being written as a unit variant. #2691

@Scripter17

Description

@Scripter17

I'm building a program that takes URLs and strips all the tracking parameters and handles redirects and so on. One of the mappers is ExpandShortLink, which just sends a request to the URL being cleaned and returns the URL the server responded with.

I'm trying to support the case where a user wants to specify HTTP headers for a specific ExpandShortLink without requiring that all uses of ExpandShortLink have a default header map (I expect it to be a niche feature).

Basically, I have this code:

use serde::Deserialize;
use serde_json::from_str;
use std::collections::HashMap;

#[derive(Deserialize)]
struct Rule {
    // ...
    mapper: Mapper
}

#[derive(Deserialize)]
enum Mapper {
    // ...
    ExpandShortLink {
        #[serde(default)]
        headers: HashMap<String, String>
    }
}

fn main() {
    assert!(from_str::<Rule>("{\"mapper\": {\"ExpandShortLink\": {\"headers\": {}}}}").is_ok());
    assert!(from_str::<Rule>("{\"mapper\": \"ExpandShortLink\"}").is_ok());
}

I would like to have {"mapper": "ExpandShortLink"} and {"mapper": {"ExpandShortLink": {"headers": {}}}} both deserialize to Rule {mapper: Mapper::ExpandShortLink {headers: HashMap::new()}}.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions