Десериализация JSON с несколькими возможными значениями с помощью ржавчины

Итак, я пишу программу на Rust (в которой я новичок), которая читает файл конфигурации json и делает некоторые вещи в зависимости от ввода. Мне удалось успешно проанализировать json с помощью serde_json. Следующее, что я хочу разрешить пользователю, - это указать некоторые дополнительные параметры, но я не знаю, как анализировать ввод. По умолчанию json будет выглядеть примерно так:

{
  value: true
}

Анализируя это, можно получить такую ​​структуру:

#[derive(Deserialize)]
pub struct Config {
  value: bool
}

Как мне добавить параметр, позволяющий пользователю вводить bool или object как таковые:

{
  value: {
    avanced_value: true
  }
}

Я пробовал использовать такой enum, но кажется, что bool нельзя использовать в перечислении.

#[derive(Deserialize)]
pub struct Config {
  value: ValueEnum
}

#[derive(Deserialize)]
pub enum ValueEnum {
  bool,
  Config(ValueConfig),
}

#[derive(Deserialize)]
pub struct ValueConfig {
  advanced_value: bool
}

Я упустил что-то очевидное или мне нужно реструктурировать входной json? Tnx заранее.


person Pasteta    schedule 18.09.2020    source источник
comment


Ответы (1)


Вы не обернули bool в вариант перечисления (как вы это сделали с ValueConfig). Также по умолчанию теги serde перечисляются, что, вероятно, не то, что вам нужно. Вы хотите использовать немаркированное перечисление:

#[derive(Deserialize)]
pub struct Config {
  value: ValueEnum
}

#[derive(Deserialize)]
#[serde(untagged)]
pub enum ValueEnum {
  Bool(bool),
  Config(ValueConfig),
}

#[derive(Deserialize)]
pub struct ValueConfig {
  advanced_value: bool
}
person uanirudhx    schedule 18.09.2020
comment
Спасибо! Мне не хватало немаркированной опции от serde. Теперь он работает! - person Pasteta; 19.09.2020