1
1
//! The serialization format of `Package` is as follows:
2
2
//!
3
- //! (Metadata)
4
- //! - `MAGIC_PACKAGE`
5
- //! - `VERSION`
3
+ //! #### Header
4
+ //! - `MAGIC_PACKAGE`, a 4-byte tag, followed by a NUL-byte, i.e. `b"\0"`
5
+ //! - `VERSION`, a 3-byte semantic version number, 1 byte for each component, i.e. MAJ.MIN.PATCH
6
6
//!
7
- //! (Package Name)
7
+ //! #### Metadata
8
8
//! - `name` (`String`)
9
+ //! - `version` (optional, [`miden_assembly_syntax::Version`] serialized as a `String`)
10
+ //! - `description` (optional, `String`)
9
11
//!
10
- //! (MAST Artifact)
11
- //! - `mast` (` MastArtifact`)
12
+ //! #### Code
13
+ //! - `mast` (see [`crate:: MastArtifact`] )
12
14
//!
13
- //! The serialization format of `MastArtifact` is:
14
- //! - `tag` (`[u8; 4]`)
15
- //! - `MAGIC_PROGRAM` if the artifact is a `Program`
16
- //! - `MAGIC_LIBRARY` if the artifact is a `Library`
17
- //! - If `Program`:
18
- //! - `program` (`Program`)
19
- //! - If `Library`:
20
- //! - `library` (`Library`)
15
+ //! #### Manifest
16
+ //! - `manifest` (see [`crate::PackageManifest`])
21
17
//!
22
- //! (Package Manifest)
23
- //! - `manifest` (`PackageManifest`)
24
- //!
25
- //! The serialization format of `PackageManifest` is:
26
- //! - `exports_len` (`usize`)
27
- //! - For each export:
28
- //! - `export` (`PackageExport`)
29
- //! - `name` (`QualifiedProcedureName`)
30
- //! - `digest` (`Word`)
31
- //! - `dependencies_len` (`usize`)
32
- //! - For each dependency:
33
- //! - `dependency` (`Dependency`)
34
- //! - `name` (`String`)
35
- //! - `digest` (`Word`)
36
-
37
- use alloc:: { collections:: BTreeMap , format, string:: String , sync:: Arc , vec:: Vec } ;
18
+ //! #### Custom Sections
19
+ //! - `sections` (a vector of zero or more [`crate::Section`])
20
+
21
+ use alloc:: {
22
+ collections:: BTreeMap ,
23
+ format,
24
+ string:: { String , ToString } ,
25
+ sync:: Arc ,
26
+ vec:: Vec ,
27
+ } ;
38
28
39
29
use miden_assembly_syntax:: {
40
30
Library ,
@@ -77,6 +67,12 @@ impl Serializable for Package {
77
67
// Write package name
78
68
self . name . write_into ( target) ;
79
69
70
+ // Write package version
71
+ self . version . as_ref ( ) . map ( |v| v. to_string ( ) ) . write_into ( target) ;
72
+
73
+ // Write package description
74
+ self . description . write_into ( target) ;
75
+
80
76
// Write MAST artifact
81
77
self . mast . write_into ( target) ;
82
78
@@ -111,6 +107,19 @@ impl Deserializable for Package {
111
107
// Read package name
112
108
let name = String :: read_from ( source) ?;
113
109
110
+ // Read package version
111
+ let version = Option :: < String > :: read_from ( source) ?;
112
+ let version = match version {
113
+ Some ( version) => Some (
114
+ crate :: Version :: parse ( & version)
115
+ . map_err ( |err| DeserializationError :: InvalidValue ( err. to_string ( ) ) ) ?,
116
+ ) ,
117
+ None => None ,
118
+ } ;
119
+
120
+ // Read package description
121
+ let description = Option :: < String > :: read_from ( source) ?;
122
+
114
123
// Read MAST artifact
115
124
let mast = MastArtifact :: read_from ( source) ?;
116
125
@@ -125,7 +134,14 @@ impl Deserializable for Package {
125
134
sections. push ( section) ;
126
135
}
127
136
128
- Ok ( Self { name, mast, manifest, sections } )
137
+ Ok ( Self {
138
+ name,
139
+ version,
140
+ description,
141
+ mast,
142
+ manifest,
143
+ sections,
144
+ } )
129
145
}
130
146
}
131
147
0 commit comments