1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-06-01 09:28:13 +00:00

Calendar/EventManager: Store events as structs

Previously, the EventManager stored the calendar events as a raw
JsonArray of objects. Now, we parse the JSON into a Vector<Event>
structure and store that in the EventManager. This makes it easier to
access the events from the outside, as you now don't have to know the
JSON structure anymore.
This commit is contained in:
david072 2023-10-28 10:30:42 +02:00 committed by Andrew Kaster
parent 7df936b660
commit 887f040d0e
4 changed files with 94 additions and 50 deletions

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2023, the SerenityOS developers.
* Copyright (c) 2023, David Ganz <david.g.ganz@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -11,6 +12,8 @@
namespace Calendar {
static constexpr StringView DATE_FORMAT = "%Y-%m-%dT%H:%M:%S"sv;
EventManager::EventManager()
{
}
@ -20,16 +23,14 @@ OwnPtr<EventManager> EventManager::create()
return adopt_own(*new EventManager());
}
ErrorOr<void> EventManager::add_event(JsonObject event)
void EventManager::add_event(Event event)
{
TRY(m_events.append(move(event)));
m_events.append(move(event));
set_dirty(true);
on_events_change();
return {};
}
void EventManager::set_events(JsonArray events)
void EventManager::set_events(Vector<Event> events)
{
m_events = move(events);
on_events_change();
@ -41,21 +42,65 @@ ErrorOr<void> EventManager::save(FileSystemAccessClient::File& file)
set_dirty(false);
auto stream = file.release_stream();
TRY(stream->write_some(m_events.to_byte_string().bytes()));
auto json = TRY(serialize_events());
TRY(stream->write_some(json.to_byte_string().bytes()));
stream->close();
return {};
}
ErrorOr<JsonArray> EventManager::serialize_events()
{
JsonArray result;
for (auto const& event : m_events) {
JsonObject object;
object.set("start", JsonValue(event.start.to_byte_string(DATE_FORMAT)));
object.set("end", JsonValue(event.end.to_byte_string(DATE_FORMAT)));
object.set("summary", JsonValue(event.summary));
TRY(result.append(object));
}
return result;
}
ErrorOr<Vector<Event>> EventManager::deserialize_events(JsonArray const& json)
{
Vector<Event> result;
for (auto const& value : json.values()) {
auto const& object = value.as_object();
if (!object.has("summary"sv) || !object.has("start"sv) || !object.has("end"sv))
continue;
auto summary = TRY(String::from_byte_string(object.get("summary"sv).release_value().as_string()));
auto start = Core::DateTime::parse(DATE_FORMAT, object.get("start"sv).release_value().as_string());
if (!start.has_value())
continue;
auto end = Core::DateTime::parse(DATE_FORMAT, object.get("end"sv).release_value().as_string());
if (!end.has_value())
continue;
Event event = {
.summary = summary,
.start = start.release_value(),
.end = end.release_value(),
};
result.append(event);
}
return result;
}
ErrorOr<void> EventManager::load_file(FileSystemAccessClient::File& file)
{
set_filename(file.filename());
set_dirty(false);
auto content = TRY(file.stream().read_until_eof());
auto events = TRY(AK::JsonParser(content).parse());
set_events(events.as_array());
auto json = TRY(AK::JsonParser(content).parse());
auto events = TRY(deserialize_events(json.as_array()));
set_events(events);
return {};
}