dev_scope/shared/models/internal/
mod.rs1use 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}