use std::{fs::File, io::Read, path::Path};
use crate::{LoadingError, versioned::VersionedStorage};
pub fn load_rustdoc(
path: &Path,
metadata: Option<cargo_metadata::Metadata>,
) -> Result<VersionedStorage, LoadingError> {
let package = metadata.map(super::get_package_metadata).transpose()?;
let mut file_data = String::new();
File::open(path)
.map_err(|e| LoadingError::RustdocIoError(path.display().to_string(), e))?
.read_to_string(&mut file_data)
.map_err(|e| LoadingError::RustdocIoError(path.display().to_string(), e))?;
let format_version = super::detect_rustdoc_format_version(path, &file_data)?;
match format_version {
#[cfg(feature = "v56")]
56 => {
let rustdoc: trustfall_rustdoc_adapter_v56::Crate =
super::parse_or_report_error(path, &file_data, format_version)?;
match package {
Some(package) => Ok(VersionedStorage::V56(
trustfall_rustdoc_adapter_v56::PackageStorage::from_rustdoc_and_package(
rustdoc, package,
),
)),
None => Ok(VersionedStorage::V56(
trustfall_rustdoc_adapter_v56::PackageStorage::from_rustdoc(rustdoc),
)),
}
}
#[cfg(feature = "v57")]
57 => {
let rustdoc: trustfall_rustdoc_adapter_v57::Crate =
super::parse_or_report_error(path, &file_data, format_version)?;
match package {
Some(package) => Ok(VersionedStorage::V57(
trustfall_rustdoc_adapter_v57::PackageStorage::from_rustdoc_and_package(
rustdoc, package,
),
)),
None => Ok(VersionedStorage::V57(
trustfall_rustdoc_adapter_v57::PackageStorage::from_rustdoc(rustdoc),
)),
}
}
#[cfg(feature = "v60")]
60 => {
let rustdoc: trustfall_rustdoc_adapter_v60::Crate =
super::parse_or_report_error(path, &file_data, format_version)?;
match package {
Some(package) => Ok(VersionedStorage::V60(
trustfall_rustdoc_adapter_v60::PackageStorage::from_rustdoc_and_package(
rustdoc, package,
),
)),
None => Ok(VersionedStorage::V60(
trustfall_rustdoc_adapter_v60::PackageStorage::from_rustdoc(rustdoc),
)),
}
}
_ => Err(LoadingError::UnsupportedFormat(
format_version,
path.display().to_string(),
)),
}
}