provenant/output_schema/
license_match.rs1use 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}