Skip to main content

peasy_image/
types.rs

1use serde::Deserialize;
2use serde_json::Value;
3
4#[derive(Debug, Deserialize)]
5pub struct PaginatedResponse<T> {
6    pub count: u32,
7    pub next: Option<String>,
8    pub previous: Option<String>,
9    pub results: Vec<T>,
10}
11
12#[derive(Debug, Deserialize)]
13pub struct Tool {
14    pub slug: String,
15    pub name: String,
16    #[serde(default)]
17    pub tagline: String,
18    #[serde(default)]
19    pub description: String,
20    #[serde(default)]
21    pub category: Value,
22    #[serde(default)]
23    pub url: String,
24}
25
26impl Tool {
27    /// Returns the best available description — tagline for list, description for detail.
28    pub fn display_desc(&self) -> &str {
29        if !self.tagline.is_empty() { &self.tagline } else { &self.description }
30    }
31}
32
33#[derive(Debug, Deserialize)]
34pub struct Category {
35    pub slug: String,
36    pub name: String,
37    #[serde(default)]
38    pub description: String,
39    #[serde(default)]
40    pub tool_count: u32,
41}
42
43#[derive(Debug, Deserialize)]
44pub struct Format {
45    pub slug: String,
46    #[serde(default, alias = "full_name")]
47    pub name: String,
48    pub extension: String,
49    #[serde(default)]
50    pub mime_type: String,
51    #[serde(default)]
52    pub category: String,
53    #[serde(default)]
54    pub description: String,
55}
56
57#[derive(Debug, Deserialize)]
58pub struct Conversion {
59    #[serde(default)]
60    pub source: String,
61    #[serde(default)]
62    pub target: String,
63    #[serde(default)]
64    pub description: String,
65    #[serde(default)]
66    pub tool_slug: String,
67}
68
69#[derive(Debug, Deserialize)]
70pub struct GlossaryTerm {
71    pub slug: String,
72    pub term: String,
73    #[serde(default)]
74    pub definition: String,
75    #[serde(default)]
76    pub category: String,
77}
78
79#[derive(Debug, Deserialize)]
80pub struct Guide {
81    pub slug: String,
82    pub title: String,
83    #[serde(default)]
84    pub description: String,
85    #[serde(default)]
86    pub category: String,
87    #[serde(default)]
88    pub audience_level: String,
89    #[serde(default)]
90    pub word_count: u32,
91}
92
93#[derive(Debug, Deserialize)]
94pub struct UseCase {
95    pub slug: String,
96    pub title: String,
97    pub industry: String,
98}
99
100#[derive(Debug, Deserialize)]
101pub struct Site {
102    pub name: String,
103    pub domain: String,
104    pub url: String,
105}
106
107#[derive(Debug, Deserialize)]
108pub struct SearchResult {
109    pub query: String,
110    pub results: SearchCategories,
111}
112
113#[derive(Debug, Deserialize)]
114pub struct SearchCategories {
115    pub tools: Vec<Tool>,
116    pub formats: Vec<Format>,
117    pub glossary: Vec<GlossaryTerm>,
118}
119
120/// Options for paginated list requests.
121#[derive(Default)]
122pub struct ListOptions {
123    pub page: Option<u32>,
124    pub limit: Option<u32>,
125    pub category: Option<String>,
126    pub search: Option<String>,
127}
128
129/// Options for list_guides with audience level.
130#[derive(Default)]
131pub struct ListGuidesOptions {
132    pub page: Option<u32>,
133    pub limit: Option<u32>,
134    pub category: Option<String>,
135    pub audience_level: Option<String>,
136    pub search: Option<String>,
137}
138
139/// Options for list_conversions with source/target.
140#[derive(Default)]
141pub struct ListConversionsOptions {
142    pub page: Option<u32>,
143    pub limit: Option<u32>,
144    pub source: Option<String>,
145    pub target: Option<String>,
146}