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 #[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}