Skip to main content

provenant/output_schema/
file_reference.rs

1// SPDX-FileCopyrightText: Provenant contributors
2// SPDX-License-Identifier: Apache-2.0
3
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7use super::serde_helpers::serialize_optional_map_as_object;
8
9#[derive(Serialize, Deserialize, Debug, Clone)]
10pub struct OutputFileReference {
11    pub path: String,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub size: Option<u64>,
14    pub sha1: Option<String>,
15    pub md5: Option<String>,
16    pub sha256: Option<String>,
17    pub sha512: Option<String>,
18    #[serde(default, serialize_with = "serialize_optional_map_as_object")]
19    pub extra_data: Option<HashMap<String, serde_json::Value>>,
20}
21
22impl From<&crate::models::FileReference> for OutputFileReference {
23    fn from(value: &crate::models::FileReference) -> Self {
24        Self {
25            path: value.path.clone(),
26            size: value.size,
27            sha1: value.sha1.as_ref().map(|d| d.as_hex()),
28            md5: value.md5.as_ref().map(|d| d.as_hex()),
29            sha256: value.sha256.as_ref().map(|d| d.as_hex()),
30            sha512: value.sha512.as_ref().map(|d| d.as_hex()),
31            extra_data: value.extra_data.clone(),
32        }
33    }
34}
35
36impl TryFrom<&OutputFileReference> for crate::models::FileReference {
37    type Error = String;
38    fn try_from(value: &OutputFileReference) -> Result<Self, Self::Error> {
39        Ok(Self {
40            path: value.path.clone(),
41            size: value.size,
42            sha1: value
43                .sha1
44                .as_ref()
45                .map(|s| crate::models::Sha1Digest::from_hex(s))
46                .transpose()
47                .map_err(|e| format!("invalid sha1: {}", e))?,
48            md5: value
49                .md5
50                .as_ref()
51                .map(|s| crate::models::Md5Digest::from_hex(s))
52                .transpose()
53                .map_err(|e| format!("invalid md5: {}", e))?,
54            sha256: value
55                .sha256
56                .as_ref()
57                .map(|s| crate::models::Sha256Digest::from_hex(s))
58                .transpose()
59                .map_err(|e| format!("invalid sha256: {}", e))?,
60            sha512: value
61                .sha512
62                .as_ref()
63                .map(|s| crate::models::Sha512Digest::from_hex(s))
64                .transpose()
65                .map_err(|e| format!("invalid sha512: {}", e))?,
66            extra_data: value.extra_data.clone(),
67        })
68    }
69}