xvc_pipeline/pipeline/
outs.rs1use std::fs;
2use std::{ffi::OsStr, path::Path};
3
4use rayon::*;
5
6use strum_macros::Display;
7use xvc_core::{XvcPath, XvcRoot};
8use xvc_core::persist;
9
10use crate::error::{Error, Result};
11
12use serde::{Deserialize, Serialize};
13
14#[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize, Ord, PartialOrd)]
18pub enum XvcMetricsFormat {
19 Unknown,
21 CSV,
23 JSON,
25 TSV,
27}
28
29impl XvcMetricsFormat {
30 pub fn from_path(path: &Path) -> Self {
32 match path
33 .extension()
34 .unwrap_or_else(|| OsStr::new(""))
35 .to_ascii_lowercase()
36 .to_str()
37 .unwrap_or("")
38 {
39 "csv" => Self::CSV,
40 "json" => Self::JSON,
41 "tsv" => Self::TSV,
42 _ => Self::Unknown,
43 }
44 }
45}
46
47#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize, Display, PartialOrd, Ord)]
51pub enum XvcOutput {
52 File {
54 path: XvcPath,
56 },
57 Metric {
59 path: XvcPath,
61 format: XvcMetricsFormat,
63 },
64 Image {
66 path: XvcPath,
68 },
70 }
72
73persist!(XvcOutput, "xvc-output");
74
75impl From<XvcOutput> for XvcPath {
76 fn from(out: XvcOutput) -> XvcPath {
78 match out {
79 XvcOutput::File { path } => path,
80 XvcOutput::Metric { path, .. } => path,
81 XvcOutput::Image { path, .. } => path,
82 }
83 }
84}
85
86impl From<&XvcOutput> for XvcPath {
87 fn from(out: &XvcOutput) -> XvcPath {
89 match out {
90 XvcOutput::File { path } => path.clone(),
91 XvcOutput::Metric { path, .. } => path.clone(),
92 XvcOutput::Image { path, .. } => path.clone(),
93 }
94 }
95}
96
97impl XvcOutput {
98 pub fn fs_metadata(&self, xvc_root: &XvcRoot) -> Result<fs::Metadata> {
100 let xvc_path: XvcPath = self.into();
101 let abs_path = xvc_path.to_absolute_path(xvc_root);
102 abs_path
103 .metadata()
104 .map_err(|source| Error::IoError { source })
105 }
106}