summaryrefslogtreecommitdiffstats
path: root/crates/core/json_sm/src/software.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/core/json_sm/src/software.rs')
-rw-r--r--crates/core/json_sm/src/software.rs95
1 files changed, 95 insertions, 0 deletions
diff --git a/crates/core/json_sm/src/software.rs b/crates/core/json_sm/src/software.rs
new file mode 100644
index 00000000..bcf131b6
--- /dev/null
+++ b/crates/core/json_sm/src/software.rs
@@ -0,0 +1,95 @@
+use serde::{Deserialize, Serialize};
+use std::path::PathBuf;
+
+use crate::messages::DownloadInfo;
+
+pub type SoftwareType = String;
+pub type SoftwareName = String;
+pub type SoftwareVersion = String;
+
+pub const DEFAULT: &str = "default";
+
+#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
+pub struct SoftwareModule {
+ #[serde(default)]
+ pub module_type: Option<SoftwareType>,
+ pub name: SoftwareName,
+ pub version: Option<SoftwareVersion>,
+ pub url: Option<DownloadInfo>,
+ pub file_path: Option<PathBuf>,
+}
+
+impl SoftwareModule {
+ pub fn default_type() -> SoftwareType {
+ DEFAULT.to_string()
+ }
+
+ pub fn is_default_type(module_type: &str) -> bool {
+ module_type.is_empty() || module_type == DEFAULT
+ }
+
+ pub fn new(
+ module_type: Option<SoftwareType>,
+ name: SoftwareName,
+ version: Option<SoftwareVersion>,
+ url: Option<DownloadInfo>,
+ file_path: Option<PathBuf>,
+ ) -> SoftwareModule {
+ let mut module = SoftwareModule {
+ module_type,
+ name,
+ version,
+ url,
+ file_path,
+ };
+ module.normalize();
+ module
+ }
+
+ pub fn normalize(&mut self) {
+ match &self.module_type {
+ Some(module_type) if SoftwareModule::is_default_type(module_type) => {
+ self.module_type = None
+ }
+ _ => {}
+ };
+
+ match &self.version {
+ Some(version) if version.is_empty() => self.version = None,
+ _ => {}
+ };
+ }
+}
+
+#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
+pub enum SoftwareModuleUpdate {
+ Install { module: SoftwareModule },
+ Remove { module: SoftwareModule },
+}
+
+impl SoftwareModuleUpdate {
+ pub fn install(module: SoftwareModule) -> SoftwareModuleUpdate {
+ SoftwareModuleUpdate::Install { module }
+ }
+
+ pub fn remove(module: SoftwareModule) -> SoftwareModuleUpdate {
+ SoftwareModuleUpdate::Remove { module }
+ }
+
+ pub fn module(&self) -> &SoftwareModule {
+ match self {
+ SoftwareModuleUpdate::Install { module } | SoftwareModuleUpdate::Remove { module } => {
+ module
+ }
+ }
+ }
+
+ pub fn normalize(&mut self) {
+ let module = match self {
+ SoftwareModuleUpdate::Install { module } | SoftwareModuleUpdate::Remove { module } => {
+ module
+ }
+ };
+ module.normalize();
+ }
+}