thot-local 0.10.0-intermediate

Local functionality for Thot data management and analysis software.
Documentation
//! Script collection for the system.
use crate::system::common::config_dir_path;
use cluFlock::FlockLock;
use derivative::{self, Derivative};
use serde::{Deserialize, Serialize};
use settings_manager::list_setting::ListSetting;
use settings_manager::result::Result as SettingsResult;
use settings_manager::settings::Settings;
use settings_manager::system_settings::{LockSettingsFile, SystemSettings};
use settings_manager::types::Priority as SettingsPriority;
use std::collections::HashMap;
use std::default::Default;
use std::fs::File;
use std::path::PathBuf;
use thot_core::system::Script;
use thot_core::types::ResourceId;

// ****************
// *** Scripts ***
// ****************

#[derive(Serialize, Deserialize, Derivative, Default)]
#[derivative(Debug)]
pub struct Scripts {
    #[serde(skip)]
    _file_lock: Option<FlockLock<File>>,

    pub scripts: Vec<Script>,
}

impl Settings for Scripts {
    fn store_lock(&mut self, file_lock: FlockLock<File>) {
        self._file_lock = Some(file_lock);
    }

    fn controls_file(&self) -> bool {
        self._file_lock.is_some()
    }

    fn priority(&self) -> SettingsPriority {
        SettingsPriority::User
    }
}

impl SystemSettings for Scripts {
    /// Returns the path to the system settings file.
    fn path() -> SettingsResult<PathBuf> {
        let settings_dir = config_dir_path()?;
        Ok(settings_dir.join("scripts.json"))
    }
}

impl ListSetting for Scripts {
    type Item = Script;

    fn items(&mut self) -> &mut Vec<Script> {
        &mut self.scripts
    }
}

impl LockSettingsFile for Scripts {}

impl Into<HashMap<ResourceId, Script>> for Scripts {
    fn into(self) -> HashMap<ResourceId, Script> {
        self.scripts
            .into_iter()
            .map(|s| (s.rid.clone(), s))
            .collect::<HashMap<ResourceId, Script>>()
    }
}

#[cfg(test)]
#[path = "./scripts_test.rs"]
mod scripts_test;