dev_scope/shared/models/internal/
mod.rs

1use crate::models::prelude::{
2    ModelRoot, V1AlphaDoctorGroup, V1AlphaKnownError, V1AlphaReportDefinition,
3    V1AlphaReportLocation,
4};
5use crate::models::InternalScopeModel;
6use crate::shared::prelude::*;
7use anyhow::anyhow;
8use path_clean::PathClean;
9use serde_yaml::Value;
10use std::collections::VecDeque;
11use std::path::Path;
12
13mod doctor_group;
14mod known_error;
15mod report_definition;
16mod upload_location;
17
18use self::known_error::KnownError;
19use self::report_definition::ReportDefinition;
20use self::upload_location::ReportUploadLocation;
21
22pub mod prelude {
23    pub use super::ParsedConfig;
24    pub use super::{doctor_group::*, known_error::*, report_definition::*, upload_location::*};
25}
26
27#[derive(Debug, PartialEq)]
28pub enum ParsedConfig {
29    KnownError(KnownError),
30    ReportUpload(ReportUploadLocation),
31    ReportDefinition(ReportDefinition),
32    DoctorGroup(DoctorGroup),
33}
34
35#[cfg(test)]
36impl ParsedConfig {
37    pub fn get_report_upload_spec(&self) -> Option<ReportUploadLocation> {
38        match self {
39            ParsedConfig::ReportUpload(root) => Some(root.clone()),
40            _ => None,
41        }
42    }
43
44    pub fn get_report_def_spec(&self) -> Option<ReportDefinition> {
45        match self {
46            ParsedConfig::ReportDefinition(root) => Some(root.clone()),
47            _ => None,
48        }
49    }
50
51    pub fn get_known_error_spec(&self) -> Option<KnownError> {
52        match self {
53            ParsedConfig::KnownError(root) => Some(root.clone()),
54            _ => None,
55        }
56    }
57
58    pub fn get_doctor_group(&self) -> Option<DoctorGroup> {
59        match self {
60            ParsedConfig::DoctorGroup(root) => Some(root.clone()),
61            _ => None,
62        }
63    }
64}
65
66impl TryFrom<ModelRoot<Value>> for ParsedConfig {
67    type Error = anyhow::Error;
68
69    fn try_from(value: ModelRoot<Value>) -> Result<Self, Self::Error> {
70        if let Ok(Some(known)) = V1AlphaDoctorGroup::known_type(&value) {
71            return Ok(ParsedConfig::DoctorGroup(DoctorGroup::try_from(known)?));
72        }
73        if let Ok(Some(known)) = V1AlphaKnownError::known_type(&value) {
74            return Ok(ParsedConfig::KnownError(KnownError::try_from(known)?));
75        }
76        if let Ok(Some(known)) = V1AlphaReportLocation::known_type(&value) {
77            return Ok(ParsedConfig::ReportUpload(ReportUploadLocation::try_from(
78                known,
79            )?));
80        }
81        if let Ok(Some(known)) = V1AlphaReportDefinition::known_type(&value) {
82            return Ok(ParsedConfig::ReportDefinition(ReportDefinition::try_from(
83                known,
84            )?));
85        }
86        Err(anyhow!("Error was know a known type"))
87    }
88}
89
90pub(crate) fn extract_command_path(parent_dir: &Path, exec: &str) -> String {
91    let mut parts: VecDeque<_> = exec.split(' ').map(|x| x.to_string()).collect();
92    let mut command = parts.pop_front().unwrap();
93
94    if command.starts_with('.') {
95        let full_command = parent_dir.join(command).clean().display().to_string();
96        command = full_command;
97    }
98
99    parts.push_front(command);
100
101    parts
102        .iter()
103        .map(|x| x.to_string())
104        .collect::<Vec<_>>()
105        .join(" ")
106}
107
108#[test]
109fn test_extract_command_path() {
110    let base_path = Path::new("/foo/bar");
111    assert_eq!(
112        "/foo/bar/scripts/foo.sh",
113        extract_command_path(base_path, "./scripts/foo.sh")
114    );
115    assert_eq!(
116        "/scripts/foo.sh",
117        extract_command_path(base_path, "/scripts/foo.sh")
118    );
119    assert_eq!("foo", extract_command_path(base_path, "foo"));
120    assert_eq!("foo bar", extract_command_path(base_path, "foo bar"));
121}