Skip to main content

kernels_data/config/
compat.rs

1use eyre::Result;
2use serde::Deserialize;
3use serde_value::Value;
4
5use super::{v1, v2, v3, Build};
6
7#[derive(Debug)]
8#[allow(clippy::large_enum_variant)]
9pub enum BuildCompat {
10    V1(v1::Build),
11    V2(v2::Build),
12    V3(v3::Build),
13}
14
15impl<'de> Deserialize<'de> for BuildCompat {
16    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
17    where
18        D: serde::Deserializer<'de>,
19    {
20        let value = Value::deserialize(deserializer)?;
21
22        v1::Build::deserialize(value.clone())
23            .map(BuildCompat::V1)
24            .or_else(|_| v2::Build::deserialize(value.clone()).map(BuildCompat::V2))
25            .or_else(|_| v3::Build::deserialize(value.clone()).map(BuildCompat::V3))
26            .map_err(serde::de::Error::custom)
27    }
28}
29
30impl TryFrom<BuildCompat> for Build {
31    type Error = eyre::Error;
32
33    fn try_from(compat: BuildCompat) -> Result<Self> {
34        match compat {
35            BuildCompat::V1(v1_build) => v1_build.try_into(),
36            BuildCompat::V2(v2_build) => v2_build.try_into(),
37            BuildCompat::V3(v3_build) => Ok(v3_build.into()),
38        }
39    }
40}