@@ -46,7 +46,7 @@ pub mod serde_with;
4646pub use header:: { EnvelopeConfig , EnvelopeFormat , EnvelopeHeader , MAGIC_NUMBERS , ZstdConfig } ;
4747pub use package_json:: PackageEncodingError ;
4848
49- use crate :: envelope:: description:: PackageDesc ;
49+ use crate :: envelope:: description:: { Described , DescribedPackage , PackageDesc } ;
5050use crate :: envelope:: header:: HeaderError ;
5151use crate :: extension:: resolution:: ExtensionResolutionError ;
5252use crate :: { Hugr , HugrView } ;
@@ -157,7 +157,7 @@ pub fn read_envelope(
157157) -> Result < ( EnvelopeConfig , Package ) , EnvelopeError > {
158158 let reader = EnvelopeReader :: new ( reader, registry) ?;
159159 let config = reader. description ( ) . header . config ( ) ;
160- let package = reader. read ( ) . 1 ?;
160+ let package = reader. read ( ) . into_parts ( ) . 0 ?;
161161
162162 Ok ( ( config, package) )
163163}
@@ -174,39 +174,50 @@ pub fn read_envelope(
174174pub fn read_described_envelope (
175175 reader : impl BufRead ,
176176 registry : & ExtensionRegistry ,
177- ) -> Result < ( PackageDesc , Package ) , ReadError > {
178- let reader = EnvelopeReader :: new ( reader, registry) . map_err ( Box :: new) ?;
179- let ( desc, res) = reader. read ( ) ;
180- match res {
181- Ok ( pkg) => Ok ( ( desc, pkg) ) ,
182- Err ( e) => Err ( ReadError :: Payload {
183- source : Box :: new ( e) ,
184- partial_description : desc,
177+ ) -> Result < DescribedPackage , ReadError > {
178+ let reader = EnvelopeReader :: new ( reader, registry) ?;
179+ let res = reader. read ( ) ;
180+ match res. as_ref ( ) {
181+ Ok ( _) => Ok ( res. map ( Result :: unwrap) ) ,
182+ Err ( _) => Err ( ReadError :: Payload {
183+ inner : res. map ( |r| Box :: new ( r. expect_err ( "matched on error" ) ) ) ,
185184 } ) ,
186185 }
187186}
188187
189188/// Errors during reading a HUGR envelope.
190- #[ derive( Debug , Error ) ]
189+ #[ derive( Debug , derive_more:: Display ) ]
190+ #[ non_exhaustive]
191191pub enum ReadError {
192192 /// Error reading the envelope header.
193- #[ error( transparent) ]
194- EnvelopeHeader ( #[ from] Box < HeaderError > ) ,
193+ EnvelopeHeader ( Box < HeaderError > ) ,
195194 /// Error reading the package payload.
196- #[ error ( "Error reading package payload in envelope." ) ]
195+ #[ display ( "Error reading package payload in envelope." ) ]
197196 Payload {
198197 /// The source error.
199- source : Box < PayloadError > ,
200- /// Partial description of the envelope read before the error occurred.
201- partial_description : PackageDesc ,
198+ inner : Described < Box < PayloadError > , PackageDesc > ,
202199 } ,
203200}
201+ impl From < HeaderError > for ReadError {
202+ fn from ( err : HeaderError ) -> Self {
203+ ReadError :: EnvelopeHeader ( Box :: new ( err) )
204+ }
205+ }
206+
207+ impl std:: error:: Error for ReadError {
208+ fn source ( & self ) -> Option < & ( dyn std:: error:: Error + ' static ) > {
209+ match self {
210+ ReadError :: EnvelopeHeader ( e) => Some ( & * * e) ,
211+ ReadError :: Payload { inner } => Some ( & * * inner. as_ref ( ) ) ,
212+ }
213+ }
214+ }
204215
205216impl From < ReadError > for EnvelopeError {
206217 fn from ( err : ReadError ) -> Self {
207218 match err {
208219 ReadError :: EnvelopeHeader ( e) => ( * e) . into ( ) ,
209- ReadError :: Payload { source , .. } => ( * source ) . into ( ) ,
220+ ReadError :: Payload { inner } => ( * ( inner . into_inner ( ) ) ) . into ( ) ,
210221 }
211222 }
212223}
@@ -650,12 +661,12 @@ pub(crate) mod test {
650661 }
651662 }
652663
653- let ( desc , new_package ) =
664+ let desc_pkg =
654665 read_described_envelope ( BufReader :: new ( buffer. as_slice ( ) ) , & PRELUDE_REGISTRY ) . unwrap ( ) ;
655- let decoded_config = desc . header . config ( ) ;
666+ let decoded_config = desc_pkg . description ( ) . header . config ( ) ;
656667 assert_eq ! ( config. format, decoded_config. format) ;
657668 assert_eq ! ( config. zstd. is_some( ) , decoded_config. zstd. is_some( ) ) ;
658- assert_eq ! ( package, new_package ) ;
669+ assert_eq ! ( & package, desc_pkg . as_ref ( ) ) ;
659670 }
660671
661672 #[ rstest]
@@ -679,14 +690,14 @@ pub(crate) mod test {
679690 let config = EnvelopeConfig { format, zstd : None } ;
680691 package. store ( & mut buffer, config) . unwrap ( ) ;
681692
682- let ( desc , new_package ) =
693+ let desc_pkg =
683694 read_described_envelope ( BufReader :: new ( buffer. as_slice ( ) ) , & PRELUDE_REGISTRY ) . unwrap ( ) ;
684- let decoded_config = desc . header . config ( ) ;
695+ let decoded_config = desc_pkg . description ( ) . header . config ( ) ;
685696
686697 assert_eq ! ( config. format, decoded_config. format) ;
687698 assert_eq ! ( config. zstd. is_some( ) , decoded_config. zstd. is_some( ) ) ;
688699
689- assert_eq ! ( package, new_package ) ;
700+ assert_eq ! ( & package, desc_pkg . as_ref ( ) ) ;
690701 }
691702
692703 /// Test helper to call `check_breaking_extensions_against_registry`
0 commit comments