hugr_core/envelope/
package_json.rs1#![allow(deprecated)] use derive_more::{Display, Error, From};
5use std::io;
6
7use crate::extension::ExtensionRegistry;
8use crate::extension::resolution::ExtensionResolutionError;
9
10use crate::{Extension, Hugr};
11
12pub(super) fn to_json_writer<'h>(
14 hugrs: impl IntoIterator<Item = &'h Hugr>,
15 extensions: &ExtensionRegistry,
16 writer: impl io::Write,
17) -> Result<(), PackageEncodingError> {
18 let pkg_ser = PackageSer {
19 modules: hugrs.into_iter().map(HugrSer).collect(),
20 extensions: extensions.iter().map(std::convert::AsRef::as_ref).collect(),
21 };
22
23 #[cfg(all(test, not(miri)))]
28 if std::env::var("HUGR_TEST_SCHEMA").is_ok_and(|x| !x.is_empty()) {
29 use crate::hugr::serialize::test::check_hugr_serialization_schema;
30
31 for hugr in &pkg_ser.modules {
32 check_hugr_serialization_schema(hugr.0);
33 }
34 }
35
36 serde_json::to_writer(writer, &pkg_ser)?;
37 Ok(())
38}
39
40#[derive(Debug, Display, Error, From)]
42#[non_exhaustive]
43#[display("Error reading or writing a package in JSON format.")]
44pub enum PackageEncodingError {
45 JsonEncoding(#[from] serde_json::Error),
47 IOError(#[from] io::Error),
49 ExtensionResolution(#[from] super::WithGenerator<ExtensionResolutionError>),
51 PackagedExtension(#[from] ExtensionResolutionError),
53}
54
55#[derive(Debug, serde::Serialize)]
60struct PackageSer<'h> {
61 pub modules: Vec<HugrSer<'h>>,
62 pub extensions: Vec<&'h Extension>,
63}
64#[derive(Debug, serde::Serialize)]
65#[serde(transparent)]
66struct HugrSer<'h>(#[serde(serialize_with = "Hugr::serde_serialize")] pub &'h Hugr);
67
68#[derive(Debug, serde::Deserialize)]
73pub(super) struct PackageDeser {
74 pub modules: Vec<HugrDeser>,
75 pub extensions: Vec<Extension>,
76}
77#[derive(Debug, serde::Deserialize)]
78#[serde(transparent)]
79pub(super) struct HugrDeser(#[serde(deserialize_with = "Hugr::serde_deserialize")] pub Hugr);