Skip to main content

elph_core/layout/
version.rs

1use anyhow::Result;
2use crate::layout::files::write_json_file;
3use crate::utils::path::AppPaths;
4use crate::utils::time::utc_rfc3339_now;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
8#[serde(rename_all = "camelCase")]
9pub struct VersionFile {
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub last_sync_providers: Option<String>,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub release_checked_at: Option<String>,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub stable_version: Option<String>,
16    pub version: String,
17}
18
19impl VersionFile {
20    pub fn defaults(app_version: &str) -> Self {
21        let now = utc_rfc3339_now();
22        Self {
23            last_sync_providers: None,
24            release_checked_at: Some(now),
25            stable_version: None,
26            version: app_version.to_string(),
27        }
28    }
29
30    pub fn ensure<P: AppPaths>(paths: &P, app_version: &str) -> Result<()> {
31        let path = paths.version_path();
32        if path.exists() {
33            return Ok(());
34        }
35
36        write_json_file(&path, &Self::defaults(app_version))?;
37        Ok(())
38    }
39}