Skip to main content

subcog/storage/prompt/
traits.rs

1//! Prompt storage trait definition.
2
3use crate::Result;
4use crate::models::PromptTemplate;
5
6/// Trait for prompt storage backends.
7///
8/// Each domain scope (project, user, org) can have its own storage backend.
9pub trait PromptStorage: Send + Sync {
10    /// Saves a prompt template.
11    ///
12    /// # Arguments
13    ///
14    /// * `template` - The prompt template to save
15    ///
16    /// # Returns
17    ///
18    /// The unique ID of the saved prompt.
19    ///
20    /// # Errors
21    ///
22    /// Returns an error if the prompt cannot be saved.
23    fn save(&self, template: &PromptTemplate) -> Result<String>;
24
25    /// Gets a prompt by name.
26    ///
27    /// # Arguments
28    ///
29    /// * `name` - The prompt name
30    ///
31    /// # Returns
32    ///
33    /// The prompt template if found, None otherwise.
34    ///
35    /// # Errors
36    ///
37    /// Returns an error if the storage cannot be accessed.
38    fn get(&self, name: &str) -> Result<Option<PromptTemplate>>;
39
40    /// Lists all prompts, optionally filtered.
41    ///
42    /// # Arguments
43    ///
44    /// * `tags` - Optional tags to filter by (AND logic)
45    /// * `name_pattern` - Optional glob pattern for name matching
46    ///
47    /// # Returns
48    ///
49    /// List of matching prompt templates.
50    ///
51    /// # Errors
52    ///
53    /// Returns an error if the storage cannot be accessed.
54    fn list(
55        &self,
56        tags: Option<&[String]>,
57        name_pattern: Option<&str>,
58    ) -> Result<Vec<PromptTemplate>>;
59
60    /// Deletes a prompt by name.
61    ///
62    /// # Arguments
63    ///
64    /// * `name` - The prompt name
65    ///
66    /// # Returns
67    ///
68    /// True if deleted, false if not found.
69    ///
70    /// # Errors
71    ///
72    /// Returns an error if the storage cannot be accessed.
73    fn delete(&self, name: &str) -> Result<bool>;
74
75    /// Updates a prompt's usage count.
76    ///
77    /// # Arguments
78    ///
79    /// * `name` - The prompt name
80    ///
81    /// # Returns
82    ///
83    /// The new usage count.
84    ///
85    /// # Errors
86    ///
87    /// Returns an error if the prompt is not found or storage cannot be accessed.
88    fn increment_usage(&self, name: &str) -> Result<u64>;
89}