How to serialize/deserialize a two data types value?

Is there a way to do [dependencies.x] = { version = "y" } and [dependencies.x] = "y" in serde + toml?

Got unreachable with this:

use serde::{Serialize, Deserialize};

fn main() {
    let block = serde_json::from_str::<Block>("\"foo\"");
    let Ok(Block::Str(val)) = block else {
        unreachable!();
    };
    println!("{}", val);
}

#[derive(Debug, Serialize, Deserialize)]
enum Block {
    List(Vec<String>),
    Str(String),
}

Do you mean like this?

use serde::Deserialize;

#[derive(Deserialize, Debug, PartialEq)]
struct Config {
    dependencies: Dependencies,
}

#[derive(Deserialize, Debug, PartialEq)]
struct Dependencies {
    x: StringOrX,
}

#[derive(Deserialize, Debug, PartialEq)]
#[serde(untagged)]
enum StringOrX {
    String(String),
    X(X),
}

#[derive(Deserialize, Debug, PartialEq)]
struct X {
    version: String,
}

fn main() {
    let toml1 = r#"
        [dependencies.x]
        version = "v" 
    "#;

    let c: Config = toml::from_str(toml1).unwrap();

    assert_eq!(
        c,
        Config {
            dependencies: Dependencies {
                x: StringOrX::X(X {
                    version: "v".to_owned()
                })
            }
        }
    );

    let toml1 = r#"
        [dependencies]
        x = "v" 
    "#;

    let c: Config = toml::from_str(toml1).unwrap();

    assert_eq!(
        c,
        Config {
            dependencies: Dependencies {
                x: StringOrX::String("v".to_owned())
            }
        }
    );
}

Playground.

1 Like

Thanks!

1 Like

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.