From 90fca74bc857f709680d488c9872d70f2c1bdc20 Mon Sep 17 00:00:00 2001 From: Yingchi Long Date: Sat, 10 Aug 2024 17:32:44 +0800 Subject: [PATCH] use exceptions --- nixd/include/nixd/CommandLine/Configuration.h | 2 + nixd/include/nixd/Support/Exception.h | 18 +++++++++ nixd/include/nixd/Support/JSON.h | 38 +++++++++++++++++++ nixd/lib/CommandLine/Configuration.cpp | 21 +--------- nixd/lib/Controller/LifeTime.cpp | 8 +++- nixd/lib/Support/JSON.cpp | 10 +++++ nixd/lib/meson.build | 1 + 7 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 nixd/include/nixd/Support/Exception.h create mode 100644 nixd/include/nixd/Support/JSON.h create mode 100644 nixd/lib/Support/JSON.cpp diff --git a/nixd/include/nixd/CommandLine/Configuration.h b/nixd/include/nixd/CommandLine/Configuration.h index 47a1aeb32..817445b44 100644 --- a/nixd/include/nixd/CommandLine/Configuration.h +++ b/nixd/include/nixd/CommandLine/Configuration.h @@ -3,6 +3,8 @@ #include "nixd/Controller/Configuration.h" +#include + namespace nixd { /// \brief Parse the CLI flag and initialize the config nixd::DefaultConfig diff --git a/nixd/include/nixd/Support/Exception.h b/nixd/include/nixd/Support/Exception.h new file mode 100644 index 000000000..7b014f78b --- /dev/null +++ b/nixd/include/nixd/Support/Exception.h @@ -0,0 +1,18 @@ +#pragma once + +#include + +#include + +namespace nixd { + +class LLVMErrorException : public std::exception { + llvm::Error E; + +public: + LLVMErrorException(llvm::Error E) : E(std::move(E)) {} + + llvm::Error takeError() { return std::move(E); } +}; + +} // namespace nixd diff --git a/nixd/include/nixd/Support/JSON.h b/nixd/include/nixd/Support/JSON.h new file mode 100644 index 000000000..6f3a2404b --- /dev/null +++ b/nixd/include/nixd/Support/JSON.h @@ -0,0 +1,38 @@ +#include "Exception.h" + +#include +#include + +#include + +namespace nixd { + +class JSONParseException : public LLVMErrorException { +public: + JSONParseException(llvm::Error E) : LLVMErrorException(std::move(E)) {} + + [[nodiscard]] const char *what() const noexcept override { + return "JSON result cannot be parsed"; + } +}; + +class JSONSchemaException : public LLVMErrorException { +public: + JSONSchemaException(llvm::Error E) : LLVMErrorException(std::move(E)) {} + + [[nodiscard]] const char *what() const noexcept override { + return "JSON schema mismatch"; + } +}; + +llvm::json::Value parse(llvm::StringRef JSON); + +template T fromJSON(const llvm::json::Value &V) { + llvm::json::Path::Root R; + T Result; + if (!fromJSON(V, Result, R)) + throw JSONSchemaException(R.getError()); + return Result; +} + +} // namespace nixd diff --git a/nixd/lib/CommandLine/Configuration.cpp b/nixd/lib/CommandLine/Configuration.cpp index 14c1a5b6a..e361ee4be 100644 --- a/nixd/lib/CommandLine/Configuration.cpp +++ b/nixd/lib/CommandLine/Configuration.cpp @@ -4,6 +4,7 @@ #include "nixd/CommandLine/Configuration.h" #include "nixd/CommandLine/Options.h" #include "nixd/Controller/Configuration.h" +#include "nixd/Support/JSON.h" #include "lspserver/Logger.h" @@ -28,23 +29,5 @@ Configuration nixd::parseCLIConfig() { if (DefaultConfigJSON.empty()) return {}; - llvm::Expected V = llvm::json::parse(DefaultConfigJSON); - - if (!V) { - llvm::errs() - << "The JSON string of default configuration cannot be parsed, reason: " - << V.takeError() << "\n"; - std::exit(-1); - } - - llvm::json::Path::Root R; - Configuration C; - if (!fromJSON(*V, C, R)) { - // JSON is valid, but it has incorrect schema - llvm::errs() - << "The JSON string of default configuration has invalid schema: " - << R.getError() << "\n"; - std::exit(-1); - } - return C; + return nixd::fromJSON(nixd::parse(DefaultConfigJSON)); } diff --git a/nixd/lib/Controller/LifeTime.cpp b/nixd/lib/Controller/LifeTime.cpp index 414c6d1f3..a205fd27e 100644 --- a/nixd/lib/Controller/LifeTime.cpp +++ b/nixd/lib/Controller/LifeTime.cpp @@ -11,6 +11,7 @@ #include "nixd/Eval/Launch.h" #include "lspserver/Protocol.h" +#include "nixd/Support/Exception.h" #include @@ -184,7 +185,12 @@ void Controller:: evalExprWithProgress(*Client, getDefaultNixOSOptionsExpr(), "nixos options"); } - Config = parseCLIConfig(); + try { + Config = parseCLIConfig(); + } catch (LLVMErrorException &Err) { + lspserver::elog("{0}, reason: {1}", Err.what(), Err.takeError()); + std::exit(-1); + } fetchConfig(); } diff --git a/nixd/lib/Support/JSON.cpp b/nixd/lib/Support/JSON.cpp new file mode 100644 index 000000000..d92db13d6 --- /dev/null +++ b/nixd/lib/Support/JSON.cpp @@ -0,0 +1,10 @@ +#include "nixd/Support/JSON.h" + +#include + +llvm::json::Value nixd::parse(llvm::StringRef JSON) { + llvm::Expected E = llvm::json::parse(JSON); + if (!E) + throw JSONParseException(E.takeError()); + return *E; +} diff --git a/nixd/lib/meson.build b/nixd/lib/meson.build index f1e2ac934..701850a24 100644 --- a/nixd/lib/meson.build +++ b/nixd/lib/meson.build @@ -34,6 +34,7 @@ libnixd_lib = library( 'Support/AutoCloseFD.cpp', 'Support/AutoRemoveShm.cpp', 'Support/ForkPiped.cpp', + 'Support/JSON.cpp', 'Support/StreamProc.cpp', dependencies: libnixd_deps, include_directories: libnixd_include,