#ifndef CHROMEOS_COMPONENTS_QUICK_ANSWERS_RESULT_LOADER_H_
#define CHROMEOS_COMPONENTS_QUICK_ANSWERS_RESULT_LOADER_H_
#include <memory>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "chromeos/components/quick_answers/quick_answers_model.h"
#include "chromeos/components/quick_answers/search_result_parsers/search_response_parser.h"
namespace network {
class SharedURLLoaderFactory;
class SimpleURLLoader;
struct ResourceRequest;
}
namespace quick_answers {
enum class IntentType;
struct PreprocessedOutput;
class ResultLoader {
public:
class ResultLoaderDelegate {
public:
ResultLoaderDelegate(const ResultLoaderDelegate&) = delete;
ResultLoaderDelegate& operator=(const ResultLoaderDelegate&) = delete;
virtual void OnNetworkError() {}
virtual void OnQuickAnswerReceived(
std::unique_ptr<QuickAnswersSession> quick_answers_session) {}
protected:
ResultLoaderDelegate() = default;
virtual ~ResultLoaderDelegate() = default;
};
using ResponseParserCallback = base::OnceCallback<void(
std::unique_ptr<QuickAnswersSession> quick_answers_session)>;
using BuildRequestCallback = base::OnceCallback<void(
std::unique_ptr<network::ResourceRequest> resource_request,
const std::string& request_body)>;
ResultLoader(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
ResultLoaderDelegate* delegate);
ResultLoader(const ResultLoader&) = delete;
ResultLoader& operator=(const ResultLoader&) = delete;
virtual ~ResultLoader();
static std::unique_ptr<ResultLoader> Create(
IntentType intent_type,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
ResultLoader::ResultLoaderDelegate* delegate);
virtual void Fetch(const PreprocessedOutput& preprocessed_output);
protected:
virtual void BuildRequest(const PreprocessedOutput& preprocessed_output,
BuildRequestCallback callback) const = 0;
virtual void ProcessResponse(const PreprocessedOutput& preprocessed_output,
std::optional<std::string> response_body,
ResponseParserCallback complete_callback) = 0;
ResultLoaderDelegate* delegate() const { return delegate_; }
private:
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
std::unique_ptr<network::SimpleURLLoader> loader_;
const raw_ptr<ResultLoaderDelegate> delegate_;
void OnBuildRequestComplete(
const PreprocessedOutput& preprocessed_output,
std::unique_ptr<network::ResourceRequest> resource_request,
const std::string& request_body);
void OnSimpleURLLoaderComplete(const PreprocessedOutput& preprocessed_output,
std::optional<std::string> response_body);
void OnResultParserComplete(
std::unique_ptr<QuickAnswersSession> quick_answers_session);
base::TimeTicks fetch_start_time_;
base::WeakPtrFactory<ResultLoader> weak_factory_{this};
};
}
#endif