use derive_more::{Display, Error};
use std::io;
use crate::extension::ExtensionRegistry;
use crate::extension::resolution::ExtensionResolutionError;
use crate::{Extension, Hugr};
#[deprecated(since = "0.27.0")]
#[expect(deprecated)]
pub(super) fn to_json_writer<'h>(
hugrs: impl IntoIterator<Item = &'h Hugr>,
extensions: &ExtensionRegistry,
writer: impl io::Write,
) -> Result<(), PackageEncodingError> {
let pkg_ser = PackageSer {
modules: hugrs.into_iter().map(HugrSer).collect(),
extensions: extensions.iter().map(std::convert::AsRef::as_ref).collect(),
};
#[cfg(all(test, not(miri)))]
if std::env::var("HUGR_TEST_SCHEMA").is_ok_and(|x| !x.is_empty()) {
use crate::hugr::serialize::test::check_hugr_serialization_schema;
for hugr in &pkg_ser.modules {
check_hugr_serialization_schema(hugr.0);
}
}
serde_json::to_writer(writer, &pkg_ser).map_err(PackageEncodingError::JsonEncoding)?;
Ok(())
}
#[derive(Debug, Display, Error)]
#[non_exhaustive]
#[display("Error reading or writing a package in JSON format.")]
pub enum PackageEncodingError {
JsonEncoding(serde_json::Error),
IOError(io::Error),
ExtensionResolution(ExtensionResolutionError),
PackagedExtension(ExtensionResolutionError),
}
#[derive(Debug, serde::Serialize)]
#[deprecated(since = "0.27.0")]
#[expect(deprecated)]
struct PackageSer<'h> {
pub modules: Vec<HugrSer<'h>>,
pub extensions: Vec<&'h Extension>,
}
#[derive(Debug, serde::Serialize)]
#[serde(transparent)]
#[deprecated(since = "0.27.0")]
struct HugrSer<'h>(#[serde(serialize_with = "Hugr::serde_serialize")] pub &'h Hugr);
#[derive(Debug, serde::Deserialize)]
#[deprecated(since = "0.27.0")]
pub(super) struct PackageDeser {
#[expect(deprecated)]
pub modules: Vec<HugrDeser>,
pub extensions: Vec<Extension>,
}
#[derive(Debug, serde::Deserialize)]
#[serde(transparent)]
#[deprecated(since = "0.27.0")]
pub(super) struct HugrDeser(#[serde(deserialize_with = "Hugr::serde_deserialize")] pub Hugr);