Skip to main content

provenant/output_schema/
license_match.rs

1use crate::models::MatchScore;
2use serde::{Deserialize, Serialize};
3
4#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
5pub struct OutputMatch {
6    pub license_expression: String,
7    pub license_expression_spdx: String,
8    #[serde(skip_serializing_if = "Option::is_none")]
9    pub from_file: Option<String>,
10    pub start_line: u64,
11    pub end_line: u64,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub matcher: Option<String>,
14    pub score: MatchScore,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub matched_length: Option<usize>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub match_coverage: Option<f64>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub rule_relevance: Option<u8>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub rule_identifier: Option<String>,
23    pub rule_url: Option<String>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub matched_text: Option<String>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub matched_text_diagnostics: Option<String>,
28    #[serde(skip_serializing_if = "Option::is_none", default)]
29    pub referenced_filenames: Option<Vec<String>>,
30}
31
32impl From<&crate::models::Match> for OutputMatch {
33    fn from(value: &crate::models::Match) -> Self {
34        Self {
35            license_expression: value.license_expression.clone(),
36            license_expression_spdx: value.license_expression_spdx.clone(),
37            from_file: value.from_file.clone(),
38            start_line: value.start_line.get() as u64,
39            end_line: value.end_line.get() as u64,
40            matcher: value.matcher.clone(),
41            score: value.score,
42            matched_length: value.matched_length,
43            match_coverage: value.match_coverage,
44            rule_relevance: value.rule_relevance,
45            rule_identifier: value.rule_identifier.clone(),
46            rule_url: value.rule_url.clone(),
47            matched_text: value.matched_text.clone(),
48            matched_text_diagnostics: value.matched_text_diagnostics.clone(),
49            referenced_filenames: value.referenced_filenames.clone(),
50        }
51    }
52}
53
54impl TryFrom<&OutputMatch> for crate::models::Match {
55    type Error = String;
56    fn try_from(value: &OutputMatch) -> Result<Self, Self::Error> {
57        use crate::models::LineNumber;
58        let start_line = LineNumber::new(value.start_line as usize)
59            .ok_or_else(|| format!("invalid start_line: {}", value.start_line))?;
60        let end_line = LineNumber::new(value.end_line as usize)
61            .ok_or_else(|| format!("invalid end_line: {}", value.end_line))?;
62        Ok(Self {
63            license_expression: value.license_expression.clone(),
64            license_expression_spdx: value.license_expression_spdx.clone(),
65            from_file: value.from_file.clone(),
66            start_line,
67            end_line,
68            matcher: value.matcher.clone(),
69            score: value.score,
70            matched_length: value.matched_length,
71            match_coverage: value.match_coverage,
72            rule_relevance: value.rule_relevance,
73            rule_identifier: value.rule_identifier.clone(),
74            rule_url: value.rule_url.clone(),
75            matched_text: value.matched_text.clone(),
76            matched_text_diagnostics: value.matched_text_diagnostics.clone(),
77            referenced_filenames: value.referenced_filenames.clone(),
78        })
79    }
80}