kernels_data/config/
compat.rs1use 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}