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}