Skip to main content

miden_mast_package/dependency/
mod.rs

1use alloc::string::ToString;
2
3use miden_core::serde::{
4    ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable,
5};
6
7use crate::{PackageId, TargetType, Version, Word};
8
9/// A package dependency
10#[derive(Debug, Clone, PartialEq, Eq)]
11#[cfg_attr(any(test, feature = "arbitrary"), derive(proptest_derive::Arbitrary))]
12#[cfg_attr(
13    all(feature = "arbitrary", test),
14    miden_test_serialization_macros::serialization_test
15)]
16pub struct Dependency {
17    /// The package id of the dependency.
18    pub name: PackageId,
19    /// The type of package depended on.
20    pub kind: TargetType,
21    /// The semantic version of the dependency.
22    #[cfg_attr(any(test, feature = "arbitrary"), proptest(value = "Version::new(0, 0, 0)"))]
23    pub version: Version,
24    /// The digest of the dependency.
25    /// Serves as an ultimate source of truth for identifying the dependency.
26    #[cfg_attr(any(test, feature = "arbitrary"), proptest(value = "Word::default()"))]
27    pub digest: Word,
28}
29
30impl Dependency {
31    /// Returns the dependency name.
32    pub fn id(&self) -> &PackageId {
33        &self.name
34    }
35
36    /// Returns the dependency semantic version.
37    pub fn version(&self) -> &Version {
38        &self.version
39    }
40}
41
42impl Serializable for Dependency {
43    fn write_into<W: ByteWriter>(&self, target: &mut W) {
44        self.name.write_into(target);
45        self.kind.write_into(target);
46        self.version.to_string().write_into(target);
47        self.digest.write_into(target);
48    }
49}
50
51impl Deserializable for Dependency {
52    fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
53        let name = PackageId::read_from(source)?;
54        let kind = TargetType::read_from(source)?;
55        let version = alloc::string::String::read_from(source)?
56            .parse::<Version>()
57            .map_err(|err| DeserializationError::InvalidValue(err.to_string()))?;
58        let digest = Word::read_from(source)?;
59        Ok(Self { name, kind, version, digest })
60    }
61}