Skip to main content

hinge_rs/
prompts_manager.rs

1use 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}