pub mod v55;
pub mod v56;
use anyhow::{Context, Result};
use rustdoc_types::{Crate, FORMAT_VERSION};
use sonic_rs::JsonValueTrait;
pub fn load_and_normalize(json: &[u8], format_version: Option<u32>) -> Result<Crate> {
let format_version = if let Some(format_version) = format_version {
format_version
} else {
let format_version_value = sonic_rs::get_from_slice(json, &["format_version"])
.context("Failed to extract format_version")?;
format_version_value
.as_u64()
.context("format_version is not a valid u64")? as u32
};
match format_version {
FORMAT_VERSION => {
sonic_rs::serde::from_slice(json).context("Failed to parse as current format")
}
56 => {
let crate_56: rustdoc_types_56::Crate = sonic_rs::serde::from_slice(json)
.context("Failed to parse as format version 56")?;
v56::convert_crate(crate_56)
}
55 => {
let crate_55: rustdoc_types_55::Crate = sonic_rs::serde::from_slice(json)
.context("Failed to parse as format version 55")?;
let crate_56 = v55::convert_crate(crate_55).context("Failed to convert v55 to v56")?;
v56::convert_crate(crate_56)
}
v if v < 55 => {
anyhow::bail!(
"Format version {} is too old. Minimum supported version: 55, current version: {}",
v,
FORMAT_VERSION
)
}
v => {
anyhow::bail!(
"Format version {} is too new. Maximum supported version: {}",
v,
FORMAT_VERSION
)
}
}
}