// SPDX-FileCopyrightText: 2020-2021 HH Partners
//
// SPDX-License-Identifier: MIT
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
///
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Annotation {
///
pub annotator: String,
///
pub annotation_date: DateTime,
///
pub annotation_type: AnnotationType,
///
// TODO: According to the spec this is mandatory, but the example file doesn't
// have it.
pub spdx_identifier_reference: Option,
///
#[serde(rename = "comment")]
pub annotation_comment: String,
}
impl Annotation {
pub fn new(
annotator: String,
annotation_date: DateTime,
annotation_type: AnnotationType,
spdx_identifier_reference: Option,
annotation_comment: String,
) -> Self {
Self {
annotator,
annotation_date,
annotation_type,
spdx_identifier_reference,
annotation_comment,
}
}
}
///
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone, Copy)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum AnnotationType {
Review,
Other,
}
#[cfg(test)]
mod test {
use std::fs::read_to_string;
use chrono::TimeZone;
use crate::models::SPDX;
use super::*;
#[test]
fn annotator() {
let spdx_file: SPDX = serde_json::from_str(
&read_to_string("tests/data/SPDXJSONExample-v2.2.spdx.json").unwrap(),
)
.unwrap();
assert_eq!(
spdx_file.annotations[0].annotator,
"Person: Jane Doe ()".to_string()
);
}
#[test]
fn annotation_date() {
let spdx_file: SPDX = serde_json::from_str(
&read_to_string("tests/data/SPDXJSONExample-v2.2.spdx.json").unwrap(),
)
.unwrap();
assert_eq!(
spdx_file.annotations[0].annotation_date,
Utc.ymd(2010, 1, 29).and_hms(18, 30, 22)
);
}
#[test]
fn annotation_type() {
let spdx_file: SPDX = serde_json::from_str(
&read_to_string("tests/data/SPDXJSONExample-v2.2.spdx.json").unwrap(),
)
.unwrap();
assert_eq!(
spdx_file.annotations[0].annotation_type,
AnnotationType::Other
);
}
#[test]
fn annotation_comment() {
let spdx_file: SPDX = serde_json::from_str(
&read_to_string("tests/data/SPDXJSONExample-v2.2.spdx.json").unwrap(),
)
.unwrap();
assert_eq!(
spdx_file.annotations[0].annotation_comment,
"Document level annotation"
);
}
}