use serde::{Deserialize, Serialize};
use strum_macros::AsRefStr;
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq, Hash)]
#[serde(rename_all = "camelCase")]
pub struct Relationship {
pub spdx_element_id: String,
pub related_spdx_element: String,
pub relationship_type: RelationshipType,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub comment: Option<String>,
}
impl Relationship {
pub fn new(
spdx_element_id: &str,
related_spdx_element: &str,
relationship_type: RelationshipType,
comment: Option<String>,
) -> Self {
Self {
spdx_element_id: spdx_element_id.to_string(),
related_spdx_element: related_spdx_element.to_string(),
relationship_type,
comment,
}
}
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone, AsRefStr, Eq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum RelationshipType {
Describes,
DescribedBy,
Contains,
ContainedBy,
DependsOn,
DependencyOf,
DependencyManifestOf,
BuildDependencyOf,
DevDependencyOf,
OptionalDependencyOf,
ProvidedDependencyOf,
TestDependencyOf,
RuntimeDependencyOf,
ExampleOf,
Generates,
GeneratedFrom,
AncestorOf,
DescendantOf,
VariantOf,
DistributionArtifact,
PatchFor,
PatchApplied,
CopyOf,
FileAdded,
FileDeleted,
FileModified,
ExpandedFromArchive,
DynamicLink,
StaticLink,
DataFileOf,
TestCaseOf,
BuildToolOf,
DevToolOf,
TestOf,
TestToolOf,
DocumentationOf,
OptionalComponentOf,
MetafileOf,
PackageOf,
Amends,
PrerequisiteFor,
HasPrerequisite,
RequirementDescriptionFor,
SpecificationFor,
Other,
}
#[cfg(test)]
mod test {
use std::fs::read_to_string;
use crate::models::SPDX;
use super::*;
#[test]
fn spdx_element_id() {
let spdx: SPDX = serde_json::from_str(
&read_to_string("tests/data/SPDXJSONExample-v2.2.spdx.json").unwrap(),
)
.unwrap();
assert_eq!(
spdx.relationships[0].spdx_element_id,
"SPDXRef-DOCUMENT".to_string()
);
}
#[test]
fn related_spdx_element() {
let spdx: SPDX = serde_json::from_str(
&read_to_string("tests/data/SPDXJSONExample-v2.2.spdx.json").unwrap(),
)
.unwrap();
assert_eq!(
spdx.relationships[0].related_spdx_element,
"SPDXRef-Package".to_string()
);
}
#[test]
fn relationship_type() {
let spdx: SPDX = serde_json::from_str(
&read_to_string("tests/data/SPDXJSONExample-v2.2.spdx.json").unwrap(),
)
.unwrap();
assert_eq!(
spdx.relationships[0].relationship_type,
RelationshipType::Contains
);
assert_eq!(
spdx.relationships[2].relationship_type,
RelationshipType::CopyOf
);
}
}