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 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#[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#[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#[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}