[go: nahoru, domu]

blob: 11338e733227bfda0e39e7e36aa7c8d865864b0c [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "google_apis/tasks/tasks_api_response_types.h"
#include <memory>
#include <string>
#include "base/json/json_value_converter.h"
#include "base/logging.h"
#include "base/time/time.h"
#include "base/values.h"
#include "google_apis/common/parser_util.h"
#include "google_apis/common/time_util.h"
#include "google_apis/tasks/tasks_api_task_status.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace google_apis::tasks {
namespace {
using ::base::JSONValueConverter;
constexpr char kTaskKind[] = "tasks#task";
constexpr char kTaskListsKind[] = "tasks#taskLists";
constexpr char kTasksKind[] = "tasks#tasks";
constexpr char kApiResponseDueKey[] = "due";
constexpr char kApiResponseLinksKey[] = "links";
constexpr char kApiResponseLinkTypeKey[] = "type";
constexpr char kApiResponseNotesKey[] = "notes";
constexpr char kApiResponseParentKey[] = "parent";
constexpr char kApiResponsePositionKey[] = "position";
constexpr char kApiResponseStatusKey[] = "status";
constexpr char kApiResponseTitleKey[] = "title";
constexpr char kApiResponseUpdatedKey[] = "updated";
constexpr char kLinkTypeEmail[] = "email";
bool ConvertTaskStatus(base::StringPiece input, TaskStatus* output) {
*output = TaskStatusFromString(input);
return true;
}
bool ConvertTaskDueDate(base::StringPiece input,
absl::optional<base::Time>* output) {
base::Time due;
if (!util::GetTimeFromString(input, &due)) {
return false;
}
*output = due;
return true;
}
bool ConvertTaskLinkType(base::StringPiece input, TaskLink::Type* output) {
*output = input == kLinkTypeEmail ? TaskLink::Type::kEmail
: TaskLink::Type::kUnknown;
return true;
}
} // namespace
// ----- TaskList -----
TaskList::TaskList() = default;
TaskList::~TaskList() = default;
// static
void TaskList::RegisterJSONConverter(JSONValueConverter<TaskList>* converter) {
converter->RegisterStringField(kApiResponseIdKey, &TaskList::id_);
converter->RegisterStringField(kApiResponseTitleKey, &TaskList::title_);
converter->RegisterCustomField<base::Time>(
kApiResponseUpdatedKey, &TaskList::updated_, &util::GetTimeFromString);
}
// ----- TaskLists -----
TaskLists::TaskLists() = default;
TaskLists::~TaskLists() = default;
// static
void TaskLists::RegisterJSONConverter(
JSONValueConverter<TaskLists>* converter) {
converter->RegisterStringField(kApiResponseNextPageTokenKey,
&TaskLists::next_page_token_);
converter->RegisterRepeatedMessage<TaskList>(kApiResponseItemsKey,
&TaskLists::items_);
}
// static
std::unique_ptr<TaskLists> TaskLists::CreateFrom(const base::Value& value) {
auto task_lists = std::make_unique<TaskLists>();
JSONValueConverter<TaskLists> converter;
if (!IsResourceKindExpected(value, kTaskListsKind) ||
!converter.Convert(value, task_lists.get())) {
DVLOG(1) << "Unable to construct `TaskLists` from parsed json.";
return nullptr;
}
return task_lists;
}
// ----- TaskLink -----
// static
void TaskLink::RegisterJSONConverter(JSONValueConverter<TaskLink>* converter) {
converter->RegisterCustomField<Type>(kApiResponseLinkTypeKey,
&TaskLink::type_, &ConvertTaskLinkType);
}
// ----- Task -----
Task::Task() = default;
Task::~Task() = default;
// static
void Task::RegisterJSONConverter(JSONValueConverter<Task>* converter) {
converter->RegisterStringField(kApiResponseIdKey, &Task::id_);
converter->RegisterStringField(kApiResponseTitleKey, &Task::title_);
converter->RegisterCustomField<TaskStatus>(
kApiResponseStatusKey, &Task::status_, &ConvertTaskStatus);
converter->RegisterStringField(kApiResponseParentKey, &Task::parent_id_);
converter->RegisterStringField(kApiResponsePositionKey, &Task::position_);
converter->RegisterCustomField<absl::optional<base::Time>>(
kApiResponseDueKey, &Task::due_, &ConvertTaskDueDate);
converter->RegisterRepeatedMessage<TaskLink>(kApiResponseLinksKey,
&Task::links_);
converter->RegisterStringField(kApiResponseNotesKey, &Task::notes_);
}
// static
std::unique_ptr<Task> Task::CreateFrom(const base::Value& value) {
auto task = std::make_unique<Task>();
JSONValueConverter<Task> converter;
if (!IsResourceKindExpected(value, kTaskKind) ||
!converter.Convert(value, task.get())) {
DVLOG(1) << "Unable to construct a `Task` from parsed json.";
return nullptr;
}
return task;
}
// ----- Tasks -----
Tasks::Tasks() = default;
Tasks::~Tasks() = default;
// static
void Tasks::RegisterJSONConverter(JSONValueConverter<Tasks>* converter) {
converter->RegisterStringField(kApiResponseNextPageTokenKey,
&Tasks::next_page_token_);
converter->RegisterRepeatedMessage<Task>(kApiResponseItemsKey,
&Tasks::items_);
}
// static
std::unique_ptr<Tasks> Tasks::CreateFrom(const base::Value& value) {
auto tasks = std::make_unique<Tasks>();
JSONValueConverter<Tasks> converter;
if (!IsResourceKindExpected(value, kTasksKind) ||
!converter.Convert(value, tasks.get())) {
DVLOG(1) << "Unable to construct `Tasks` from parsed json.";
return nullptr;
}
return tasks;
}
} // namespace google_apis::tasks