16 lines
614 B
Rust
16 lines
614 B
Rust
![]() |
use serde::Serialize;
|
||
|
use serde_json::Value;
|
||
|
|
||
|
/// Extract the variant tag of any enum that uses Serde.
|
||
|
#[allow(dead_code)]
|
||
|
pub fn variant_name<T: Serialize>(v: &T) -> String {
|
||
|
// 1. Serialize to JSON Value.
|
||
|
match serde_json::to_value(v).unwrap() {
|
||
|
// internally-tagged: {"type": "Foo", ...}
|
||
|
Value::Object(ref map) if map.get("type").is_some() => map["type"].as_str().unwrap().to_string(),
|
||
|
// externally-tagged: {"Foo": {...}}
|
||
|
Value::Object(map) => map.keys().next().unwrap().as_str().to_string(),
|
||
|
_ => panic!("untagged enum or unsupported representation"),
|
||
|
}
|
||
|
}
|