1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROMEOS_COMPONENTS_BLOOM_PUBLIC_CPP_BLOOM_RESULT_H_
6 #define CHROMEOS_COMPONENTS_BLOOM_PUBLIC_CPP_BLOOM_RESULT_H_
7
8 #include <memory>
9 #include <string>
10 #include <vector>
11
12 #include "base/component_export.h"
13 #include "url/gurl.h"
14
15 namespace chromeos {
16 namespace bloom {
17
18 struct BloomImageElement;
19 struct BloomMathElement;
20 struct BloomSourceElement;
21 struct BloomTextElement;
22 struct BloomTitleElement;
23 struct BloomVideoElement;
24
25 // Abstract base class representing individual elements (a text, a video, an
26 // image, ...) that are used to compose the Bloom response entries.
COMPONENT_EXPORT(BLOOM)27 struct COMPONENT_EXPORT(BLOOM) BloomElement {
28 BloomElement() = default;
29 BloomElement(const BloomElement&) = delete;
30 BloomElement& operator=(const BloomElement&) = delete;
31 BloomElement(BloomElement&&) = default;
32 BloomElement& operator=(BloomElement&&) = default;
33 virtual ~BloomElement() = default;
34
35 enum class Type {
36 kImage,
37 kMath,
38 kSource,
39 kText,
40 kTitle,
41 kVideo,
42 };
43
44 virtual Type type() const = 0;
45
46 // Methods for checked downcasting to derived types.
47 // DCHECK when called on a wrong type.
48
49 virtual const BloomImageElement* AsImage() const;
50 virtual const BloomMathElement* AsMath() const;
51 virtual const BloomSourceElement* AsSource() const;
52 virtual const BloomTextElement* AsText() const;
53 virtual const BloomTitleElement* AsTitle() const;
54 virtual const BloomVideoElement* AsVideo() const;
55 };
56
57 std::string COMPONENT_EXPORT(BLOOM) ToString(BloomElement::Type type);
58
COMPONENT_EXPORT(BLOOM)59 struct COMPONENT_EXPORT(BLOOM) BloomImageElement : public BloomElement {
60 BloomImageElement();
61 BloomImageElement(const BloomImageElement&) = delete;
62 BloomImageElement& operator=(const BloomImageElement&) = delete;
63 BloomImageElement(BloomImageElement&&);
64 BloomImageElement& operator=(BloomImageElement&&);
65 ~BloomImageElement() override;
66
67 // BloomResultElement implementation:
68 Type type() const override;
69 const BloomImageElement* AsImage() const override;
70
71 GURL url;
72 std::string description;
73 int width;
74 int height;
75 };
76
COMPONENT_EXPORT(BLOOM)77 struct COMPONENT_EXPORT(BLOOM) BloomMathElement : public BloomElement {
78 BloomMathElement();
79 BloomMathElement(const BloomMathElement&) = delete;
80 BloomMathElement& operator=(const BloomMathElement&) = delete;
81 BloomMathElement(BloomMathElement&&);
82 BloomMathElement& operator=(BloomMathElement&&);
83 ~BloomMathElement() override;
84
85 // BloomResultElement implementation:
86 Type type() const override;
87 const BloomMathElement* AsMath() const override;
88
89 std::string description;
90 std::string latex;
91 };
92
COMPONENT_EXPORT(BLOOM)93 struct COMPONENT_EXPORT(BLOOM) BloomSourceElement : public BloomElement {
94 BloomSourceElement();
95 BloomSourceElement(const BloomSourceElement&) = delete;
96 BloomSourceElement& operator=(const BloomSourceElement&) = delete;
97 BloomSourceElement(BloomSourceElement&&);
98 BloomSourceElement& operator=(BloomSourceElement&&);
99 ~BloomSourceElement() override;
100
101 // BloomResultElement implementation:
102 Type type() const override;
103 const BloomSourceElement* AsSource() const override;
104
105 std::string text;
106 GURL favicon_url;
107 GURL url;
108 };
109
COMPONENT_EXPORT(BLOOM)110 struct COMPONENT_EXPORT(BLOOM) BloomTextElement : public BloomElement {
111 BloomTextElement();
112 BloomTextElement(const BloomTextElement&) = delete;
113 BloomTextElement& operator=(const BloomTextElement&) = delete;
114 BloomTextElement(BloomTextElement&&);
115 BloomTextElement& operator=(BloomTextElement&&);
116 ~BloomTextElement() override;
117
118 // BloomResultElement implementation:
119 Type type() const override;
120 const BloomTextElement* AsText() const override;
121
122 std::string text;
123 };
124
COMPONENT_EXPORT(BLOOM)125 struct COMPONENT_EXPORT(BLOOM) BloomTitleElement : public BloomElement {
126 BloomTitleElement();
127 BloomTitleElement(const BloomTitleElement&) = delete;
128 BloomTitleElement& operator=(const BloomTitleElement&) = delete;
129 BloomTitleElement(BloomTitleElement&&);
130 BloomTitleElement& operator=(BloomTitleElement&&);
131 ~BloomTitleElement() override;
132
133 // BloomResultElement implementation:
134 Type type() const override;
135 const BloomTitleElement* AsTitle() const override;
136
137 std::string text;
138 };
139
COMPONENT_EXPORT(BLOOM)140 struct COMPONENT_EXPORT(BLOOM) BloomVideoElement : public BloomElement {
141 BloomVideoElement();
142 BloomVideoElement(const BloomVideoElement&) = delete;
143 BloomVideoElement& operator=(const BloomVideoElement&) = delete;
144 BloomVideoElement(BloomVideoElement&&);
145 BloomVideoElement& operator=(BloomVideoElement&&);
146 ~BloomVideoElement() override;
147
148 // BloomResultElement implementation:
149 Type type() const override;
150 const BloomVideoElement* AsVideo() const override;
151
152 GURL url;
153 std::string title;
154 std::string description;
155 GURL thumbnail_url;
156 std::string video_id;
157 std::string start_time;
158 std::string duration;
159 std::string channel_title;
160 std::string published_time;
161 std::string number_of_likes;
162 std::string number_of_views;
163 };
164
165 struct BloomQuestionAndAnswerEntry;
166 struct BloomExplainerEntry;
167 struct BloomVideoEntry;
168 struct BloomWebResultEntry;
169
170 // Abstract base class representing the different entries in the Bloom response.
171 // Each entry contains a single answer, and is composed of multiple elements.
COMPONENT_EXPORT(BLOOM)172 struct COMPONENT_EXPORT(BLOOM) BloomResultEntry {
173 BloomResultEntry();
174 BloomResultEntry(const BloomResultEntry&) = delete;
175 BloomResultEntry& operator=(const BloomResultEntry&) = delete;
176 virtual ~BloomResultEntry();
177
178 enum class Type {
179 kQuestionAndAnswer,
180 kExplainer,
181 kVideo,
182 kWebResult,
183 };
184
185 virtual Type type() const = 0;
186
187 // Methods for checked downcasting to derived types.
188 // DCHECK when called on a wrong type.
189
190 virtual const BloomQuestionAndAnswerEntry* AsQuestionAndAnswer() const;
191 virtual const BloomExplainerEntry* AsExplainer() const;
192 virtual const BloomVideoEntry* AsVideo() const;
193 virtual const BloomWebResultEntry* AsWebResult() const;
194 };
195
196 std::string COMPONENT_EXPORT(BLOOM) ToString(BloomResultEntry::Type type);
197
COMPONENT_EXPORT(BLOOM)198 struct COMPONENT_EXPORT(BLOOM) BloomQuestionAndAnswerEntry
199 : public BloomResultEntry {
200 BloomQuestionAndAnswerEntry();
201 ~BloomQuestionAndAnswerEntry() override;
202
203 // BloomResultEntry implementation:
204 Type type() const override;
205 const BloomQuestionAndAnswerEntry* AsQuestionAndAnswer() const override;
206
207 BloomTextElement question;
208 BloomTextElement answer;
209 BloomSourceElement source;
210 };
211
COMPONENT_EXPORT(BLOOM)212 struct COMPONENT_EXPORT(BLOOM) BloomExplainerEntry : public BloomResultEntry {
213 BloomExplainerEntry();
214 ~BloomExplainerEntry() override;
215
216 // BloomResultEntry implementation:
217 Type type() const override;
218 const BloomExplainerEntry* AsExplainer() const override;
219
220 BloomTitleElement title;
221 BloomImageElement image;
222 // An explainer ends with a variable amount of elements.
223 std::vector<std::unique_ptr<BloomElement>> elements;
224 };
225
COMPONENT_EXPORT(BLOOM)226 struct COMPONENT_EXPORT(BLOOM) BloomVideoEntry : public BloomResultEntry {
227 BloomVideoEntry();
228 ~BloomVideoEntry() override;
229
230 // BloomResultEntry implementation:
231 Type type() const override;
232 const BloomVideoEntry* AsVideo() const override;
233
234 BloomVideoElement video;
235 BloomSourceElement source;
236 };
237
COMPONENT_EXPORT(BLOOM)238 struct COMPONENT_EXPORT(BLOOM) BloomWebResultEntry : public BloomResultEntry {
239 BloomWebResultEntry();
240 ~BloomWebResultEntry() override;
241
242 // BloomResultEntry implementation:
243 Type type() const override;
244 const BloomWebResultEntry* AsWebResult() const override;
245
246 BloomTextElement title;
247 BloomTextElement snippet;
248 BloomSourceElement source;
249 };
250
COMPONENT_EXPORT(BLOOM)251 struct COMPONENT_EXPORT(BLOOM) BloomResultSection {
252 BloomResultSection();
253 BloomResultSection(const BloomResultSection&) = delete;
254 BloomResultSection& operator=(const BloomResultSection&) = delete;
255 BloomResultSection(BloomResultSection&&);
256 BloomResultSection& operator=(BloomResultSection&&);
257 ~BloomResultSection();
258
259 std::string title;
260 std::vector<std::unique_ptr<BloomResultEntry>> entries;
261 };
262
COMPONENT_EXPORT(BLOOM)263 struct COMPONENT_EXPORT(BLOOM) BloomResult {
264 public:
265 BloomResult();
266 BloomResult(const BloomResult&) = delete;
267 BloomResult& operator=(const BloomResult&) = delete;
268 BloomResult(BloomResult&&);
269 BloomResult& operator=(BloomResult&&);
270 ~BloomResult();
271
272 std::string query;
273 std::vector<BloomResultSection> sections;
274 };
275
276 } // namespace bloom
277 } // namespace chromeos
278
279 #endif // CHROMEOS_COMPONENTS_BLOOM_PUBLIC_CPP_BLOOM_RESULT_H_
280