Skip to content

Commit 882d225

Browse files
committed
Support for writing hugr-model envelopes in python.
1 parent 6da0c78 commit 882d225

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

hugr-py/src/hugr/envelope.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
from dataclasses import dataclass
3636
from enum import Enum
3737
from typing import TYPE_CHECKING, ClassVar
38+
import json
3839

3940
import zstd
4041

@@ -53,13 +54,19 @@ def make_envelope(package: Package, config: EnvelopeConfig) -> bytes:
5354
payload: bytes
5455
match config.format:
5556
case EnvelopeFormat.JSON:
56-
json = package._to_serial().model_dump_json()
57+
json_str = package._to_serial().model_dump_json()
5758
# This introduces an extra encode/decode roundtrip when calling
5859
# `make_envelope_str`, but we prioritize speed for binary formats.
59-
payload = json.encode("utf-8")
60-
case EnvelopeFormat.MODULE | EnvelopeFormat.MODULE_WITH_EXTS:
61-
msg = "MODULE encoding of HUGR envelopes is not supported yet."
62-
raise ValueError(msg)
60+
payload = json_str.encode("utf-8")
61+
62+
case EnvelopeFormat.MODULE:
63+
return bytes(package.to_model())
64+
65+
case EnvelopeFormat.MODULE_WITH_EXTS:
66+
package_bytes = bytes(package.to_model())
67+
extension_str = json.dumps([ext.model_dump() for ext in package.extensions])
68+
extension_bytes = extension_str.encode("utf8")
69+
return package_bytes + extension_bytes
6370

6471
if config.zstd is not None:
6572
payload = zstd.compress(payload, config.zstd)

hugr-py/src/hugr/package.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def _deprecated(func):
2525
read_envelope_str,
2626
)
2727
from hugr.ops import FuncDecl, FuncDefn, Op
28+
import hugr.model as model
2829

2930
if TYPE_CHECKING:
3031
from hugr.ext import Extension
@@ -127,6 +128,13 @@ def from_json(cls, json_str: str) -> Package:
127128
"""
128129
return ext_s.Package.model_validate_json(json_str).deserialize()
129130

131+
def to_model(self) -> model.Package:
132+
"""Export the package as its hugr model representation.
133+
134+
At the moment this does not yet contain the extensions.
135+
"""
136+
return model.Package([module.to_model() for module in self.modules])
137+
130138

131139
@dataclass(frozen=True)
132140
class PackagePointer:

0 commit comments

Comments
 (0)