use anyhow::Result;
use std::sync::Arc;
use std::sync::RwLock;
use crate::{PromptVault, VersionSelector};
#[derive(Clone)]
pub struct SyncPromptManager {
vault: Arc<RwLock<PromptVault>>,
}
impl SyncPromptManager {
pub fn new() -> Result<Self> {
let vault = PromptVault::open_default()?;
Ok(SyncPromptManager {
vault: Arc::new(RwLock::new(vault)),
})
}
pub fn with_path<P: AsRef<std::path::Path>>(path: P) -> Result<Self> {
let vault = PromptVault::open(path)?;
Ok(SyncPromptManager {
vault: Arc::new(RwLock::new(vault)),
})
}
pub fn add(&self, key: &str, content: &str) -> Result<()> {
let vault = self.vault.write().unwrap();
vault.add(key, content)?;
Ok(())
}
pub fn update(&self, key: &str, content: &str, message: Option<&str>) -> Result<()> {
let vault = self.vault.write().unwrap();
vault.update(key, content, message.map(|s| s.to_string()))?;
Ok(())
}
pub fn tag(&self, key: &str, tag: &str, version: u64) -> Result<()> {
let vault = self.vault.write().unwrap();
vault.tag(key, tag, version)?;
Ok(())
}
pub fn get_prompt(&self, key: &str, selector: VersionSelector) -> Result<String> {
let vault = self.vault.read().unwrap();
Ok(vault.get(key, selector)?)
}
pub fn latest(&self, key: &str) -> Result<String> {
self.get_prompt(key, VersionSelector::Latest)
}
pub fn history(&self, key: &str) -> Result<Vec<crate::types::VersionMeta>> {
let vault = self.vault.read().unwrap();
Ok(vault.history(key)?)
}
pub fn backup(&self, path: &str, password: Option<&str>) -> Result<()> {
let vault = self.vault.read().unwrap();
vault.dump(path, password)?;
Ok(())
}
pub fn delete_prompt(&self, key: &str) -> Result<()> {
let vault = self.vault.write().unwrap();
vault.delete_prompt_key(key)?;
Ok(())
}
pub fn restore(&self, path: &str, password: Option<&str>) -> Result<()> {
let restored_vault = PromptVault::restore(path, password)?;
{
let current_vault = self.vault.write().unwrap();
}
Ok(())
}
}
static mut GLOBAL_MANAGER: Option<SyncPromptManager> = None;
static INIT: std::sync::Once = std::sync::Once::new();
impl SyncPromptManager {
pub fn get() -> &'static Self {
unsafe {
INIT.call_once(|| {
GLOBAL_MANAGER = Some(SyncPromptManager::new().expect("Failed to create PromptPro sync manager"));
});
GLOBAL_MANAGER.as_ref().unwrap()
}
}
}