use serde::Deserialize;
use crate::key_type::{KeyScheme, KeyType};
fn leak_slice<T>(v: Vec<T>) -> &'static [T] {
Box::leak(v.into_boxed_slice())
}
#[derive(Deserialize)]
#[serde(tag = "type", content = "data")]
enum KeySchemeWire {
Typed(Vec<KeyType>),
Bytes,
}
impl<'de> Deserialize<'de> for KeyScheme {
fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
let w = KeySchemeWire::deserialize(d)?;
Ok(match w {
KeySchemeWire::Typed(v) => KeyScheme::Typed(leak_slice(v)),
KeySchemeWire::Bytes => KeyScheme::Bytes,
})
}
}