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