eye_config 0.5.1

A configuration persistence library and CLI tool.
Documentation
use super::project::PROJECT;
use crate::persistable_state::PersistableState;
use crate::persistence_key::PersistenceKey;
use chrono::DateTime;
use chrono::Local;
use serde::Deserialize;
use serde::Serialize;

#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub struct KnownProjects {
    pub entries: Vec<KnownProjectEntry>,
}

#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, Hash)]
pub struct KnownProjectEntry {
    pub key: PersistenceKey,
    pub last_accessed: DateTime<Local>,
}

#[async_trait::async_trait]
impl PersistableState for KnownProjects {
    async fn key() -> eyre::Result<PersistenceKey> {
        Ok(PersistenceKey::new(PROJECT, "known-projects.json"))
    }
    fn is_secret() -> bool {
        true
    }
}

impl KnownProjects {
    #[async_recursion::async_recursion]
    pub async fn track_project_accessed(key: PersistenceKey) -> eyre::Result<()> {
        let now = Local::now();
        let mut known_projects = KnownProjects::load().await?;
        let entry = known_projects
            .entries
            .iter_mut()
            .find(|entry| entry.key == key);
        if let Some(existing_entry) = entry {
            existing_entry.last_accessed = now;
        } else {
            known_projects.entries.push(KnownProjectEntry {
                key,
                last_accessed: now,
            });
        }
        known_projects.save().await?;
        Ok(())
    }
}