provenant/output_schema/
copyright.rs1use serde::{Deserialize, Serialize};
5
6#[derive(Serialize, Deserialize, Debug, Clone)]
7pub struct OutputCopyright {
8 pub copyright: String,
9 pub start_line: u64,
10 pub end_line: u64,
11}
12
13impl From<&crate::models::Copyright> for OutputCopyright {
14 fn from(value: &crate::models::Copyright) -> Self {
15 Self::from_with_compat_mode(value, crate::cli::CompatibilityMode::Native)
16 }
17}
18
19impl OutputCopyright {
20 pub fn from_with_compat_mode(
21 value: &crate::models::Copyright,
22 mode: crate::cli::CompatibilityMode,
23 ) -> Self {
24 Self {
25 copyright: match mode {
26 crate::cli::CompatibilityMode::Native => value.copyright.clone(),
27 crate::cli::CompatibilityMode::Scancode => value.normalized_text().to_string(),
28 },
29 start_line: value.start_line.get() as u64,
30 end_line: value.end_line.get() as u64,
31 }
32 }
33}
34
35impl TryFrom<&OutputCopyright> for crate::models::Copyright {
36 type Error = String;
37 fn try_from(value: &OutputCopyright) -> Result<Self, Self::Error> {
38 use crate::models::LineNumber;
39 let start_line = LineNumber::new(value.start_line as usize)
40 .ok_or_else(|| format!("invalid start_line: {}", value.start_line))?;
41 let end_line = LineNumber::new(value.end_line as usize)
42 .ok_or_else(|| format!("invalid end_line: {}", value.end_line))?;
43 Ok(Self {
44 copyright: value.copyright.clone(),
45 normalized_copyright: crate::copyright::refine_copyright(&value.copyright),
46 start_line,
47 end_line,
48 })
49 }
50}
51
52#[cfg(test)]
53mod tests {
54 use super::*;
55 use crate::models::LineNumber;
56
57 #[test]
58 fn output_copyright_uses_selected_rendering_mode() {
59 let copyright = crate::models::Copyright {
60 copyright: "Copyright 2024 Example Corp. All rights reserved.".to_string(),
61 normalized_copyright: Some("Copyright 2024 Example Corp.".to_string()),
62 start_line: LineNumber::ONE,
63 end_line: LineNumber::ONE,
64 };
65
66 let raw = OutputCopyright::from_with_compat_mode(
67 ©right,
68 crate::cli::CompatibilityMode::Native,
69 );
70 let compat = OutputCopyright::from_with_compat_mode(
71 ©right,
72 crate::cli::CompatibilityMode::Scancode,
73 );
74
75 assert_eq!(
76 raw.copyright,
77 "Copyright 2024 Example Corp. All rights reserved."
78 );
79 assert_eq!(compat.copyright, "Copyright 2024 Example Corp.");
80 }
81
82 #[test]
83 fn output_copyright_try_from_reconstructs_normalized_text() {
84 let output = OutputCopyright {
85 copyright: "Copyright 2024 Example Corp. All rights reserved.".to_string(),
86 start_line: 1,
87 end_line: 1,
88 };
89
90 let converted = crate::models::Copyright::try_from(&output).expect("conversion");
91
92 assert_eq!(converted.copyright, output.copyright);
93 assert_eq!(
94 converted.normalized_copyright.as_deref(),
95 Some("Copyright 2024 Example Corp.")
96 );
97 }
98}