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