serde icon indicating copy to clipboard operation
serde copied to clipboard

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

Open Scripter17 opened this issue 1 year ago • 3 comments

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()}}.

Scripter17 avatar Feb 06 '24 08:02 Scripter17

Great so if I go to a different issue on github mobile and close it it has a chance of closing a random issue

Got it

Great

Scripter17 avatar Feb 17 '24 06:02 Scripter17

Related to #2233 #2508 #2706 Will this get fixed by #2509 or #2520? #2295 also looks promising.

iTitus avatar May 04 '24 21:05 iTitus

The first and third PRs would definitely fix this. I'm not quite awake enough to make heads or tails of the second one but it seems to also handle this.

Scripter17 avatar May 05 '24 00:05 Scripter17