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