hinge_rs/
prompts_manager.rs1use crate::models::{Prompt, PromptCategory, PromptsResponse};
2use std::collections::HashMap;
3
4pub struct HingePromptsManager {
5 pub prompts_data: PromptsResponse,
6 prompts_by_id: HashMap<String, Prompt>,
7 categories_by_slug: HashMap<String, PromptCategory>,
8}
9
10impl HingePromptsManager {
11 pub fn new(prompts_data: PromptsResponse) -> Self {
12 let mut prompts_by_id = HashMap::new();
13 let mut categories_by_slug = HashMap::new();
14
15 for prompt in &prompts_data.prompts {
16 prompts_by_id.insert(prompt.id.clone(), prompt.clone());
17 }
18
19 for category in &prompts_data.categories {
20 categories_by_slug.insert(category.slug.clone(), category.clone());
21 }
22
23 Self {
24 prompts_data,
25 prompts_by_id,
26 categories_by_slug,
27 }
28 }
29
30 pub fn get_prompt_by_id(&self, prompt_id: &str) -> Option<&Prompt> {
31 self.prompts_by_id.get(prompt_id)
32 }
33
34 pub fn get_category_by_slug(&self, slug: &str) -> Option<&PromptCategory> {
35 self.categories_by_slug.get(slug)
36 }
37
38 pub fn get_prompts_by_category(&self, category_slug: &str) -> Vec<&Prompt> {
39 self.prompts_data
40 .prompts
41 .iter()
42 .filter(|p| p.categories.contains(&category_slug.to_string()))
43 .collect()
44 }
45
46 pub fn get_selectable_prompts(&self) -> Vec<&Prompt> {
47 self.prompts_data
48 .prompts
49 .iter()
50 .filter(|p| p.is_selectable)
51 .collect()
52 }
53
54 pub fn get_new_prompts(&self) -> Vec<&Prompt> {
55 self.prompts_data
56 .prompts
57 .iter()
58 .filter(|p| p.is_new)
59 .collect()
60 }
61
62 pub fn search_prompts(&self, query: &str) -> Vec<&Prompt> {
63 let query_lower = query.to_lowercase();
64 self.prompts_data
65 .prompts
66 .iter()
67 .filter(|p| {
68 p.prompt.to_lowercase().contains(&query_lower)
69 || p.placeholder.to_lowercase().contains(&query_lower)
70 })
71 .collect()
72 }
73
74 pub fn get_prompt_display_text(&self, prompt_id: &str) -> String {
75 self.get_prompt_by_id(prompt_id)
76 .map(|p| p.prompt.clone())
77 .unwrap_or_else(|| "Unknown Question".to_string())
78 }
79
80 pub fn get_visible_categories(&self) -> Vec<&PromptCategory> {
81 self.prompts_data
82 .categories
83 .iter()
84 .filter(|c| c.is_visible)
85 .collect()
86 }
87}