ladybird/Userland/Libraries/LibKeyboard/CharacterMapFile.cpp
RasmusNylander 4e65c4dae4 LibKeyboard: Change some Optional<T> returns to ErrorOr<T>
Makes CharacterMapFile::load_from_file and CharacterMap::load_from_file
return ErrorOr instead of Optional. This makes them a little nicer to
use and a little easier to read, as they seem to have been approximating
this.
2022-01-06 17:54:03 +01:00

82 lines
2.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2020, Hüseyin Aslıtürk <asliturk@hotmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "CharacterMapFile.h"
#include <AK/ByteBuffer.h>
#include <AK/Utf8View.h>
#include <LibCore/File.h>
namespace Keyboard {
ErrorOr<CharacterMapData> CharacterMapFile::load_from_file(const String& filename)
{
auto path = filename;
if (!path.ends_with(".json")) {
StringBuilder full_path;
full_path.append("/res/keymaps/");
full_path.append(filename);
full_path.append(".json");
path = full_path.to_string();
}
auto file = TRY(Core::File::open(path, Core::OpenMode::ReadOnly));
auto file_contents = file->read_all();
auto json_result = TRY(JsonValue::from_string(file_contents));
const auto& json = json_result.as_object();
Vector<u32> map = read_map(json, "map");
Vector<u32> shift_map = read_map(json, "shift_map");
Vector<u32> alt_map = read_map(json, "alt_map");
Vector<u32> altgr_map = read_map(json, "altgr_map");
Vector<u32> shift_altgr_map = read_map(json, "shift_altgr_map");
CharacterMapData character_map;
for (int i = 0; i < CHAR_MAP_SIZE; i++) {
character_map.map[i] = map.at(i);
character_map.shift_map[i] = shift_map.at(i);
character_map.alt_map[i] = alt_map.at(i);
if (altgr_map.is_empty()) {
// AltGr map was not found, using Alt map as fallback.
character_map.altgr_map[i] = alt_map.at(i);
} else {
character_map.altgr_map[i] = altgr_map.at(i);
}
if (shift_altgr_map.is_empty()) {
// Shift+AltGr map was not found, using Alt map as fallback.
character_map.shift_altgr_map[i] = alt_map.at(i);
} else {
character_map.shift_altgr_map[i] = shift_altgr_map.at(i);
}
}
return character_map;
}
Vector<u32> CharacterMapFile::read_map(const JsonObject& json, const String& name)
{
if (!json.has(name))
return {};
Vector<u32> buffer;
buffer.resize(CHAR_MAP_SIZE);
auto map_arr = json.get(name).as_array();
for (size_t i = 0; i < map_arr.size(); i++) {
auto key_value = map_arr.at(i).as_string();
if (key_value.length() == 0) {
buffer[i] = 0;
} else if (key_value.length() == 1) {
buffer[i] = key_value.characters()[0];
} else {
Utf8View m_utf8_view(key_value);
buffer[i] = *m_utf8_view.begin();
}
}
return buffer;
}
}