Skip to main content

provenant/output_schema/
copyright.rs

1// SPDX-FileCopyrightText: Provenant contributors
2// SPDX-License-Identifier: Apache-2.0
3
4use 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            &copyright,
68            crate::cli::CompatibilityMode::Native,
69        );
70        let compat = OutputCopyright::from_with_compat_mode(
71            &copyright,
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}