diff src/core/config.cc @ 81:9b2b41f83a5e

boring: mass rename to cc because this is a very unix-y project, it makes more sense to use the 'cc' extension
author Paper <mrpapersonic@gmail.com>
date Mon, 23 Oct 2023 12:07:27 -0400
parents src/core/config.cpp@6f7385bd334c
children c4bb49c2f6eb
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/config.cc	Mon Oct 23 12:07:27 2023 -0400
@@ -0,0 +1,106 @@
+/**
+ * config.cpp:
+ * parses the config... lol
+ **/
+#include "core/config.h"
+#include "core/anime.h"
+#include "core/filesystem.h"
+#include "core/json.h"
+#include <cstdlib>
+#include <cstring>
+#include <filesystem>
+#include <fstream>
+#include <limits.h>
+
+std::map<std::string, Themes> StringToTheme = {
+    {"Default", Themes::OS   },
+    {"Light",   Themes::LIGHT},
+    {"Dark",    Themes::DARK }
+};
+
+std::map<Themes, std::string> ThemeToString = {
+    {Themes::OS,    "Default"},
+    {Themes::LIGHT, "Light"  },
+    {Themes::DARK,  "Dark"   }
+};
+
+std::map<Anime::Services, std::string> ServiceToString{
+    {Anime::Services::NONE,    "None"   },
+    {Anime::Services::ANILIST, "AniList"}
+};
+
+std::map<std::string, Anime::Services> StringToService{
+    {"None",    Anime::Services::NONE   },
+    {"AniList", Anime::Services::ANILIST}
+};
+
+std::map<Anime::TitleLanguage, std::string> AnimeTitleToStringMap = {
+    {Anime::TitleLanguage::ROMAJI,  "Romaji" },
+    {Anime::TitleLanguage::NATIVE,  "Native" },
+    {Anime::TitleLanguage::ENGLISH, "English"}
+};
+
+std::map<std::string, Anime::TitleLanguage> StringToAnimeTitleMap = {
+    {"Romaji",  Anime::TitleLanguage::ROMAJI },
+    {"Native",  Anime::TitleLanguage::NATIVE },
+    {"English", Anime::TitleLanguage::ENGLISH}
+};
+
+int Config::Load() {
+	Filesystem::Path cfg_path = Filesystem::GetConfigPath();
+	if (!cfg_path.Exists())
+		return 0;
+	std::ifstream config(cfg_path.GetPath(), std::ifstream::in);
+	auto config_js = nlohmann::json::parse(config);
+	service = StringToService[JSON::GetString(config_js, "/General/Service"_json_pointer)];
+	anime_list.language =
+	    StringToAnimeTitleMap[JSON::GetString(config_js, "/Anime List/Title language"_json_pointer, "Romaji")];
+	anime_list.display_aired_episodes =
+	    JSON::GetBoolean(config_js, "/Anime List/Display only aired episodes"_json_pointer, true);
+	anime_list.display_available_episodes =
+	    JSON::GetBoolean(config_js, "/Anime List/Display only available episodes in library"_json_pointer, true);
+	anime_list.highlight_anime_if_available =
+	    JSON::GetBoolean(config_js, "/Anime List/Highlight anime if available"_json_pointer, true);
+	anime_list.highlighted_anime_above_others =
+	    JSON::GetBoolean(config_js, "/Anime List/Display highlighted anime above others"_json_pointer);
+	anilist.auth_token = JSON::GetString(config_js, "/Authorization/AniList/Auth Token"_json_pointer);
+	anilist.username = JSON::GetString(config_js, "/Authorization/AniList/Username"_json_pointer);
+	anilist.user_id = JSON::GetInt(config_js, "/Authorization/AniList/User ID"_json_pointer);
+	theme = StringToTheme[JSON::GetString(config_js, "/Appearance/Theme"_json_pointer)];
+	config.close();
+	return 0;
+}
+
+int Config::Save() {
+	Filesystem::Path cfg_path = Filesystem::GetConfigPath();
+	if (!cfg_path.GetParent().Exists())
+		cfg_path.GetParent().CreateDirectories();
+	std::ofstream config(cfg_path.GetPath(), std::ofstream::out | std::ofstream::trunc);
+	/* clang-format off */
+	nlohmann::json config_js = {
+		{"General",	{
+			{"Service", ServiceToString[service]}
+		}},
+		{"Anime List", {
+			{"Title language", AnimeTitleToStringMap[anime_list.language]},
+			{"Display only aired episodes", anime_list.display_aired_episodes},
+			{"Display only available episodes in library", anime_list.display_available_episodes},
+			{"Highlight anime if available", anime_list.highlight_anime_if_available},
+			{"Display highlighted anime above others", anime_list.highlighted_anime_above_others}
+		}},
+		{"Authorization", {
+			{"AniList", {
+				{"Auth Token", anilist.auth_token},
+				{"Username", anilist.username},
+				{"User ID", anilist.user_id}
+			}}
+		}},
+		{"Appearance", {
+			{"Theme", ThemeToString[theme]}
+		}}
+	};
+	/* clang-format on */
+	config << std::setw(4) << config_js << std::endl;
+	config.close();
+	return 0;
+}