Skip to content

Commit aedea70

Browse files
committed
feat(package): add optional version and description fields
1 parent 15f58df commit aedea70

File tree

4 files changed

+61
-33
lines changed

4 files changed

+61
-33
lines changed

assembly/src/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3313,7 +3313,7 @@ prop_compose! {
33133313

33143314
let manifest = PackageManifest::new(exports).with_dependencies(manifest.dependencies().cloned());
33153315

3316-
Package { name, mast, manifest, sections: Default::default() }
3316+
Package { name, version: None, description: None, mast, manifest, sections: Default::default() }
33173317
}
33183318
}
33193319

package/src/lib.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,8 @@ pub use self::{
2626
ResolvedDependency,
2727
},
2828
},
29-
package::{InvalidSectionIdError, Package, PackageExport, PackageManifest, Section, SectionId},
29+
package::{
30+
InvalidSectionIdError, Package, PackageExport, PackageManifest, Section, SectionId,
31+
Version, VersionError,
32+
},
3033
};

package/src/package/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ mod serialization;
55
use alloc::{format, string::String, sync::Arc, vec::Vec};
66

77
use miden_assembly_syntax::{Library, Report, ast::QualifiedProcedureName};
8+
pub use miden_assembly_syntax::{Version, VersionError};
89
use miden_core::{Program, Word};
910
#[cfg(feature = "serde")]
1011
use serde::{Deserialize, Serialize};
@@ -24,6 +25,12 @@ use crate::MastArtifact;
2425
pub struct Package {
2526
/// Name of the package
2627
pub name: String,
28+
/// An optional semantic version for the package
29+
#[cfg_attr(feature = "serde", serde(default))]
30+
pub version: Option<Version>,
31+
/// An optional description of the package
32+
#[cfg_attr(feature = "serde", serde(default))]
33+
pub description: Option<String>,
2734
/// The MAST artifact ([Program] or [Library]) of the package
2835
pub mast: MastArtifact,
2936
/// The package manifest, containing the set of exported procedures and their signatures,
@@ -98,6 +105,8 @@ impl Package {
98105

99106
Ok(Self {
100107
name: self.name.clone(),
108+
version: self.version.clone(),
109+
description: self.description.clone(),
101110
mast: MastArtifact::Executable(Arc::new(Program::new(
102111
library.mast_forest().clone(),
103112
node_id,

package/src/package/serialization.rs

Lines changed: 47 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,30 @@
11
//! The serialization format of `Package` is as follows:
22
//!
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
66
//!
7-
//! (Package Name)
7+
//! #### Metadata
88
//! - `name` (`String`)
9+
//! - `version` (optional, [`miden_assembly_syntax::Version`] serialized as a `String`)
10+
//! - `description` (optional, `String`)
911
//!
10-
//! (MAST Artifact)
11-
//! - `mast` (`MastArtifact`)
12+
//! #### Code
13+
//! - `mast` (see [`crate::MastArtifact`])
1214
//!
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`])
2117
//!
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+
};
3828

3929
use miden_assembly_syntax::{
4030
Library,
@@ -77,6 +67,12 @@ impl Serializable for Package {
7767
// Write package name
7868
self.name.write_into(target);
7969

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+
8076
// Write MAST artifact
8177
self.mast.write_into(target);
8278

@@ -111,6 +107,19 @@ impl Deserializable for Package {
111107
// Read package name
112108
let name = String::read_from(source)?;
113109

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+
114123
// Read MAST artifact
115124
let mast = MastArtifact::read_from(source)?;
116125

@@ -125,7 +134,14 @@ impl Deserializable for Package {
125134
sections.push(section);
126135
}
127136

128-
Ok(Self { name, mast, manifest, sections })
137+
Ok(Self {
138+
name,
139+
version,
140+
description,
141+
mast,
142+
manifest,
143+
sections,
144+
})
129145
}
130146
}
131147

0 commit comments

Comments
 (0)