mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-28 14:03:35 +00:00
Fix untagged enum deserialization
This commit is contained in:
parent
d6dba1c97c
commit
cb6032bdf4
1 changed files with 32 additions and 2 deletions
|
@ -1241,6 +1241,36 @@ macro_rules! create_bool_or_string_de {
|
||||||
create_bool_or_string_de!(true_or_always<true, "always">);
|
create_bool_or_string_de!(true_or_always<true, "always">);
|
||||||
create_bool_or_string_de!(false_or_never<false, "never">);
|
create_bool_or_string_de!(false_or_never<false, "never">);
|
||||||
|
|
||||||
|
macro_rules! named_unit_variant {
|
||||||
|
($variant:ident) => {
|
||||||
|
pub(super) fn $variant<'de, D>(deserializer: D) -> Result<(), D::Error>
|
||||||
|
where
|
||||||
|
D: serde::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
struct V;
|
||||||
|
impl<'de> serde::de::Visitor<'de> for V {
|
||||||
|
type Value = ();
|
||||||
|
fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
|
f.write_str(concat!("\"", stringify!($variant), "\""))
|
||||||
|
}
|
||||||
|
fn visit_str<E: serde::de::Error>(self, value: &str) -> Result<Self::Value, E> {
|
||||||
|
if value == stringify!($variant) {
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(E::invalid_value(serde::de::Unexpected::Str(value), &self))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
deserializer.deserialize_str(V)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
mod de_unit_v {
|
||||||
|
named_unit_variant!(all);
|
||||||
|
named_unit_variant!(skip_trivial);
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug, Clone, Copy)]
|
#[derive(Deserialize, Debug, Clone, Copy)]
|
||||||
#[serde(rename_all = "snake_case")]
|
#[serde(rename_all = "snake_case")]
|
||||||
enum SnippetScopeDef {
|
enum SnippetScopeDef {
|
||||||
|
@ -1332,21 +1362,21 @@ enum CallableCompletionDef {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug, Clone)]
|
#[derive(Deserialize, Debug, Clone)]
|
||||||
#[serde(rename_all = "snake_case")]
|
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
enum CargoFeatures {
|
enum CargoFeatures {
|
||||||
|
#[serde(deserialize_with = "de_unit_v::all")]
|
||||||
All,
|
All,
|
||||||
Listed(Vec<String>),
|
Listed(Vec<String>),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug, Clone)]
|
#[derive(Deserialize, Debug, Clone)]
|
||||||
#[serde(rename_all = "snake_case")]
|
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
enum LifetimeElisionDef {
|
enum LifetimeElisionDef {
|
||||||
#[serde(deserialize_with = "true_or_always")]
|
#[serde(deserialize_with = "true_or_always")]
|
||||||
Always,
|
Always,
|
||||||
#[serde(deserialize_with = "false_or_never")]
|
#[serde(deserialize_with = "false_or_never")]
|
||||||
Never,
|
Never,
|
||||||
|
#[serde(deserialize_with = "de_unit_v::skip_trivial")]
|
||||||
SkipTrivial,
|
SkipTrivial,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue