Skip to content

Commit 7d2f4e6

Browse files
committed
Fix untagged enum deserialization
1 parent a06d229 commit 7d2f4e6

File tree

1 file changed

+32
-2
lines changed

1 file changed

+32
-2
lines changed

crates/rust-analyzer/src/config.rs

+32-2
Original file line numberDiff line numberDiff line change
@@ -1241,6 +1241,36 @@ macro_rules! create_bool_or_string_de {
12411241
create_bool_or_string_de!(true_or_always<true, "always">);
12421242
create_bool_or_string_de!(false_or_never<false, "never">);
12431243

1244+
macro_rules! named_unit_variant {
1245+
($variant:ident) => {
1246+
pub fn $variant<'de, D>(deserializer: D) -> Result<(), D::Error>
1247+
where
1248+
D: serde::Deserializer<'de>,
1249+
{
1250+
struct V;
1251+
impl<'de> serde::de::Visitor<'de> for V {
1252+
type Value = ();
1253+
fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1254+
f.write_str(concat!("\"", stringify!($variant), "\""))
1255+
}
1256+
fn visit_str<E: serde::de::Error>(self, value: &str) -> Result<Self::Value, E> {
1257+
if value == stringify!($variant) {
1258+
Ok(())
1259+
} else {
1260+
Err(E::invalid_value(serde::de::Unexpected::Str(value), &self))
1261+
}
1262+
}
1263+
}
1264+
deserializer.deserialize_str(V)
1265+
}
1266+
};
1267+
}
1268+
1269+
mod de_unit_v {
1270+
named_unit_variant!(all);
1271+
named_unit_variant!(skip_trivial);
1272+
}
1273+
12441274
#[derive(Deserialize, Debug, Clone, Copy)]
12451275
#[serde(rename_all = "snake_case")]
12461276
enum SnippetScopeDef {
@@ -1332,21 +1362,21 @@ enum CallableCompletionDef {
13321362
}
13331363

13341364
#[derive(Deserialize, Debug, Clone)]
1335-
#[serde(rename_all = "snake_case")]
13361365
#[serde(untagged)]
13371366
enum CargoFeatures {
1367+
#[serde(deserialize_with = "de_unit_v::all")]
13381368
All,
13391369
Listed(Vec<String>),
13401370
}
13411371

13421372
#[derive(Deserialize, Debug, Clone)]
1343-
#[serde(rename_all = "snake_case")]
13441373
#[serde(untagged)]
13451374
enum LifetimeElisionDef {
13461375
#[serde(deserialize_with = "true_or_always")]
13471376
Always,
13481377
#[serde(deserialize_with = "false_or_never")]
13491378
Never,
1379+
#[serde(deserialize_with = "de_unit_v::skip_trivial")]
13501380
SkipTrivial,
13511381
}
13521382

0 commit comments

Comments
 (0)