v2.0.3-rc (#32)
	
		
			
	
		
	
	
		
	
		
			Some checks reported errors
		
		
	
	
		
			
				
	
				BlockStorage/repertory/pipeline/head Something is wrong with the build of this commit
				
			
		
		
	
	
				
					
				
			
		
			Some checks reported errors
		
		
	
	BlockStorage/repertory/pipeline/head Something is wrong with the build of this commit
				
			# Changelog ## v2.0.3-rc ### Issues * \#28 \[bug\] Address slow directory responses in S3 mounts for deeply nested directories * \#29 \[bug\] S3 error responses are not being logged * \#30 \[bug\] Sia provider error responses are not logged * \#31 \[bug\] S3 provider should limit max key size to 1024 ### Changes from v2.0.2-rc * Always use direct for read-only providers * Fixed externally removed files not being processed during cleanup * Fixed http headers not being added for requests * Fixed incorrect `stat` values for remote mounts * Fixed invalid directory nullptr error on remote mounts * Fixed memory leak in event system * Refactored application shutdown * Refactored event system * Updated build system to Alpine 3.21.0 * Updated build system to MinGW-w64 12.0.0 * Updated copyright to 2018-2025 Reviewed-on: #32
This commit is contained in:
		| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -22,12 +22,14 @@ | ||||
| #ifndef REPERTORY_INCLUDE_APP_CONFIG_HPP_ | ||||
| #define REPERTORY_INCLUDE_APP_CONFIG_HPP_ | ||||
|  | ||||
| #include "events/event.hpp" | ||||
| #include "types/remote.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| class app_config final { | ||||
| private: | ||||
|   static stop_type stop_requested; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] static auto | ||||
|   default_agent_name(const provider_type &prov) -> std::string; | ||||
| @@ -50,6 +52,11 @@ public: | ||||
|   [[nodiscard]] static auto | ||||
|   get_provider_name(const provider_type &prov) -> std::string; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] static auto get_stop_requested() -> bool; | ||||
|  | ||||
|   static void set_stop_requested(); | ||||
|  | ||||
| public: | ||||
|   app_config(const provider_type &prov, std::string_view data_directory = ""); | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -22,10 +22,11 @@ | ||||
| #ifndef REPERTORY_INCLUDE_COMM_CURL_CURL_COMM_HPP_ | ||||
| #define REPERTORY_INCLUDE_COMM_CURL_CURL_COMM_HPP_ | ||||
|  | ||||
| #include "app_config.hpp" | ||||
| #include "comm/curl/multi_request.hpp" | ||||
| #include "comm/i_http_comm.hpp" | ||||
| #include "events/event_system.hpp" | ||||
| #include "events/events.hpp" | ||||
| #include "events/types/curl_error.hpp" | ||||
| #include "utils/encryption.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| @@ -42,7 +43,7 @@ private: | ||||
|  | ||||
|   struct read_write_info final { | ||||
|     data_buffer data{}; | ||||
|     stop_type &stop_requested; | ||||
|     stop_type_callback stop_requested_cb; | ||||
|   }; | ||||
|  | ||||
|   static const write_callback write_data; | ||||
| @@ -61,13 +62,14 @@ public: | ||||
|   [[nodiscard]] static auto reset_curl(CURL *curl_handle) -> CURL *; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] static auto | ||||
|   construct_url(CURL *curl, const std::string &relative_path, | ||||
|                 const host_config &cfg) -> std::string; | ||||
|   [[nodiscard]] static auto construct_url(CURL *curl, | ||||
|                                           const std::string &relative_path, | ||||
|                                           const host_config &cfg) | ||||
|       -> std::string; | ||||
|  | ||||
|   [[nodiscard]] static auto | ||||
|   create_host_config(const s3_config &cfg, | ||||
|                      bool use_s3_path_style) -> host_config; | ||||
|   [[nodiscard]] static auto create_host_config(const s3_config &cfg, | ||||
|                                                bool use_s3_path_style) | ||||
|       -> host_config; | ||||
|  | ||||
|   [[nodiscard]] static auto url_encode(CURL *curl, const std::string &data, | ||||
|                                        bool allow_slash) -> std::string; | ||||
| @@ -75,8 +77,8 @@ public: | ||||
|   template <typename request_type> | ||||
|   [[nodiscard]] static auto | ||||
|   make_encrypted_request(const host_config &cfg, const request_type &request, | ||||
|                          long &response_code, | ||||
|                          stop_type &stop_requested) -> bool { | ||||
|                          long &response_code, stop_type &stop_requested) | ||||
|       -> bool { | ||||
|     response_code = 0; | ||||
|  | ||||
|     if (not request.decryption_token.has_value() || | ||||
| @@ -114,7 +116,7 @@ public: | ||||
|                 return false; | ||||
|               } | ||||
|  | ||||
|               if (response_code != 200) { | ||||
|               if (response_code != http_error_codes::ok) { | ||||
|                 return false; | ||||
|               } | ||||
|  | ||||
| @@ -135,6 +137,8 @@ public: | ||||
|   [[nodiscard]] static auto | ||||
|   make_request(const host_config &cfg, const request_type &request, | ||||
|                long &response_code, stop_type &stop_requested) -> bool { | ||||
|     REPERTORY_USES_FUNCTION_NAME(); | ||||
|  | ||||
|     if (request.decryption_token.has_value() && | ||||
|         not request.decryption_token.value().empty()) { | ||||
|       return make_encrypted_request(cfg, request, response_code, | ||||
| @@ -169,7 +173,12 @@ public: | ||||
|       curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_headers); | ||||
|     } | ||||
|  | ||||
|     read_write_info write_info{{}, stop_requested}; | ||||
|     read_write_info write_info{ | ||||
|         {}, | ||||
|         [&stop_requested]() -> bool { | ||||
|           return stop_requested || app_config::get_stop_requested(); | ||||
|         }, | ||||
|     }; | ||||
|     if (request.response_handler.has_value()) { | ||||
|       curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_info); | ||||
|       curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); | ||||
| @@ -193,6 +202,16 @@ public: | ||||
|                        request.aws_service.value().c_str()); | ||||
|     } | ||||
|  | ||||
|     curl_slist *header_list{nullptr}; | ||||
|     if (not request.headers.empty()) { | ||||
|       for (const auto &header : request.headers) { | ||||
|         header_list = curl_slist_append( | ||||
|             header_list, | ||||
|             fmt::format("{}: {}", header.first, header.second).c_str()); | ||||
|       } | ||||
|       curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list); | ||||
|     } | ||||
|  | ||||
|     auto url = construct_url(curl, request.get_path(), cfg) + parameters; | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); | ||||
|  | ||||
| @@ -200,8 +219,14 @@ public: | ||||
|  | ||||
|     CURLcode curl_code{}; | ||||
|     curl_request.get_result(curl_code, response_code); | ||||
|  | ||||
|     if (header_list != nullptr) { | ||||
|       curl_slist_free_all(header_list); | ||||
|     } | ||||
|  | ||||
|     if (curl_code != CURLE_OK) { | ||||
|       event_system::instance().raise<curl_error>(url, curl_code); | ||||
|       event_system::instance().raise<curl_error>(curl_code, function_name, | ||||
|                                                   url); | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
| @@ -215,26 +240,30 @@ public: | ||||
| public: | ||||
|   void enable_s3_path_style(bool enable) override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   make_request(const curl::requests::http_delete &del, long &response_code, | ||||
|                stop_type &stop_requested) const -> bool override; | ||||
|   [[nodiscard]] auto make_request(const curl::requests::http_delete &del, | ||||
|                                   long &response_code, | ||||
|                                   stop_type &stop_requested) const | ||||
|       -> bool override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   make_request(const curl::requests::http_get &get, long &response_code, | ||||
|                stop_type &stop_requested) const -> bool override; | ||||
|   [[nodiscard]] auto make_request(const curl::requests::http_get &get, | ||||
|                                   long &response_code, | ||||
|                                   stop_type &stop_requested) const | ||||
|       -> bool override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   make_request(const curl::requests::http_head &head, long &response_code, | ||||
|                stop_type &stop_requested) const -> bool override; | ||||
|   [[nodiscard]] auto make_request(const curl::requests::http_head &head, | ||||
|                                   long &response_code, | ||||
|                                   stop_type &stop_requested) const | ||||
|       -> bool override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   make_request(const curl::requests::http_post &post_file, long &response_code, | ||||
|                stop_type &stop_requested) const -> bool override; | ||||
|   [[nodiscard]] auto make_request(const curl::requests::http_post &post_file, | ||||
|                                   long &response_code, | ||||
|                                   stop_type &stop_requested) const | ||||
|       -> bool override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   make_request(const curl::requests::http_put_file &put_file, | ||||
|                long &response_code, | ||||
|                stop_type &stop_requested) const -> bool override; | ||||
|   [[nodiscard]] auto make_request(const curl::requests::http_put_file &put_file, | ||||
|                                   long &response_code, | ||||
|                                   stop_type &stop_requested) const | ||||
|       -> bool override; | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -36,6 +36,9 @@ private: | ||||
|   stop_type &stop_requested_; | ||||
|   CURLM *multi_handle_; | ||||
|  | ||||
| private: | ||||
|   [[nodiscard]] auto get_stop_requested() const -> bool; | ||||
|  | ||||
| public: | ||||
|   void get_result(CURLcode &curl_code, long &http_code); | ||||
| }; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -32,15 +32,15 @@ struct http_post final : http_request_base { | ||||
|   auto operator=(const http_post &) -> http_post & = default; | ||||
|   auto operator=(http_post &&) -> http_post & = default; | ||||
|  | ||||
|   ~http_post() override; | ||||
|   ~http_post() override = default; | ||||
|  | ||||
|   std::optional<nlohmann::json> json; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   set_method(CURL *curl, stop_type & /*stop_requested*/) const -> bool override; | ||||
|   [[nodiscard]] auto set_method(CURL *curl, | ||||
|                                 stop_type & /*stop_requested*/) const | ||||
|       -> bool override; | ||||
|  | ||||
| private: | ||||
|   mutable curl_slist *headers{nullptr}; | ||||
|   mutable std::optional<std::string> json_str; | ||||
| }; | ||||
| } // namespace repertory::curl::requests | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -51,7 +51,7 @@ struct http_request_base { | ||||
|   bool allow_timeout{}; | ||||
|   std::optional<std::string> aws_service; | ||||
|   std::optional<std::string> decryption_token{}; | ||||
|   http_headers headers{}; | ||||
|   mutable http_headers headers{}; | ||||
|   std::string path{}; | ||||
|   http_query_parameters query{}; | ||||
|   std::optional<http_range> range{}; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -69,21 +69,21 @@ private: | ||||
|  | ||||
|   void put_client(std::shared_ptr<client> &cli); | ||||
|  | ||||
|   [[nodiscard]] auto read_packet(client &cli, packet &response) | ||||
|       -> packet::error_type; | ||||
|   [[nodiscard]] auto read_packet(client &cli, | ||||
|                                  packet &response) const -> packet::error_type; | ||||
|  | ||||
|   void resolve(); | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] auto send(std::string_view method, std::uint32_t &service_flags) | ||||
|       -> packet::error_type; | ||||
|   [[nodiscard]] auto send(std::string_view method, | ||||
|                           std::uint32_t &service_flags) -> packet::error_type; | ||||
|  | ||||
|   [[nodiscard]] auto send(std::string_view method, packet &request, | ||||
|                           std::uint32_t &service_flags) -> packet::error_type; | ||||
|  | ||||
|   [[nodiscard]] auto send(std::string_view method, packet &request, | ||||
|                           packet &response, std::uint32_t &service_flags) | ||||
|       -> packet::error_type; | ||||
|                           packet &response, | ||||
|                           std::uint32_t &service_flags) -> packet::error_type; | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -221,25 +221,44 @@ using WCHAR = wchar_t; | ||||
|  | ||||
| #define MAX_PATH 260 | ||||
|  | ||||
| #define STATUS_SUCCESS std::uint32_t{0U} | ||||
| #define STATUS_ACCESS_DENIED std::uint32_t{0xC0000022L} | ||||
| #define STATUS_DEVICE_BUSY std::uint32_t{0x80000011L} | ||||
| #define STATUS_DEVICE_INSUFFICIENT_RESOURCES std::uint32_t{0xC0000468L} | ||||
| #define STATUS_DIRECTORY_NOT_EMPTY std::uint32_t{0xC0000101L} | ||||
| #define STATUS_FILE_IS_A_DIRECTORY std::uint32_t{0xC00000BAL} | ||||
| #define STATUS_FILE_TOO_LARGE std::uint32_t{0xC0000904L} | ||||
| #define STATUS_INSUFFICIENT_RESOURCES std::uint32_t{0xC000009AL} | ||||
| #define STATUS_INTERNAL_ERROR std::uint32_t{0xC00000E5L} | ||||
| #define STATUS_INVALID_ADDRESS std::uint32_t{0xC0000141L} | ||||
| #define STATUS_INVALID_HANDLE std::uint32_t{0xC0000006L} | ||||
| #define STATUS_INVALID_IMAGE_FORMAT std::uint32_t{0xC000007BL} | ||||
| #define STATUS_INVALID_PARAMETER std::uint32_t{0xC000000DL} | ||||
| #define STATUS_NO_MEMORY std::uint32_t{0xC0000017L} | ||||
| #define STATUS_NOT_IMPLEMENTED std::uint32_t{0xC0000002L} | ||||
| #define STATUS_OBJECT_NAME_EXISTS std::uint32_t{0x40000000L} | ||||
| #define STATUS_OBJECT_NAME_NOT_FOUND std::uint32_t{0xC0000034L} | ||||
| #define STATUS_OBJECT_PATH_INVALID std::uint32_t{0xC0000039L} | ||||
| #define STATUS_UNEXPECTED_IO_ERROR std::uint32_t{0xC00000E9L} | ||||
| #define STATUS_SUCCESS                                                         \ | ||||
|   std::uint32_t { 0U } | ||||
| #define STATUS_ACCESS_DENIED                                                   \ | ||||
|   std::uint32_t { 0xC0000022L } | ||||
| #define STATUS_DEVICE_BUSY                                                     \ | ||||
|   std::uint32_t { 0x80000011L } | ||||
| #define STATUS_DEVICE_INSUFFICIENT_RESOURCES                                   \ | ||||
|   std::uint32_t { 0xC0000468L } | ||||
| #define STATUS_DIRECTORY_NOT_EMPTY                                             \ | ||||
|   std::uint32_t { 0xC0000101L } | ||||
| #define STATUS_FILE_IS_A_DIRECTORY                                             \ | ||||
|   std::uint32_t { 0xC00000BAL } | ||||
| #define STATUS_FILE_TOO_LARGE                                                  \ | ||||
|   std::uint32_t { 0xC0000904L } | ||||
| #define STATUS_INSUFFICIENT_RESOURCES                                          \ | ||||
|   std::uint32_t { 0xC000009AL } | ||||
| #define STATUS_INTERNAL_ERROR                                                  \ | ||||
|   std::uint32_t { 0xC00000E5L } | ||||
| #define STATUS_INVALID_ADDRESS                                                 \ | ||||
|   std::uint32_t { 0xC0000141L } | ||||
| #define STATUS_INVALID_HANDLE                                                  \ | ||||
|   std::uint32_t { 0xC0000006L } | ||||
| #define STATUS_INVALID_IMAGE_FORMAT                                            \ | ||||
|   std::uint32_t { 0xC000007BL } | ||||
| #define STATUS_INVALID_PARAMETER                                               \ | ||||
|   std::uint32_t { 0xC000000DL } | ||||
| #define STATUS_NO_MEMORY                                                       \ | ||||
|   std::uint32_t { 0xC0000017L } | ||||
| #define STATUS_NOT_IMPLEMENTED                                                 \ | ||||
|   std::uint32_t { 0xC0000002L } | ||||
| #define STATUS_OBJECT_NAME_EXISTS                                              \ | ||||
|   std::uint32_t { 0x40000000L } | ||||
| #define STATUS_OBJECT_NAME_NOT_FOUND                                           \ | ||||
|   std::uint32_t { 0xC0000034L } | ||||
| #define STATUS_OBJECT_PATH_INVALID                                             \ | ||||
|   std::uint32_t { 0xC0000039L } | ||||
| #define STATUS_UNEXPECTED_IO_ERROR                                             \ | ||||
|   std::uint32_t { 0xC00000E9L } | ||||
|  | ||||
| #define CONVERT_STATUS_NOT_IMPLEMENTED(e)                                      \ | ||||
|   ((std::uint32_t(e) == STATUS_NOT_IMPLEMENTED) ? -ENOTSUP : e) | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -31,7 +31,7 @@ class i_file_db { | ||||
| public: | ||||
|   struct file_info final { | ||||
|     std::string api_path; | ||||
|     bool directory; | ||||
|     bool directory{}; | ||||
|     std::string source_path; | ||||
|   }; | ||||
|  | ||||
| @@ -56,6 +56,10 @@ public: | ||||
|  | ||||
|   [[nodiscard]] virtual auto count() const -> std::uint64_t = 0; | ||||
|  | ||||
|   virtual void enumerate_item_list( | ||||
|       std::function<void(const std::vector<i_file_db::file_info> &)> callback, | ||||
|       stop_type_callback stop_requested_cb) const = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_api_path(const std::string &source_path, | ||||
|                                           std::string &api_path) const | ||||
|       -> api_error = 0; | ||||
| @@ -80,7 +84,8 @@ public: | ||||
|   get_file_source_path(const std::string &api_path, | ||||
|                        std::string &source_path) const -> api_error = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_item_list() const | ||||
|   [[nodiscard]] virtual auto | ||||
|   get_item_list(stop_type_callback stop_requested_cb) const | ||||
|       -> std::vector<file_info> = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_source_path(const std::string &api_path, | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -41,10 +41,7 @@ public: | ||||
|     std::string source_path; | ||||
|   }; | ||||
|  | ||||
|   struct upload_entry final { | ||||
|     std::string api_path; | ||||
|     std::string source_path; | ||||
|   }; | ||||
|   using upload_entry = upload_active_entry; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] virtual auto add_resume(const resume_entry &entry) -> bool = 0; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -31,6 +31,10 @@ class i_meta_db { | ||||
| public: | ||||
|   virtual void clear() = 0; | ||||
|  | ||||
|   virtual void enumerate_api_path_list( | ||||
|       std::function<void(const std::vector<std::string> &)> callback, | ||||
|       stop_type_callback stop_requested_cb) const = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_api_path(const std::string &source_path, | ||||
|                                           std::string &api_path) const | ||||
|       -> api_error = 0; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -67,50 +67,54 @@ private: | ||||
|                                  rocksdb::Transaction *txn) -> rocksdb::Status; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] auto | ||||
|   add_directory(const std::string &api_path, | ||||
|                 const std::string &source_path) -> api_error override; | ||||
|   [[nodiscard]] auto add_directory(const std::string &api_path, | ||||
|                                    const std::string &source_path) | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   add_or_update_file(const i_file_db::file_data &data) -> api_error override; | ||||
|   [[nodiscard]] auto add_or_update_file(const i_file_db::file_data &data) | ||||
|       -> api_error override; | ||||
|  | ||||
|   void clear() override; | ||||
|  | ||||
|   [[nodiscard]] auto count() const -> std::uint64_t override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   get_api_path(const std::string &source_path, | ||||
|                std::string &api_path) const -> api_error override; | ||||
|   void enumerate_item_list( | ||||
|       std::function<void(const std::vector<i_file_db::file_info> &)> callback, | ||||
|       stop_type_callback stop_requested_cb) const override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   get_directory_api_path(const std::string &source_path, | ||||
|                          std::string &api_path) const -> api_error override; | ||||
|   [[nodiscard]] auto get_api_path(const std::string &source_path, | ||||
|                                   std::string &api_path) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto get_directory_api_path(const std::string &source_path, | ||||
|                                             std::string &api_path) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto get_directory_source_path(const std::string &api_path, | ||||
|                                                std::string &source_path) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   get_file_api_path(const std::string &source_path, | ||||
|                     std::string &api_path) const -> api_error override; | ||||
|   [[nodiscard]] auto get_file_api_path(const std::string &source_path, | ||||
|                                        std::string &api_path) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   get_file_data(const std::string &api_path, | ||||
|                 i_file_db::file_data &data) const -> api_error override; | ||||
|   [[nodiscard]] auto get_file_data(const std::string &api_path, | ||||
|                                    i_file_db::file_data &data) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   get_file_source_path(const std::string &api_path, | ||||
|                        std::string &source_path) const -> api_error override; | ||||
|   [[nodiscard]] auto get_file_source_path(const std::string &api_path, | ||||
|                                           std::string &source_path) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   get_item_list() const -> std::vector<i_file_db::file_info> override; | ||||
|   [[nodiscard]] auto get_item_list(stop_type_callback stop_requested_cb) const | ||||
|       -> std::vector<i_file_db::file_info> override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   get_source_path(const std::string &api_path, | ||||
|                   std::string &source_path) const -> api_error override; | ||||
|   [[nodiscard]] auto get_source_path(const std::string &api_path, | ||||
|                                      std::string &source_path) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   remove_item(const std::string &api_path) -> api_error override; | ||||
|   [[nodiscard]] auto remove_item(const std::string &api_path) | ||||
|       -> api_error override; | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -80,6 +80,10 @@ private: | ||||
| public: | ||||
|   void clear() override; | ||||
|  | ||||
|   void enumerate_api_path_list( | ||||
|       std::function<void(const std::vector<std::string> &)> callback, | ||||
|       stop_type_callback stop_requested_cb) const override; | ||||
|  | ||||
|   [[nodiscard]] auto get_api_path(const std::string &source_path, | ||||
|                                   std::string &api_path) const | ||||
|       -> api_error override; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -53,6 +53,10 @@ public: | ||||
|  | ||||
|   [[nodiscard]] auto count() const -> std::uint64_t override; | ||||
|  | ||||
|   void enumerate_item_list( | ||||
|       std::function<void(const std::vector<i_file_db::file_info> &)> callback, | ||||
|       stop_type_callback stop_requested_cb) const override; | ||||
|  | ||||
|   [[nodiscard]] auto get_api_path(const std::string &source_path, | ||||
|                                   std::string &api_path) const | ||||
|       -> api_error override; | ||||
| @@ -77,7 +81,7 @@ public: | ||||
|                                           std::string &source_path) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto get_item_list() const | ||||
|   [[nodiscard]] auto get_item_list(stop_type_callback stop_requested_cb) const | ||||
|       -> std::vector<i_file_db::file_info> override; | ||||
|  | ||||
|   [[nodiscard]] auto get_source_path(const std::string &api_path, | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -50,6 +50,10 @@ private: | ||||
| public: | ||||
|   void clear() override; | ||||
|  | ||||
|   void enumerate_api_path_list( | ||||
|       std::function<void(const std::vector<std::string> &)> callback, | ||||
|       stop_type_callback stop_requested_cb) const override; | ||||
|  | ||||
|   [[nodiscard]] auto get_api_path(const std::string &source_path, | ||||
|                                   std::string &api_path) const | ||||
|       -> api_error override; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -22,12 +22,10 @@ | ||||
| #ifndef REPERTORY_INCLUDE_DRIVES_DIRECTORY_CACHE_HPP_ | ||||
| #define REPERTORY_INCLUDE_DRIVES_DIRECTORY_CACHE_HPP_ | ||||
|  | ||||
| #include "utils/single_thread_service_base.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| class directory_iterator; | ||||
|  | ||||
| class directory_cache final : public single_thread_service_base { | ||||
| class directory_cache final { | ||||
| public: | ||||
|   using execute_callback = std::function<void(directory_iterator &)>; | ||||
|  | ||||
| @@ -35,13 +33,11 @@ private: | ||||
|   struct open_directory final { | ||||
|     std::shared_ptr<directory_iterator> iterator; | ||||
|     std::vector<std::uint64_t> handles; | ||||
|     std::chrono::system_clock::time_point last_update{ | ||||
|         std::chrono::system_clock::now()}; | ||||
|   }; | ||||
|  | ||||
| public: | ||||
|   directory_cache() : single_thread_service_base("directory_cache") {} | ||||
|   ~directory_cache() override = default; | ||||
|   directory_cache() = default; | ||||
|   ~directory_cache() = default; | ||||
|  | ||||
|   directory_cache(const directory_cache &) = delete; | ||||
|   directory_cache(directory_cache &&) = delete; | ||||
| @@ -51,10 +47,6 @@ public: | ||||
| private: | ||||
|   std::unordered_map<std::string, open_directory> directory_lookup_; | ||||
|   std::recursive_mutex directory_mutex_; | ||||
|   std::unique_ptr<std::thread> refresh_thread_; | ||||
|  | ||||
| protected: | ||||
|   void service_function() override; | ||||
|  | ||||
| public: | ||||
|   void execute_action(const std::string &api_path, | ||||
| @@ -63,7 +55,7 @@ public: | ||||
|   [[nodiscard]] auto get_directory(std::uint64_t handle) | ||||
|       -> std::shared_ptr<directory_iterator>; | ||||
|  | ||||
|   [[nodiscard]] auto remove_directory(const std::string &api_path) | ||||
|   auto remove_directory(const std::string &api_path) | ||||
|       -> std::shared_ptr<directory_iterator>; | ||||
|  | ||||
|   void remove_directory(std::uint64_t handle); | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,41 +0,0 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_DRIVES_FUSE_EVENTS_HPP_ | ||||
| #define REPERTORY_INCLUDE_DRIVES_FUSE_EVENTS_HPP_ | ||||
|  | ||||
| #include "events/event_system.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| // clang-format off | ||||
| E_SIMPLE3(fuse_event, debug, true, | ||||
|   std::string, function, func, E_FROM_STRING, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   int, result, res, E_FROM_INT32 | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(fuse_args_parsed, info, true, | ||||
|   std::string, arguments, args, E_FROM_STRING | ||||
| ); | ||||
| // clang-format on | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_DRIVES_FUSE_EVENTS_HPP_ | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -24,7 +24,7 @@ | ||||
| #if !defined(_WIN32) | ||||
|  | ||||
| #include "events/event_system.hpp" | ||||
| #include "utils/path.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| class app_config; | ||||
| @@ -51,8 +51,8 @@ private: | ||||
|   std::string mount_location_; | ||||
|  | ||||
| protected: | ||||
|   bool atime_enabled_ = true; | ||||
|   bool console_enabled_ = false; | ||||
|   bool atime_enabled_{true}; | ||||
|   bool console_enabled_{false}; | ||||
|   std::optional<gid_t> forced_gid_; | ||||
|   std::optional<uid_t> forced_uid_; | ||||
|   std::optional<mode_t> forced_umask_; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -63,11 +63,14 @@ private: | ||||
|   std::shared_ptr<logging_consumer> logging_consumer_; | ||||
|   std::shared_ptr<remote_fuse::remote_server> remote_server_; | ||||
|   std::shared_ptr<full_server> server_; | ||||
|   bool was_mounted_ = false; | ||||
|   std::mutex stop_all_mtx_; | ||||
|   bool was_mounted_{false}; | ||||
|  | ||||
| private: | ||||
|   void update_accessed_time(const std::string &api_path); | ||||
|  | ||||
|   void stop_all(); | ||||
|  | ||||
| protected: | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] auto chflags_impl(std::string api_path, | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -53,8 +53,8 @@ private: | ||||
|   bool was_mounted_ = false; | ||||
|  | ||||
| private: | ||||
|   void populate_stat(const remote::stat &r_stat, bool directory, | ||||
|                      struct stat &unix_st); | ||||
|   static void populate_stat(const remote::stat &r_stat, bool directory, | ||||
|                             struct stat &unix_st); | ||||
|  | ||||
| protected: | ||||
|   [[nodiscard]] auto access_impl(std::string api_path, | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -30,7 +30,10 @@ | ||||
| #include "drives/remote/remote_open_file_table.hpp" | ||||
| #include "drives/winfsp/remotewinfsp/i_remote_instance.hpp" | ||||
| #include "events/event_system.hpp" | ||||
| #include "events/events.hpp" | ||||
| #include "events/types/service_start_begin.hpp" | ||||
| #include "events/types/service_start_end.hpp" | ||||
| #include "events/types/service_stop_begin.hpp" | ||||
| #include "events/types/service_stop_end.hpp" | ||||
| #include "types/remote.hpp" | ||||
| #include "types/repertory.hpp" | ||||
| #include "utils/base64.hpp" | ||||
| @@ -55,7 +58,10 @@ public: | ||||
|         drive_(drv), | ||||
|         mount_location_(std::move(mount_location)), | ||||
|         client_pool_(config.get_remote_mount().client_pool_size) { | ||||
|     event_system::instance().raise<service_started>("remote_server_base"); | ||||
|     REPERTORY_USES_FUNCTION_NAME(); | ||||
|  | ||||
|     event_system::instance().raise<service_start_begin>(function_name, | ||||
|                                                         "remote_server_base"); | ||||
|     handler_lookup_.insert( | ||||
|         {"::winfsp_can_delete", | ||||
|          [this](std::uint32_t, const std::string &, std::uint64_t, | ||||
| @@ -1372,14 +1378,19 @@ public: | ||||
|                                        method, request, response, | ||||
|                                        message_complete); | ||||
|         }); | ||||
|     event_system::instance().raise<service_start_end>(function_name, | ||||
|                                                       "remote_server_base"); | ||||
|   } | ||||
|  | ||||
|   ~remote_server_base() override { | ||||
|     event_system::instance().raise<service_shutdown_begin>( | ||||
|         "remote_server_base"); | ||||
|     REPERTORY_USES_FUNCTION_NAME(); | ||||
|  | ||||
|     event_system::instance().raise<service_stop_begin>(function_name, | ||||
|                                                        "remote_server_base"); | ||||
|     client_pool_.shutdown(); | ||||
|     packet_server_.reset(); | ||||
|     event_system::instance().raise<service_shutdown_end>("remote_server_base"); | ||||
|     event_system::instance().raise<service_stop_end>(function_name, | ||||
|                                                      "remote_server_base"); | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -73,6 +73,7 @@ private: | ||||
|   std::unique_ptr<file_manager> fm_; | ||||
|   std::unique_ptr<eviction> eviction_; | ||||
|   std::unique_ptr<remote_winfsp::remote_server> remote_server_; | ||||
|   std::mutex stop_all_mtx_; | ||||
|  | ||||
| private: | ||||
|   [[nodiscard]] auto handle_error(std::string_view function_name, | ||||
| @@ -94,6 +95,8 @@ private: | ||||
|   static void set_file_info(remote::file_info &dest, | ||||
|                             const FSP_FSCTL_FILE_INFO &src); | ||||
|  | ||||
|   void stop_all(); | ||||
|  | ||||
| public: | ||||
|   auto CanDelete(PVOID file_node, PVOID file_desc, PWSTR file_name) | ||||
|       -> NTSTATUS override; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -23,6 +23,7 @@ | ||||
| #define REPERTORY_INCLUDE_EVENTS_CONSUMERS_CONSOLE_CONSUMER_HPP_ | ||||
|  | ||||
| #include "events/event_system.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| class console_consumer final { | ||||
| @@ -36,7 +37,7 @@ public: | ||||
|   ~console_consumer(); | ||||
|  | ||||
| private: | ||||
|   void process_event(const event &e) const; | ||||
|   static void process_event(const i_event &evt); | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -23,9 +23,10 @@ | ||||
| #define REPERTORY_INCLUDE_EVENTS_CONSUMERS_LOGGING_CONSUMER_HPP_ | ||||
|  | ||||
| #include "events/event_system.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| class logging_consumer { | ||||
| class logging_consumer final { | ||||
|   E_CONSUMER(); | ||||
|  | ||||
| public: | ||||
| @@ -39,7 +40,7 @@ private: | ||||
|                                                          5ULL}; | ||||
|  | ||||
| private: | ||||
|   void process_event(const event &event) const; | ||||
|   static void process_event(const i_event &evt); | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
|   | ||||
| @@ -1,92 +0,0 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_EVENT_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_EVENT_HPP_ | ||||
|  | ||||
| namespace repertory { | ||||
| enum class event_level { | ||||
|   critical, | ||||
|   error, | ||||
|   warn, | ||||
|   info, | ||||
|   debug, | ||||
|   trace, | ||||
| }; | ||||
|  | ||||
| [[nodiscard]] auto | ||||
| event_level_from_string(std::string level, | ||||
|                         event_level default_level = event_level::info) | ||||
|     -> event_level; | ||||
|  | ||||
| [[nodiscard]] auto event_level_to_string(event_level level) -> std::string; | ||||
|  | ||||
| class event { | ||||
| protected: | ||||
|   explicit event(bool allow_async) : allow_async_(allow_async) {} | ||||
|  | ||||
|   event(const std::stringstream &ss, json j, bool allow_async) | ||||
|       : allow_async_(allow_async), ss_(ss.str()), j_(std::move(j)) {} | ||||
|  | ||||
| public: | ||||
|   event(const event &) = delete; | ||||
|   event(event &&) = delete; | ||||
|   auto operator=(const event &) -> event & = delete; | ||||
|   auto operator=(event &&) -> event & = delete; | ||||
|   virtual ~event() = default; | ||||
|  | ||||
| private: | ||||
|   bool allow_async_; | ||||
|  | ||||
| protected: | ||||
|   std::stringstream ss_; | ||||
|   json j_; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] virtual auto clone() const -> std::shared_ptr<event> = 0; | ||||
|  | ||||
|   [[nodiscard]] auto get_allow_async() const -> bool { return allow_async_; } | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_event_level() const -> event_level = 0; | ||||
|  | ||||
|   [[nodiscard]] auto get_json() const -> json { return j_; } | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_name() const -> std::string = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_single_line() const -> std::string = 0; | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<std::atomic<repertory::event_level>> { | ||||
|   static void to_json(json &data, | ||||
|                       const std::atomic<repertory::event_level> &value) { | ||||
|     data = repertory::event_level_to_string(value.load()); | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         std::atomic<repertory::event_level> &value) { | ||||
|     value.store(repertory::event_level_from_string(data.get<std::string>())); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_EVENT_HPP_ | ||||
| @@ -1,241 +1,141 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_EVENT_SYSTEM_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_EVENT_SYSTEM_HPP_ | ||||
|  | ||||
| #include "events/event.hpp" | ||||
| #include "events/t_event_system.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| using event_system = t_event_system<event>; | ||||
| using event_consumer = event_system::event_consumer; | ||||
|  | ||||
| #define E_FROM_API_FILE_ERROR(e) api_error_to_string(e) | ||||
| #define E_FROM_BOOL(t) std::to_string(t) | ||||
| #define E_FROM_CURL_CODE(t) std::string(curl_easy_strerror(t)) | ||||
| #define E_FROM_DOUBLE(d) std::to_string(d) | ||||
| #define E_FROM_DOUBLE_PRECISE(dbl_val)                                         \ | ||||
|   ([](const double &d) -> std::string {                                        \ | ||||
|     std::stringstream ss;                                                      \ | ||||
|     ss << std::fixed << std::setprecision(2) << d;                             \ | ||||
|     return ss.str();                                                           \ | ||||
|   })(dbl_val) | ||||
| #define E_FROM_INT32(t) std::to_string(t) | ||||
| #define E_FROM_SIZE_T(t) std::to_string(t) | ||||
| #define E_FROM_STRING(t) t | ||||
| #define E_FROM_UINT16(t) std::to_string(t) | ||||
| #define E_FROM_UINT64(t) std::to_string(t) | ||||
| #define E_FROM_DOWNLOAD_TYPE(t) download_type_to_string(t) | ||||
|  | ||||
| #define E_PROP(type, name, short_name, ts)                                     \ | ||||
| private:                                                                       \ | ||||
|   void init_##short_name(const type &val) {                                    \ | ||||
|     auto ts_val = ts(val);                                                     \ | ||||
|     ss_ << "|" << #short_name << "|" << ts_val;                                \ | ||||
|     j_[#name] = ts_val;                                                        \ | ||||
|   }                                                                            \ | ||||
|                                                                                \ | ||||
| public:                                                                        \ | ||||
|   [[nodiscard]] auto get_##name() const->json { return j_[#name]; } | ||||
|  | ||||
| #define E_BEGIN(name, el)                                                      \ | ||||
|   class name final : public virtual event {                                    \ | ||||
|   private:                                                                     \ | ||||
|     name(const std::stringstream &ss, const json &j, bool allow_async)         \ | ||||
|         : event(ss, j, allow_async) {}                                         \ | ||||
|                                                                                \ | ||||
|   public:                                                                      \ | ||||
|     ~name() override = default;                                                \ | ||||
|                                                                                \ | ||||
|   public:                                                                      \ | ||||
|     static const event_level level = event_level::el;                          \ | ||||
|                                                                                \ | ||||
|   public:                                                                      \ | ||||
|     [[nodiscard]] auto get_name() const -> std::string override {              \ | ||||
|       return #name;                                                            \ | ||||
|     }                                                                          \ | ||||
|                                                                                \ | ||||
|     [[nodiscard]] auto get_event_level() const -> event_level override {       \ | ||||
|       return name::level;                                                      \ | ||||
|     }                                                                          \ | ||||
|                                                                                \ | ||||
|     [[nodiscard]] auto get_single_line() const -> std::string override {       \ | ||||
|       const auto s = ss_.str();                                                \ | ||||
|       return get_name() + (s.empty() ? "" : s);                                \ | ||||
|     }                                                                          \ | ||||
|                                                                                \ | ||||
|     [[nodiscard]] auto clone() const -> std::shared_ptr<event> override {      \ | ||||
|       return std::shared_ptr<name>(new name(ss_, j_, get_allow_async()));      \ | ||||
|     } | ||||
| #define E_END() } | ||||
|  | ||||
| #define E_SIMPLE(event_name, el, allow_async)                                  \ | ||||
|   E_BEGIN(event_name, el)                                                      \ | ||||
| public:                                                                        \ | ||||
|   event_name() : event(allow_async) {}                                         \ | ||||
|   E_END() | ||||
|  | ||||
| #define E_SIMPLE1(event_name, el, allow_async, type, name, short_name, tc)     \ | ||||
|   E_BEGIN(event_name, el)                                                      \ | ||||
|   explicit event_name(const type &tv) : event(allow_async) {                   \ | ||||
|     init_##short_name(tv);                                                     \ | ||||
|   }                                                                            \ | ||||
|   E_PROP(type, name, short_name, tc)                                           \ | ||||
|   E_END() | ||||
|  | ||||
| #define E_SIMPLE2(event_name, el, allow_async, type, name, short_name, tc,     \ | ||||
|                   type2, name2, short_name2, tc2)                              \ | ||||
|   E_BEGIN(event_name, el)                                                      \ | ||||
|   explicit event_name(const type &tv, const type2 &tv2) : event(allow_async) { \ | ||||
|     init_##short_name(tv);                                                     \ | ||||
|     init_##short_name2(tv2);                                                   \ | ||||
|   }                                                                            \ | ||||
|   E_PROP(type, name, short_name, tc)                                           \ | ||||
|   E_PROP(type2, name2, short_name2, tc2)                                       \ | ||||
|   E_END() | ||||
|  | ||||
| #define E_SIMPLE3(event_name, el, allow_async, type, name, short_name, tc,     \ | ||||
|                   type2, name2, short_name2, tc2, type3, name3, short_name3,   \ | ||||
|                   tc3)                                                         \ | ||||
|   E_BEGIN(event_name, el)                                                      \ | ||||
|   explicit event_name(const type &tv, const type2 &tv2, const type3 &tv3)      \ | ||||
|       : event(allow_async) {                                                   \ | ||||
|     init_##short_name(tv);                                                     \ | ||||
|     init_##short_name2(tv2);                                                   \ | ||||
|     init_##short_name3(tv3);                                                   \ | ||||
|   }                                                                            \ | ||||
|   E_PROP(type, name, short_name, tc)                                           \ | ||||
|   E_PROP(type2, name2, short_name2, tc2)                                       \ | ||||
|   E_PROP(type3, name3, short_name3, tc3)                                       \ | ||||
|   E_END() | ||||
|  | ||||
| #define E_SIMPLE4(event_name, el, allow_async, type, name, short_name, tc,     \ | ||||
|                   type2, name2, short_name2, tc2, type3, name3, short_name3,   \ | ||||
|                   tc3, type4, name4, short_name4, tc4)                         \ | ||||
|   E_BEGIN(event_name, el)                                                      \ | ||||
|   explicit event_name(const type &tv, const type2 &tv2, const type3 &tv3,      \ | ||||
|                       const type4 &tv4)                                        \ | ||||
|       : event(allow_async) {                                                   \ | ||||
|     init_##short_name(tv);                                                     \ | ||||
|     init_##short_name2(tv2);                                                   \ | ||||
|     init_##short_name3(tv3);                                                   \ | ||||
|     init_##short_name4(tv4);                                                   \ | ||||
|   }                                                                            \ | ||||
|   E_PROP(type, name, short_name, tc)                                           \ | ||||
|   E_PROP(type2, name2, short_name2, tc2)                                       \ | ||||
|   E_PROP(type3, name3, short_name3, tc3)                                       \ | ||||
|   E_PROP(type4, name4, short_name4, tc4)                                       \ | ||||
|   E_END() | ||||
|  | ||||
| #define E_SIMPLE5(event_name, el, allow_async, type, name, short_name, tc,     \ | ||||
|                   type2, name2, short_name2, tc2, type3, name3, short_name3,   \ | ||||
|                   tc3, type4, name4, short_name4, tc4, type5, name5,           \ | ||||
|                   short_name5, tc5)                                            \ | ||||
|   E_BEGIN(event_name, el)                                                      \ | ||||
|   explicit event_name(const type &tv, const type2 &tv2, const type3 &tv3,      \ | ||||
|                       const type4 &tv4, const type5 &tv5)                      \ | ||||
|       : event(allow_async) {                                                   \ | ||||
|     init_##short_name(tv);                                                     \ | ||||
|     init_##short_name2(tv2);                                                   \ | ||||
|     init_##short_name3(tv3);                                                   \ | ||||
|     init_##short_name4(tv4);                                                   \ | ||||
|     init_##short_name5(tv5);                                                   \ | ||||
|   }                                                                            \ | ||||
|   E_PROP(type, name, short_name, tc)                                           \ | ||||
|   E_PROP(type2, name2, short_name2, tc2)                                       \ | ||||
|   E_PROP(type3, name3, short_name3, tc3)                                       \ | ||||
|   E_PROP(type4, name4, short_name4, tc4)                                       \ | ||||
|   E_PROP(type5, name5, short_name5, tc5)                                       \ | ||||
|   E_END() | ||||
|  | ||||
| #define E_SIMPLE6(event_name, el, allow_async, type, name, short_name, tc,     \ | ||||
|                   type2, name2, short_name2, tc2, type3, name3, short_name3,   \ | ||||
|                   tc3, type4, name4, short_name4, tc4, type5, name5,           \ | ||||
|                   short_name5, tc5, type6, name6, short_name6, tc6)            \ | ||||
|   E_BEGIN(event_name, el)                                                      \ | ||||
|   explicit event_name(const type &tv, const type2 &tv2, const type3 &tv3,      \ | ||||
|                       const type4 &tv4, const type5 &tv5, const type6 &tv6)    \ | ||||
|       : event(allow_async) {                                                   \ | ||||
|     init_##short_name(tv);                                                     \ | ||||
|     init_##short_name2(tv2);                                                   \ | ||||
|     init_##short_name3(tv3);                                                   \ | ||||
|     init_##short_name4(tv4);                                                   \ | ||||
|     init_##short_name5(tv5);                                                   \ | ||||
|     init_##short_name6(tv6);                                                   \ | ||||
|   }                                                                            \ | ||||
|   E_PROP(type, name, short_name, tc)                                           \ | ||||
|   E_PROP(type2, name2, short_name2, tc2)                                       \ | ||||
|   E_PROP(type3, name3, short_name3, tc3)                                       \ | ||||
|   E_PROP(type4, name4, short_name4, tc4)                                       \ | ||||
|   E_PROP(type5, name5, short_name5, tc5)                                       \ | ||||
|   E_PROP(type6, name6, short_name6, tc6)                                       \ | ||||
|   E_END() | ||||
|  | ||||
| #define E_SIMPLE7(event_name, el, allow_async, type, name, short_name, tc,     \ | ||||
|                   type2, name2, short_name2, tc2, type3, name3, short_name3,   \ | ||||
|                   tc3, type4, name4, short_name4, tc4, type5, name5,           \ | ||||
|                   short_name5, tc5, type6, name6, short_name6, tc6, type7,     \ | ||||
|                   name7, short_name7, tc7)                                     \ | ||||
|   E_BEGIN(event_name, el)                                                      \ | ||||
|   explicit event_name(const type &tv, const type2 &tv2, const type3 &tv3,      \ | ||||
|                       const type4 &tv4, const type5 &tv5, const type6 &tv6,    \ | ||||
|                       const type7 &tv7)                                        \ | ||||
|       : event(allow_async) {                                                   \ | ||||
|     init_##short_name(tv);                                                     \ | ||||
|     init_##short_name2(tv2);                                                   \ | ||||
|     init_##short_name3(tv3);                                                   \ | ||||
|     init_##short_name4(tv4);                                                   \ | ||||
|     init_##short_name5(tv5);                                                   \ | ||||
|     init_##short_name6(tv6);                                                   \ | ||||
|     init_##short_name7(tv7);                                                   \ | ||||
|   }                                                                            \ | ||||
|   E_PROP(type, name, short_name, tc)                                           \ | ||||
|   E_PROP(type2, name2, short_name2, tc2)                                       \ | ||||
|   E_PROP(type3, name3, short_name3, tc3)                                       \ | ||||
|   E_PROP(type4, name4, short_name4, tc4)                                       \ | ||||
|   E_PROP(type5, name5, short_name5, tc5)                                       \ | ||||
|   E_PROP(type6, name6, short_name6, tc6)                                       \ | ||||
|   E_PROP(type7, name7, short_name7, tc7)                                       \ | ||||
|   E_END() | ||||
|  | ||||
| #define E_CONSUMER()                                                           \ | ||||
| private:                                                                       \ | ||||
|   std::vector<std::shared_ptr<repertory::event_consumer>> event_consumers_ | ||||
|  | ||||
| #define E_CONSUMER_RELEASE() event_consumers_.clear() | ||||
|  | ||||
| #define E_SUBSCRIBE(name, callback)                                            \ | ||||
|   event_consumers_.emplace_back(std::make_shared<repertory::event_consumer>(   \ | ||||
|       #name, [this](const event &evt) { callback(evt); })) | ||||
|  | ||||
| #define E_SUBSCRIBE_EXACT(name, callback)                                      \ | ||||
|   event_consumers_.emplace_back(std::make_shared<repertory::event_consumer>(   \ | ||||
|       #name, [this](const event &evt) {                                        \ | ||||
|         callback(dynamic_cast<const name &>(evt));                             \ | ||||
|       })) | ||||
|  | ||||
| #define E_SUBSCRIBE_ALL(callback)                                              \ | ||||
|   event_consumers_.emplace_back(std::make_shared<repertory::event_consumer>(   \ | ||||
|       [this](const event &evt) { callback(evt); })) | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_EVENT_SYSTEM_HPP_ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_EVENT_SYSTEM_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_EVENT_SYSTEM_HPP_ | ||||
|  | ||||
| namespace repertory { | ||||
| class i_event; | ||||
|  | ||||
| class event_system final { | ||||
| private: | ||||
|   static constexpr const std::uint8_t max_queue_retry{ | ||||
|       30U, | ||||
|   }; | ||||
|  | ||||
|   const std::uint32_t max_queue_size{ | ||||
|       std::thread::hardware_concurrency() * 4U, | ||||
|   }; | ||||
|  | ||||
|   static constexpr const std::chrono::seconds queue_wait_secs{ | ||||
|       5s, | ||||
|   }; | ||||
|  | ||||
| public: | ||||
|   event_system(const event_system &) = delete; | ||||
|   event_system(event_system &&) = delete; | ||||
|   auto operator=(const event_system &) -> event_system & = delete; | ||||
|   auto operator=(event_system &&) -> event_system & = delete; | ||||
|  | ||||
| protected: | ||||
|   event_system() = default; | ||||
|  | ||||
|   ~event_system() { stop(); } | ||||
|  | ||||
| public: | ||||
|   class event_consumer final { | ||||
|   public: | ||||
|     explicit event_consumer(std::function<void(const i_event &)> callback) | ||||
|         : callback_(std::move(callback)) { | ||||
|       event_system::instance().attach(this); | ||||
|     } | ||||
|  | ||||
|     event_consumer(std::string_view event_name, | ||||
|                    std::function<void(const i_event &)> callback) | ||||
|         : callback_(std::move(callback)) { | ||||
|       event_system::instance().attach(event_name, this); | ||||
|     } | ||||
|  | ||||
|     ~event_consumer() { event_system::instance().release(this); } | ||||
|  | ||||
|   public: | ||||
|     event_consumer(const event_consumer &) = delete; | ||||
|     event_consumer(event_consumer &&) = delete; | ||||
|     auto operator=(const event_consumer &) -> event_consumer & = delete; | ||||
|     auto operator=(event_consumer &&) -> event_consumer & = delete; | ||||
|  | ||||
|   private: | ||||
|     std::function<void(const i_event &)> callback_; | ||||
|  | ||||
|   public: | ||||
|     void notify_event(const i_event &event) { callback_(event); } | ||||
|   }; | ||||
|  | ||||
| private: | ||||
|   static event_system instance_; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] static auto instance() -> event_system &; | ||||
|  | ||||
| private: | ||||
|   std::unordered_map<std::string, std::deque<event_consumer *>> | ||||
|       event_consumers_; | ||||
|   std::recursive_mutex consumer_mutex_; | ||||
|   std::vector<std::shared_ptr<i_event>> event_list_; | ||||
|   std::condition_variable event_notify_; | ||||
|   std::mutex event_mutex_; | ||||
|   std::unique_ptr<std::thread> event_thread_; | ||||
|   std::mutex run_mutex_; | ||||
|   stop_type stop_requested_{false}; | ||||
|  | ||||
| private: | ||||
|   [[nodiscard]] auto get_stop_requested() const -> bool; | ||||
|  | ||||
|   void process_events(); | ||||
|  | ||||
|   void queue_event(std::shared_ptr<i_event> evt); | ||||
|  | ||||
| public: | ||||
|   void attach(event_consumer *consumer); | ||||
|  | ||||
|   void attach(std::string_view event_name, event_consumer *consumer); | ||||
|  | ||||
|   template <typename evt_t, typename... arg_t> void raise(arg_t &&...args) { | ||||
|     queue_event(std::make_shared<evt_t>(std::forward<arg_t>(args)...)); | ||||
|   } | ||||
|  | ||||
|   void release(event_consumer *consumer); | ||||
|  | ||||
|   void start(); | ||||
|  | ||||
|   void stop(); | ||||
| }; | ||||
|  | ||||
| using event_consumer = event_system::event_consumer; | ||||
|  | ||||
| #define E_CONSUMER()                                                           \ | ||||
| private:                                                                       \ | ||||
|   std::vector<std::shared_ptr<repertory::event_consumer>> event_consumers_ | ||||
|  | ||||
| #define E_CONSUMER_RELEASE() event_consumers_.clear() | ||||
|  | ||||
| #define E_SUBSCRIBE(event, callback)                                           \ | ||||
|   event_consumers_.emplace_back(std::make_shared<repertory::event_consumer>(   \ | ||||
|       event::name, [this](const i_event &evt) {                                \ | ||||
|         callback(dynamic_cast<const event &>(evt));                            \ | ||||
|       })) | ||||
|  | ||||
| #define E_SUBSCRIBE_ALL(callback)                                              \ | ||||
|   event_consumers_.emplace_back(std::make_shared<repertory::event_consumer>(   \ | ||||
|       [this](const i_event &evt) { callback(evt); })) | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_EVENT_SYSTEM_HPP_ | ||||
|   | ||||
| @@ -1,295 +0,0 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_EVENTS_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_EVENTS_HPP_ | ||||
|  | ||||
| #include "events/event_system.hpp" | ||||
| #include "types/repertory.hpp" | ||||
| #include "utils/utils.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| // clang-format off | ||||
| E_SIMPLE2(curl_error, error, true, | ||||
|   std::string, url, url, E_FROM_STRING, | ||||
|   CURLcode, res, res, E_FROM_CURL_CODE  | ||||
| ); | ||||
|  | ||||
| E_SIMPLE3(debug_log, debug, true, | ||||
|   std::string, function, func, E_FROM_STRING, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, data, data, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(directory_removed, info, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(directory_removed_externally, warn, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(directory_remove_failed, error, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, error, err, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(drive_mount_failed, error, true, | ||||
|   std::string, location, loc, E_FROM_STRING, | ||||
|   std::string, result, res, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(drive_mounted, info, true, | ||||
|   std::string, location, loc, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(drive_mount_result, info, true, | ||||
|   std::string, result, res, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(drive_unmount_pending, info, true, | ||||
|   std::string, location, loc, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(drive_unmounted, info, true, | ||||
|   std::string, location, loc, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(event_level_changed, info, true, | ||||
|   std::string, new_event_level, level, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(failed_upload_queued, error, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(failed_upload_removed, warn, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(failed_upload_retry, info, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(file_get_failed, error, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, error, err, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(file_get_api_list_failed, error, true, | ||||
|   std::string, error, err, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(file_pinned, info, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE3(file_read_bytes_failed, error, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, error, err, E_FROM_STRING, | ||||
|   std::size_t, retry, retry, E_FROM_SIZE_T | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(file_removed, debug, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(file_removed_externally, warn, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(file_remove_failed, error, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, error, err, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE3(file_rename_failed, error, true, | ||||
|   std::string, from_api_path, FROM, E_FROM_STRING, | ||||
|   std::string, to_api_path, TO, E_FROM_STRING, | ||||
|   std::string, error, err, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(file_get_size_failed, error, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, error, err, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE3(filesystem_item_added, debug, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, parent, parent, E_FROM_STRING, | ||||
|   bool, directory, dir, E_FROM_BOOL | ||||
| ); | ||||
|  | ||||
| E_SIMPLE4(filesystem_item_closed, trace, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING, | ||||
|   bool, directory, dir, E_FROM_BOOL, | ||||
|   bool, changed, changed, E_FROM_BOOL | ||||
| ); | ||||
|  | ||||
| E_SIMPLE5(filesystem_item_handle_closed, trace, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::uint64_t, handle, handle, E_FROM_UINT64, | ||||
|   std::string, source, src, E_FROM_STRING, | ||||
|   bool, directory, dir, E_FROM_BOOL, | ||||
|   bool, changed, changed, E_FROM_BOOL | ||||
| ); | ||||
|  | ||||
| E_SIMPLE4(filesystem_item_handle_opened, trace, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::uint64_t, handle, handle, E_FROM_UINT64, | ||||
|   std::string, source, src, E_FROM_STRING, | ||||
|   bool, directory, dir, E_FROM_BOOL | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(filesystem_item_evicted, info, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE3(filesystem_item_opened, trace, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING, | ||||
|   bool, directory, dir, E_FROM_BOOL | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(file_unpinned, info, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE4(file_upload_completed, info, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING, | ||||
|   api_error, result, res, E_FROM_API_FILE_ERROR, | ||||
|   bool, cancelled, cancel, E_FROM_BOOL | ||||
| ); | ||||
|  | ||||
| E_SIMPLE3(file_upload_failed, error, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING, | ||||
|   std::string, error, err, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(file_upload_not_found, warn, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(file_upload_queued, info, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(file_upload_removed, debug, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE3(file_upload_retry, info, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING, | ||||
|   api_error, result, res, E_FROM_API_FILE_ERROR | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(file_upload_started, info, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(orphaned_file_deleted, warn, true, | ||||
|   std::string, source, src, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(orphaned_file_detected, warn, true, | ||||
|   std::string, source, src, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE3(orphaned_file_processing_failed, error, true, | ||||
|   std::string, source, src, E_FROM_STRING, | ||||
|   std::string, dest, dest, E_FROM_STRING, | ||||
|   std::string, result, res, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(orphaned_source_file_detected, info, true, | ||||
|   std::string, source, src, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(orphaned_source_file_removed, info, true, | ||||
|   std::string, source, src, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(polling_item_begin, debug, true, | ||||
|   std::string, item_name, item, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(polling_item_end, debug, true, | ||||
|   std::string, item_name, item, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(provider_offline, error, true, | ||||
|   std::string, host_name_or_ip, host, E_FROM_STRING, | ||||
|   std::uint16_t, port, port, E_FROM_UINT16 | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(provider_upload_begin, info, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE3(provider_upload_end, info, true, | ||||
|   std::string, api_path, ap, E_FROM_STRING, | ||||
|   std::string, source, src, E_FROM_STRING, | ||||
|   api_error, result, res, E_FROM_API_FILE_ERROR | ||||
| ); | ||||
|  | ||||
| E_SIMPLE2(repertory_exception, error, true, | ||||
|   std::string, function, func, E_FROM_STRING, | ||||
|   std::string, message, msg, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(rpc_server_exception, error, true, | ||||
|   std::string, exception, exception, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(service_shutdown_begin, debug, true, | ||||
|   std::string, service, svc, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(service_shutdown_end, debug, true, | ||||
|   std::string, service, svc, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE1(service_started, debug, true, | ||||
|   std::string, service, svc, E_FROM_STRING | ||||
| ); | ||||
|  | ||||
| E_SIMPLE(unmount_requested, info, true); | ||||
| #if !defined(_WIN32) | ||||
| E_SIMPLE2(unmount_result, info, true, | ||||
|   std::string, location, loc, E_FROM_STRING, | ||||
|   std::string, result, res, E_FROM_STRING | ||||
| ); | ||||
| #endif | ||||
| // clang-format on | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_EVENTS_HPP_ | ||||
| @@ -1,36 +1,40 @@ | ||||
| /*
 | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
| 
 | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
| 
 | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
| 
 | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #include "events/t_event_system.hpp" | ||||
| 
 | ||||
| #include "events/event.hpp" | ||||
| 
 | ||||
| namespace repertory { | ||||
| template <typename event_type> | ||||
| auto t_event_system<event_type>::instance() -> t_event_system<event_type> & { | ||||
|   return event_system_; | ||||
| } | ||||
| 
 | ||||
| template <typename event_type> | ||||
| t_event_system<event_type> t_event_system<event_type>::event_system_; | ||||
| 
 | ||||
| template class t_event_system<event>; | ||||
| } // namespace repertory
 | ||||
| /*
 | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
| 
 | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
| 
 | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
| 
 | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_I_EVENT_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_I_EVENT_HPP_ | ||||
| 
 | ||||
| #include "types/repertory.hpp" | ||||
| 
 | ||||
| namespace repertory { | ||||
| class i_event { | ||||
|   INTERFACE_SETUP(i_event); | ||||
| 
 | ||||
| public: | ||||
|   [[nodiscard]] virtual auto get_event_level() const -> event_level = 0; | ||||
| 
 | ||||
|   [[nodiscard]] virtual auto get_name() const -> std::string_view = 0; | ||||
| 
 | ||||
|   [[nodiscard]] virtual auto get_single_line() const -> std::string = 0; | ||||
| }; | ||||
| } // namespace repertory
 | ||||
| 
 | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_EVENT_HPP_
 | ||||
| @@ -1,193 +0,0 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_T_EVENT_SYSTEM_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_T_EVENT_SYSTEM_HPP_ | ||||
|  | ||||
| #include "events/event.hpp" | ||||
| #include "utils/collection.hpp" | ||||
| #include "utils/utils.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| template <typename event_type> class t_event_system final { | ||||
| public: | ||||
|   t_event_system(const t_event_system &) = delete; | ||||
|   t_event_system(t_event_system &&) = delete; | ||||
|   auto operator=(const t_event_system &) -> t_event_system & = delete; | ||||
|   auto operator=(t_event_system &&) -> t_event_system & = delete; | ||||
|  | ||||
| protected: | ||||
|   t_event_system() = default; | ||||
|  | ||||
|   ~t_event_system() { stop(); } | ||||
|  | ||||
| public: | ||||
|   class event_consumer final { | ||||
|   public: | ||||
|     explicit event_consumer(std::function<void(const event &)> callback) | ||||
|         : callback_(std::move(callback)) { | ||||
|       t_event_system::instance().attach(this); | ||||
|     } | ||||
|  | ||||
|     event_consumer(const std::string &event_name, | ||||
|                    std::function<void(const event &)> callback) | ||||
|         : callback_(std::move(callback)) { | ||||
|       t_event_system::instance().attach(event_name, this); | ||||
|     } | ||||
|  | ||||
|     ~event_consumer() { t_event_system::instance().release(this); } | ||||
|  | ||||
|   public: | ||||
|     event_consumer(const event_consumer &) = delete; | ||||
|     event_consumer(event_consumer &&) = delete; | ||||
|     auto operator=(const event_consumer &) -> event_consumer & = delete; | ||||
|     auto operator=(event_consumer &&) -> event_consumer & = delete; | ||||
|  | ||||
|   private: | ||||
|     std::function<void(const event &)> callback_; | ||||
|  | ||||
|   public: | ||||
|     void notify_event(const event &event) { callback_(event); } | ||||
|   }; | ||||
|  | ||||
| private: | ||||
|   static t_event_system event_system_; | ||||
|  | ||||
| public: | ||||
|   static auto instance() -> t_event_system &; | ||||
|  | ||||
| private: | ||||
|   std::unordered_map<std::string, std::deque<event_consumer *>> | ||||
|       event_consumers_; | ||||
|   std::recursive_mutex consumer_mutex_; | ||||
|   std::vector<std::shared_ptr<event_type>> event_list_; | ||||
|   std::condition_variable event_notify_; | ||||
|   std::mutex event_mutex_; | ||||
|   std::unique_ptr<std::thread> event_thread_; | ||||
|   std::mutex run_mutex_; | ||||
|   stop_type stop_requested_ = false; | ||||
|  | ||||
| private: | ||||
|   void process_events() { | ||||
|     std::vector<std::shared_ptr<event_type>> events; | ||||
|     { | ||||
|       unique_mutex_lock lock(event_mutex_); | ||||
|       if (not stop_requested_ && event_list_.empty()) { | ||||
|         event_notify_.wait_for(lock, 1s); | ||||
|       } | ||||
|  | ||||
|       if (not event_list_.empty()) { | ||||
|         events.insert(events.end(), event_list_.begin(), event_list_.end()); | ||||
|         event_list_.clear(); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     const auto notify_events = [this](const std::string &name, | ||||
|                                       const event_type &event) { | ||||
|       std::deque<std::future<void>> futures; | ||||
|       recur_mutex_lock lock(consumer_mutex_); | ||||
|       if (event_consumers_.find(name) != event_consumers_.end()) { | ||||
|         for (auto *consumer : event_consumers_[name]) { | ||||
|           if (event.get_allow_async()) { | ||||
|             futures.emplace_back( | ||||
|                 std::async(std::launch::async, [consumer, &event]() { | ||||
|                   consumer->notify_event(event); | ||||
|                 })); | ||||
|           } else { | ||||
|             consumer->notify_event(event); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       while (not futures.empty()) { | ||||
|         futures.front().get(); | ||||
|         futures.pop_front(); | ||||
|       } | ||||
|     }; | ||||
|  | ||||
|     for (const auto &evt : events) { | ||||
|       notify_events("", *evt.get()); | ||||
|       notify_events(evt->get_name(), *evt.get()); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   void queue_event(std::shared_ptr<event_type> evt) { | ||||
|     mutex_lock lock(event_mutex_); | ||||
|     event_list_.push_back(std::move(evt)); | ||||
|     event_notify_.notify_all(); | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   void attach(event_consumer *consumer) { | ||||
|     recur_mutex_lock lock(consumer_mutex_); | ||||
|     event_consumers_[""].push_back(consumer); | ||||
|   } | ||||
|  | ||||
|   void attach(const std::string &event_name, event_consumer *consumer) { | ||||
|     recur_mutex_lock lock(consumer_mutex_); | ||||
|     event_consumers_[event_name].push_back(consumer); | ||||
|   } | ||||
|  | ||||
|   template <typename event_t, typename... arg_t> void raise(arg_t &&...args) { | ||||
|     queue_event(std::make_shared<event_t>(std::forward<arg_t>(args)...)); | ||||
|   } | ||||
|  | ||||
|   void release(event_consumer *consumer) { | ||||
|     recur_mutex_lock lock(consumer_mutex_); | ||||
|     auto iter = std::find_if(event_consumers_.begin(), event_consumers_.end(), | ||||
|                              [&](const auto &item) -> bool { | ||||
|                                return utils::collection::includes(item.second, | ||||
|                                                                   consumer); | ||||
|                              }); | ||||
|  | ||||
|     if (iter != event_consumers_.end()) { | ||||
|       utils::collection::remove_element((*iter).second, consumer); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   void start() { | ||||
|     mutex_lock lock(run_mutex_); | ||||
|     if (not event_thread_) { | ||||
|       stop_requested_ = false; | ||||
|       event_thread_ = std::make_unique<std::thread>([this]() { | ||||
|         while (not stop_requested_) { | ||||
|           process_events(); | ||||
|         } | ||||
|       }); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   void stop() { | ||||
|     mutex_lock lock(run_mutex_); | ||||
|     if (event_thread_) { | ||||
|       stop_requested_ = true; | ||||
|       event_notify_.notify_all(); | ||||
|  | ||||
|       event_thread_->join(); | ||||
|       event_thread_.reset(); | ||||
|  | ||||
|       process_events(); | ||||
|     } | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_T_EVENT_SYSTEM_HPP_ | ||||
							
								
								
									
										74
									
								
								repertory/librepertory/include/events/types/curl_error.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								repertory/librepertory/include/events/types/curl_error.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_CURL_ERROR_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_CURL_ERROR_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct curl_error final : public i_event { | ||||
|   curl_error() = default; | ||||
|   curl_error(CURLcode code_, std::string_view function_name_, std::string url_) | ||||
|       : code(code_), | ||||
|         function_name(std::string{function_name_}), | ||||
|         url(std::move(url_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"curl_error"}; | ||||
|  | ||||
|   CURLcode code{}; | ||||
|   std::string function_name; | ||||
|   std::string url; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|url|{}|code|{}", name, function_name, url, | ||||
|                        static_cast<int>(code)); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::curl_error> { | ||||
|   static void to_json(json &data, const repertory::curl_error &value) { | ||||
|     data["code"] = value.code; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["url"] = value.url; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::curl_error &value) { | ||||
|     data.at("code").get_to<CURLcode>(value.code); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("url").get_to<std::string>(value.url); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_CURL_ERROR_HPP_ | ||||
							
								
								
									
										68
									
								
								repertory/librepertory/include/events/types/debug_log.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								repertory/librepertory/include/events/types/debug_log.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DEBUG_LOG_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DEBUG_LOG_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct debug_log final : public i_event { | ||||
|   debug_log() = default; | ||||
|   debug_log(std::string_view function_name_, std::string msg_) | ||||
|       : function_name(std::string(function_name_)), msg(std::move(msg_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"debug_log"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string msg; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|msg|{}", name, function_name, msg); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::debug_log> { | ||||
|   static void to_json(json &data, const repertory::debug_log &value) { | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["msg"] = value.msg; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::debug_log &value) { | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("msg").get_to<std::string>(value.msg); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DEBUG_LOG_HPP_ | ||||
| @@ -0,0 +1,78 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DIRECTORY_REMOVE_FAILED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DIRECTORY_REMOVE_FAILED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct directory_remove_failed final : public i_event { | ||||
|   directory_remove_failed() = default; | ||||
|   directory_remove_failed(std::string api_path_, api_error error_, | ||||
|                           std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         error(error_), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"directory_remove_failed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   api_error error{}; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|error|{}", name, function_name, | ||||
|                        api_path, api_error_to_string(error)); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::directory_remove_failed> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::directory_remove_failed &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["error"] = repertory::api_error_to_string(value.error); | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::directory_remove_failed &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     value.error = | ||||
|         repertory::api_error_from_string(data.at("error").get<std::string>()); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DIRECTORY_REMOVE_FAILED_HPP_ | ||||
| @@ -0,0 +1,69 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DIRECTORY_REMOVED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DIRECTORY_REMOVED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct directory_removed final : public i_event { | ||||
|   directory_removed() = default; | ||||
|   directory_removed(std::string api_path_, std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"directory_removed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}", name, function_name, api_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::directory_removed> { | ||||
|   static void to_json(json &data, const repertory::directory_removed &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::directory_removed &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DIRECTORY_REMOVED_HPP_ | ||||
| @@ -0,0 +1,78 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DIRECTORY_REMOVED_EXTERNALLY_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DIRECTORY_REMOVED_EXTERNALLY_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct directory_removed_externally final : public i_event { | ||||
|   directory_removed_externally() = default; | ||||
|   directory_removed_externally(std::string api_path_, | ||||
|                                std::string_view function_name_, | ||||
|                                std::string source_path_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"directory_removed_externally"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|src|{}", name, function_name, api_path, | ||||
|                        source_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::directory_removed_externally> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::directory_removed_externally &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::directory_removed_externally &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DIRECTORY_REMOVED_EXTERNALLY_HPP_ | ||||
| @@ -0,0 +1,75 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_BEGIN_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_BEGIN_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct download_begin final : public i_event { | ||||
|   download_begin() = default; | ||||
|   download_begin(std::string api_path_, std::string dest_path_, | ||||
|                  std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"download_begin"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|dp|{}", name, function_name, api_path, | ||||
|                        dest_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::download_begin> { | ||||
|   static void to_json(json &data, const repertory::download_begin &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["dest_path"] = value.dest_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::download_begin &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("dest_path").get_to<std::string>(value.dest_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_BEGIN_HPP_ | ||||
							
								
								
									
										80
									
								
								repertory/librepertory/include/events/types/download_end.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								repertory/librepertory/include/events/types/download_end.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_END_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_END_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct download_end final : public i_event { | ||||
|   download_end() = default; | ||||
|   download_end(std::string api_path_, std::string dest_path_, api_error error_, | ||||
|                std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         error(error_), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"download_end"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   api_error error{}; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|dp|{}|error|{}", name, function_name, | ||||
|                        api_path, dest_path, api_error_to_string(error)); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::download_end> { | ||||
|   static void to_json(json &data, const repertory::download_end &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["dest_path"] = value.dest_path; | ||||
|     data["error"] = repertory::api_error_to_string(value.error); | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::download_end &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("dest_path").get_to<std::string>(value.dest_path); | ||||
|     value.error = | ||||
|         repertory::api_error_from_string(data.at("error").get<std::string>()); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_END_HPP_ | ||||
| @@ -0,0 +1,79 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_PROGRESS_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_PROGRESS_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct download_progress final : public i_event { | ||||
|   download_progress() = default; | ||||
|   download_progress(std::string api_path_, std::string dest_path_, | ||||
|                     std::string_view function_name_, double progress_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         function_name(std::string(function_name_)), | ||||
|         progress(progress_) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"download_progress"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   std::string function_name; | ||||
|   double progress{}; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|dp|{}|prog|{}", name, function_name, | ||||
|                        api_path, dest_path, progress); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::download_progress> { | ||||
|   static void to_json(json &data, const repertory::download_progress &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["dest_path"] = value.dest_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["progress"] = value.progress; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::download_progress &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("dest_path").get_to<std::string>(value.dest_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("progress").get_to<double>(value.progress); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_PROGRESS_HPP_ | ||||
| @@ -0,0 +1,81 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESTORE_FAILED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESTORE_FAILED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct download_restore_failed final : public i_event { | ||||
|   download_restore_failed() = default; | ||||
|   download_restore_failed(std::string api_path_, std::string dest_path_, | ||||
|                           std::string error_, std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         error(std::move(error_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"download_restore_failed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   std::string error; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|dp|{}|error|{}", name, function_name, | ||||
|                        api_path, dest_path, error); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::download_restore_failed> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::download_restore_failed &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["dest_path"] = value.dest_path; | ||||
|     data["error"] = value.error; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::download_restore_failed &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("dest_path").get_to<std::string>(value.dest_path); | ||||
|     data.at("error").get_to<std::string>(value.error); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESTORE_FAILED_HPP_ | ||||
| @@ -0,0 +1,75 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESTORED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESTORED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct download_restored final : public i_event { | ||||
|   download_restored() = default; | ||||
|   download_restored(std::string api_path_, std::string dest_path_, | ||||
|                     std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"download_restored"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|dp|{}", name, function_name, api_path, | ||||
|                        dest_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::download_restored> { | ||||
|   static void to_json(json &data, const repertory::download_restored &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["dest_path"] = value.dest_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::download_restored &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("dest_path").get_to<std::string>(value.dest_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESTORED_HPP_ | ||||
| @@ -0,0 +1,82 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESUME_ADD_FAILED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESUME_ADD_FAILED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct download_resume_add_failed final : public i_event { | ||||
|   download_resume_add_failed() = default; | ||||
|   download_resume_add_failed(std::string api_path_, std::string dest_path_, | ||||
|                              std::string error_, | ||||
|                              std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         error(std::move(error_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"download_resume_add_failed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   std::string error; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|dp|{}|error|{}", name, function_name, | ||||
|                        api_path, dest_path, error); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::download_resume_add_failed> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::download_resume_add_failed &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["dest_path"] = value.dest_path; | ||||
|     data["error"] = value.error; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::download_resume_add_failed &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("dest_path").get_to<std::string>(value.dest_path); | ||||
|     data.at("error").get_to<std::string>(value.error); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESUME_ADD_FAILED_HPP_ | ||||
| @@ -0,0 +1,77 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESUME_ADDED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESUME_ADDED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct download_resume_added final : public i_event { | ||||
|   download_resume_added() = default; | ||||
|   download_resume_added(std::string api_path_, std::string dest_path_, | ||||
|                         std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"download_resume_added"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|dp|{}", name, function_name, api_path, | ||||
|                        dest_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::download_resume_added> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::download_resume_added &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["dest_path"] = value.dest_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::download_resume_added &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("dest_path").get_to<std::string>(value.dest_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESUME_ADDED_HPP_ | ||||
| @@ -0,0 +1,77 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESUME_REMOVED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESUME_REMOVED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct download_resume_removed final : public i_event { | ||||
|   download_resume_removed() = default; | ||||
|   download_resume_removed(std::string api_path_, std::string dest_path_, | ||||
|                           std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"download_resume_removed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|dp|{}", name, function_name, api_path, | ||||
|                        dest_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::download_resume_removed> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::download_resume_removed &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["dest_path"] = value.dest_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::download_resume_removed &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("dest_path").get_to<std::string>(value.dest_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_RESUME_REMOVED_HPP_ | ||||
| @@ -0,0 +1,82 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_TYPE_SELECTED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_TYPE_SELECTED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct download_type_selected final : public i_event { | ||||
|   download_type_selected() = default; | ||||
|   download_type_selected(std::string api_path_, std::string dest_path_, | ||||
|                          std::string_view function_name_, download_type type_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         function_name(std::string(function_name_)), | ||||
|         type(type_) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"download_type_selected"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   std::string function_name; | ||||
|   download_type type{}; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|dp|{}|type|{}", name, function_name, | ||||
|                        api_path, dest_path, download_type_to_string(type)); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::download_type_selected> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::download_type_selected &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["dest_path"] = value.dest_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["type"] = repertory::download_type_to_string(value.type); | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::download_type_selected &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("dest_path").get_to<std::string>(value.dest_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     value.type = repertory::download_type_from_string( | ||||
|         data.at("type").get<std::string>()); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DOWNLOAD_TYPE_SELECTED_HPP_ | ||||
| @@ -0,0 +1,78 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_MOUNT_FAILED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_MOUNT_FAILED_HPP_ | ||||
| #if defined(_WIN32) | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct drive_mount_failed final : public i_event { | ||||
|   drive_mount_failed() = default; | ||||
|   drive_mount_failed(NTSTATUS error_, std::string_view function_name_, | ||||
|                      std::string mount_location_) | ||||
|       : error(error_), | ||||
|         function_name(std::string(function_name_)), | ||||
|         mount_location(std::move(mount_location_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"drive_mount_failed"}; | ||||
|  | ||||
|   NTSTATUS error{}; | ||||
|   std::string function_name; | ||||
|   std::string mount_location; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|location|{}|status|{}", name, function_name, | ||||
|                        mount_location, error); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::drive_mount_failed> { | ||||
|   static void to_json(json &data, const repertory::drive_mount_failed &value) { | ||||
|     data["error"] = value.error; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["mount_location"] = value.mount_location; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::drive_mount_failed &value) { | ||||
|     data.at("error").get_to<NTSTATUS>(value.error); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("mount_location").get_to<std::string>(value.mount_location); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // defined(_WIN32) | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_MOUNT_FAILED_HPP_ | ||||
| @@ -0,0 +1,76 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_MOUNT_RESULT_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_MOUNT_RESULT_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct drive_mount_result final : public i_event { | ||||
|   drive_mount_result() = default; | ||||
|   drive_mount_result(std::string_view function_name_, | ||||
|                      std::string mount_location_, std::string result_) | ||||
|       : function_name(std::string(function_name_)), | ||||
|         mount_location(std::move(mount_location_)), | ||||
|         result(std::move(result_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"drive_mount_result"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string mount_location; | ||||
|   std::string result; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|location|{}|result|{}", name, function_name, | ||||
|                        mount_location, result); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::drive_mount_result> { | ||||
|   static void to_json(json &data, const repertory::drive_mount_result &value) { | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["mount_location"] = value.mount_location; | ||||
|     data["result"] = value.result; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::drive_mount_result &value) { | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("mount_location").get_to<std::string>(value.mount_location); | ||||
|     data.at("result").get_to<std::string>(value.result); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_MOUNT_RESULT_HPP_ | ||||
| @@ -0,0 +1,70 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_MOUNTED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_MOUNTED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct drive_mounted final : public i_event { | ||||
|   drive_mounted() = default; | ||||
|   drive_mounted(std::string_view function_name_, std::string mount_location_) | ||||
|       : function_name(std::string(function_name_)), | ||||
|         mount_location(std::move(mount_location_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"drive_mounted"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string mount_location; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|location|{}", name, function_name, | ||||
|                        mount_location); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::drive_mounted> { | ||||
|   static void to_json(json &data, const repertory::drive_mounted &value) { | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["mount_location"] = value.mount_location; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::drive_mounted &value) { | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("mount_location").get_to<std::string>(value.mount_location); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_MOUNTED_HPP_ | ||||
| @@ -0,0 +1,67 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_STOP_TIMED_OUT_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_STOP_TIMED_OUT_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct drive_stop_timed_out final : public i_event { | ||||
|   drive_stop_timed_out() = default; | ||||
|   drive_stop_timed_out(std::string_view function_name_) | ||||
|       : function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"drive_stop_timed_out"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}", name, function_name); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::drive_stop_timed_out> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::drive_stop_timed_out &value) { | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::drive_stop_timed_out &value) { | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_STOP_TIMED_OUT_HPP_ | ||||
| @@ -0,0 +1,73 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_UNMOUNT_PENDING_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_UNMOUNT_PENDING_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct drive_unmount_pending final : public i_event { | ||||
|   drive_unmount_pending() = default; | ||||
|   drive_unmount_pending(std::string_view function_name_, | ||||
|                         std::string mount_location_) | ||||
|       : function_name(std::string(function_name_)), | ||||
|         mount_location(std::move(mount_location_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"drive_unmount_pending"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string mount_location; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|location|{}", name, function_name, | ||||
|                        mount_location); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::drive_unmount_pending> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::drive_unmount_pending &value) { | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["mount_location"] = value.mount_location; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::drive_unmount_pending &value) { | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("mount_location").get_to<std::string>(value.mount_location); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_UNMOUNT_PENDING_HPP_ | ||||
| @@ -0,0 +1,70 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_UNMOUNTED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_UNMOUNTED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct drive_unmounted final : public i_event { | ||||
|   drive_unmounted() = default; | ||||
|   drive_unmounted(std::string_view function_name_, std::string mount_location_) | ||||
|       : function_name(std::string(function_name_)), | ||||
|         mount_location(std::move(mount_location_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"drive_unmounted"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string mount_location; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|location|{}", name, function_name, | ||||
|                        mount_location); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::drive_unmounted> { | ||||
|   static void to_json(json &data, const repertory::drive_unmounted &value) { | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["mount_location"] = value.mount_location; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::drive_unmounted &value) { | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("mount_location").get_to<std::string>(value.mount_location); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_DRIVE_UNMOUNTED_HPP_ | ||||
| @@ -0,0 +1,71 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_EVENT_LEVEL_CHANGED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_EVENT_LEVEL_CHANGED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct event_level_changed final : public i_event { | ||||
|   event_level_changed() = default; | ||||
|   event_level_changed(std::string_view function_name_, event_level new_level_) | ||||
|       : function_name(std::string(function_name_)), new_level(new_level_) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"event_level_changed"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   event_level new_level{}; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|level|{}", name, function_name, | ||||
|                        event_level_to_string(new_level)); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::event_level_changed> { | ||||
|   static void to_json(json &data, const repertory::event_level_changed &value) { | ||||
|     data["new_level"] = repertory::event_level_to_string(value.new_level); | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::event_level_changed &value) { | ||||
|     value.new_level = repertory::event_level_from_string( | ||||
|         data.at("new_level").get<std::string>()); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_EVENT_LEVEL_CHANGED_HPP_ | ||||
							
								
								
									
										69
									
								
								repertory/librepertory/include/events/types/file_pinned.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								repertory/librepertory/include/events/types/file_pinned.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILE_PINNED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILE_PINNED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct file_pinned final : public i_event { | ||||
|   file_pinned() = default; | ||||
|   file_pinned(std::string api_path_, std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"file_pinned"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}", name, function_name, api_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::file_pinned> { | ||||
|   static void to_json(json &data, const repertory::file_pinned &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::file_pinned &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILE_PINNED_HPP_ | ||||
| @@ -0,0 +1,77 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILE_REMOVE_FAILED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILE_REMOVE_FAILED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct file_remove_failed final : public i_event { | ||||
|   file_remove_failed() = default; | ||||
|   file_remove_failed(std::string api_path_, api_error error_, | ||||
|                      std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         error(error_), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"file_remove_failed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   api_error error{}; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|error|{}", name, function_name, | ||||
|                        api_path, api_error_to_string(error)); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::file_remove_failed> { | ||||
|   static void to_json(json &data, const repertory::file_remove_failed &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["error"] = repertory::api_error_to_string(value.error); | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::file_remove_failed &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     value.error = | ||||
|         repertory::api_error_from_string(data.at("error").get<std::string>()); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILE_REMOVE_FAILED_HPP_ | ||||
							
								
								
									
										69
									
								
								repertory/librepertory/include/events/types/file_removed.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								repertory/librepertory/include/events/types/file_removed.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILE_REMOVED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILE_REMOVED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct file_removed final : public i_event { | ||||
|   file_removed() = default; | ||||
|   file_removed(std::string api_path_, std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"file_removed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}", name, function_name, api_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::file_removed> { | ||||
|   static void to_json(json &data, const repertory::file_removed &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::file_removed &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILE_REMOVED_HPP_ | ||||
| @@ -0,0 +1,78 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILE_REMOVED_EXTERNALLY_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILE_REMOVED_EXTERNALLY_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct file_removed_externally final : public i_event { | ||||
|   file_removed_externally() = default; | ||||
|   file_removed_externally(std::string api_path_, | ||||
|                           std::string_view function_name_, | ||||
|                           std::string source_path_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"file_removed_externally"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|src|{}", name, function_name, api_path, | ||||
|                        source_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::file_removed_externally> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::file_removed_externally &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::file_removed_externally &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILE_REMOVED_EXTERNALLY_HPP_ | ||||
| @@ -0,0 +1,69 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UNPINNED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UNPINNED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct file_unpinned final : public i_event { | ||||
|   file_unpinned() = default; | ||||
|   file_unpinned(std::string api_path_, std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"file_unpinned"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}", name, function_name, api_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::file_unpinned> { | ||||
|   static void to_json(json &data, const repertory::file_unpinned &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::file_unpinned &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UNPINNED_HPP_ | ||||
| @@ -0,0 +1,88 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_COMPLETED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_COMPLETED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct file_upload_completed final : public i_event { | ||||
|   file_upload_completed() = default; | ||||
|   file_upload_completed(std::string api_path_, bool cancelled_, | ||||
|                         api_error error_, std::string_view function_name_, | ||||
|                         std::string source_path_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         cancelled(cancelled_), | ||||
|         error(error_), | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"file_upload_completed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   bool cancelled{}; | ||||
|   api_error error{}; | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|cancelled|{}|error|{}|sp|{}", name, | ||||
|                        function_name, api_path, cancelled, | ||||
|                        api_error_to_string(error), source_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::file_upload_completed> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::file_upload_completed &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["cancelled"] = value.cancelled; | ||||
|     data["error"] = repertory::api_error_to_string(value.error); | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::file_upload_completed &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("cancelled").get_to<bool>(value.cancelled); | ||||
|     value.error = | ||||
|         repertory::api_error_from_string(data.at("error").get<std::string>()); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_COMPLETED_HPP_ | ||||
| @@ -0,0 +1,80 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_FAILED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_FAILED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct file_upload_failed final : public i_event { | ||||
|   file_upload_failed() = default; | ||||
|   file_upload_failed(std::string api_path_, std::string error_, | ||||
|                      std::string_view function_name_, std::string source_path_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         error(std::move(error_)), | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"file_upload_failed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string error; | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|error|{}|sp|{}", name, function_name, | ||||
|                        api_path, error, source_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::file_upload_failed> { | ||||
|   static void to_json(json &data, const repertory::file_upload_failed &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["error"] = value.error; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::file_upload_failed &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("error").get_to<std::string>(value.error); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_FAILED_HPP_ | ||||
| @@ -0,0 +1,77 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_NOT_FOUND_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_NOT_FOUND_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct file_upload_not_found final : public i_event { | ||||
|   file_upload_not_found() = default; | ||||
|   file_upload_not_found(std::string api_path_, std::string_view function_name_, | ||||
|                         std::string source_path_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"file_upload_not_found"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|sp|{}", name, function_name, api_path, | ||||
|                        source_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::file_upload_not_found> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::file_upload_not_found &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::file_upload_not_found &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_NOT_FOUND_HPP_ | ||||
| @@ -0,0 +1,76 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_QUEUED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_QUEUED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct file_upload_queued final : public i_event { | ||||
|   file_upload_queued() = default; | ||||
|   file_upload_queued(std::string api_path_, std::string_view function_name_, | ||||
|                      std::string source_path_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"file_upload_queued"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|sp|{}", name, function_name, api_path, | ||||
|                        source_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::file_upload_queued> { | ||||
|   static void to_json(json &data, const repertory::file_upload_queued &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::file_upload_queued &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_QUEUED_HPP_ | ||||
| @@ -0,0 +1,70 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_REMOVED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_REMOVED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct file_upload_removed final : public i_event { | ||||
|   file_upload_removed() = default; | ||||
|   file_upload_removed(std::string api_path_, std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"file_upload_removed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}", name, function_name, api_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::file_upload_removed> { | ||||
|   static void to_json(json &data, const repertory::file_upload_removed &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::file_upload_removed &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_REMOVED_HPP_ | ||||
| @@ -0,0 +1,80 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_RETRY_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_RETRY_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct file_upload_retry final : public i_event { | ||||
|   file_upload_retry() = default; | ||||
|   file_upload_retry(std::string api_path_, api_error error_, | ||||
|                     std::string_view function_name_, std::string source_path_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         error(std::move(error_)), | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"file_upload_retry"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   api_error error{}; | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|sp|{}|error|{}", name, function_name, | ||||
|                        api_path, source_path, api_error_to_string(error)); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::file_upload_retry> { | ||||
|   static void to_json(json &data, const repertory::file_upload_retry &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["error"] = repertory::api_error_to_string(value.error); | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::file_upload_retry &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     value.error = | ||||
|         repertory::api_error_from_string(data.at("error").get<std::string>()); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILE_UPLOAD_RETRY_HPP_ | ||||
| @@ -0,0 +1,81 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_ADDED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_ADDED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct filesystem_item_added final : public i_event { | ||||
|   filesystem_item_added() = default; | ||||
|   filesystem_item_added(std::string api_parent_, std::string api_path_, | ||||
|                         bool directory_, std::string_view function_name_) | ||||
|       : api_parent(std::move(api_parent_)), | ||||
|         api_path(std::move(api_path_)), | ||||
|         directory(directory_), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"filesystem_item_added"}; | ||||
|  | ||||
|   std::string api_parent; | ||||
|   std::string api_path; | ||||
|   bool directory{}; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|parent|{}|dir|{}", name, function_name, | ||||
|                        api_path, api_parent, directory); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::filesystem_item_added> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::filesystem_item_added &value) { | ||||
|     data["api_parent"] = value.api_parent; | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["directory"] = value.directory; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::filesystem_item_added &value) { | ||||
|     data.at("api_parent").get_to<std::string>(value.api_parent); | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("directory").get_to<bool>(value.directory); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_ADDED_HPP_ | ||||
| @@ -0,0 +1,87 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_CLOSED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_CLOSED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct filesystem_item_closed final : public i_event { | ||||
|   filesystem_item_closed() = default; | ||||
|   filesystem_item_closed(std::string api_path_, bool changed_, bool directory_, | ||||
|                          std::string_view function_name_, | ||||
|                          std::string source_path_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         changed(changed_), | ||||
|         directory(directory_), | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::trace}; | ||||
|   static constexpr const std::string_view name{"filesystem_item_closed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   bool changed{}; | ||||
|   bool directory{}; | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|changed|{}|dir|{}|sp|{}", name, | ||||
|                        function_name, api_path, changed, directory, | ||||
|                        source_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::filesystem_item_closed> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::filesystem_item_closed &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["changed"] = value.changed; | ||||
|     data["directory"] = value.directory; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::filesystem_item_closed &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("changed").get_to<bool>(value.changed); | ||||
|     data.at("directory").get_to<bool>(value.directory); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_CLOSED_HPP_ | ||||
| @@ -0,0 +1,78 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_EVICTED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_EVICTED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct filesystem_item_evicted final : public i_event { | ||||
|   filesystem_item_evicted() = default; | ||||
|   filesystem_item_evicted(std::string api_path_, | ||||
|                           std::string_view function_name_, | ||||
|                           std::string source_path_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"filesystem_item_evicted"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|sp|{}", name, function_name, api_path, | ||||
|                        source_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::filesystem_item_evicted> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::filesystem_item_evicted &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::filesystem_item_evicted &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_EVICTED_HPP_ | ||||
| @@ -0,0 +1,92 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_HANDLE_CLOSED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_HANDLE_CLOSED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct filesystem_item_handle_closed final : public i_event { | ||||
|   filesystem_item_handle_closed() = default; | ||||
|   filesystem_item_handle_closed(std::string api_path_, bool changed_, | ||||
|                                 bool directory_, | ||||
|                                 std::string_view function_name_, | ||||
|                                 std::uint64_t handle_, std::string source_path_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         changed(changed_), | ||||
|         directory(directory_), | ||||
|         function_name(std::string(function_name_)), | ||||
|         handle(handle_), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::trace}; | ||||
|   static constexpr const std::string_view name{"filesystem_item_handle_closed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   bool changed{}; | ||||
|   bool directory{}; | ||||
|   std::string function_name; | ||||
|   std::uint64_t handle{}; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|changed|{}|dir|{}|handle|{}|sp|{}", | ||||
|                        name, function_name, api_path, changed, directory, | ||||
|                        handle, source_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::filesystem_item_handle_closed> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::filesystem_item_handle_closed &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["changed"] = value.changed; | ||||
|     data["directory"] = value.directory; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["handle"] = value.handle; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::filesystem_item_handle_closed &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("changed").get_to<bool>(value.changed); | ||||
|     data.at("directory").get_to<bool>(value.directory); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("handle").get_to<std::uint64_t>(value.handle); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_HANDLE_CLOSED_HPP_ | ||||
| @@ -0,0 +1,86 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_HANDLE_OPENED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_HANDLE_OPENED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct filesystem_item_handle_opened final : public i_event { | ||||
|   filesystem_item_handle_opened() = default; | ||||
|   filesystem_item_handle_opened(std::string api_path_, bool directory_, | ||||
|                                 std::string_view function_name_, | ||||
|                                 std::uint64_t handle_, std::string source_path_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         directory(directory_), | ||||
|         function_name(std::string(function_name_)), | ||||
|         handle(handle_), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::trace}; | ||||
|   static constexpr const std::string_view name{"filesystem_item_handle_opened"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   bool directory{}; | ||||
|   std::string function_name; | ||||
|   std::uint64_t handle{}; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|dir|{}|handle|{}|sp|{}", name, | ||||
|                        function_name, api_path, directory, handle, source_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::filesystem_item_handle_opened> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::filesystem_item_handle_opened &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["directory"] = value.directory; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["handle"] = value.handle; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::filesystem_item_handle_opened &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("directory").get_to<bool>(value.directory); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("handle").get_to<std::uint64_t>(value.handle); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_HANDLE_OPENED_HPP_ | ||||
| @@ -0,0 +1,82 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_OPENED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_OPENED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct filesystem_item_opened final : public i_event { | ||||
|   filesystem_item_opened() = default; | ||||
|   filesystem_item_opened(std::string api_path_, bool directory_, | ||||
|                          std::string_view function_name_, | ||||
|                          std::string source_path_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         directory(directory_), | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::trace}; | ||||
|   static constexpr const std::string_view name{"filesystem_item_opened"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   bool directory{}; | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|dir|{}|sp|{}", name, function_name, | ||||
|                        api_path, directory, source_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::filesystem_item_opened> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::filesystem_item_opened &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["directory"] = value.directory; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::filesystem_item_opened &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("directory").get_to<bool>(value.directory); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FILESYSTEM_ITEM_OPENED_HPP_ | ||||
| @@ -0,0 +1,70 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FUSE_ARGS_PARSED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FUSE_ARGS_PARSED_HPP_ | ||||
| #if !defined(_WIN32) | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct fuse_args_parsed final : public i_event { | ||||
|   fuse_args_parsed() = default; | ||||
|   fuse_args_parsed(std::string_view args_, std::string_view function_name_) | ||||
|       : args(std::move(args_)), function_name(std::string{function_name_}) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"fuse_args_parsed"}; | ||||
|  | ||||
|   std::string args; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|args|{}", name, function_name, args); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::fuse_args_parsed> { | ||||
|   static void to_json(json &data, const repertory::fuse_args_parsed &value) { | ||||
|     data["args"] = value.args; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::fuse_args_parsed &value) { | ||||
|     data.at("args").get_to<std::string>(value.args); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // !defined(_WIN32) | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FUSE_ARGS_PARSED_HPP_ | ||||
							
								
								
									
										77
									
								
								repertory/librepertory/include/events/types/fuse_event.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								repertory/librepertory/include/events/types/fuse_event.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_FUSE_EVENT_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_FUSE_EVENT_HPP_ | ||||
| #if !defined(_WIN32) | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct fuse_event final : public i_event { | ||||
|   fuse_event() = default; | ||||
|   fuse_event(std::string_view api_path_, std::int32_t error_, | ||||
|              std::string_view function_name_) | ||||
|       : api_path(std::string{api_path_}), | ||||
|         error(error_), | ||||
|         function_name(std::string{function_name_}) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"fuse_event"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::int32_t error{}; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}|error|{}", name, function_name, | ||||
|                        api_path, error); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::fuse_event> { | ||||
|   static void to_json(json &data, const repertory::fuse_event &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["error"] = value.error; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::fuse_event &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("error").get_to<std::int32_t>(value.error); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // !defined(_WIN32) | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_FUSE_EVENT_HPP_ | ||||
| @@ -0,0 +1,76 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_INVALID_CACHE_SIZE_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_INVALID_CACHE_SIZE_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct invalid_cache_size final : public i_event { | ||||
|   invalid_cache_size() = default; | ||||
|   invalid_cache_size(std::uint64_t cache_size_, std::string_view function_name_, | ||||
|                      std::uint64_t invalid_size_) | ||||
|       : cache_size(cache_size_), | ||||
|         function_name(std::string{function_name_}), | ||||
|         invalid_size(invalid_size_) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"invalid_cache_size"}; | ||||
|  | ||||
|   std::uint64_t cache_size{}; | ||||
|   std::string function_name; | ||||
|   std::uint64_t invalid_size{}; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|size|{}|by|{}", name, function_name, | ||||
|                        cache_size, invalid_size); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::invalid_cache_size> { | ||||
|   static void to_json(json &data, const repertory::invalid_cache_size &value) { | ||||
|     data["cache_size"] = value.cache_size; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["invalid_size"] = value.invalid_size; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::invalid_cache_size &value) { | ||||
|     data.at("cache_size").get_to<std::uint64_t>(value.cache_size); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("invalid_size").get_to<std::uint64_t>(value.invalid_size); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_INVALID_CACHE_SIZE_HPP_ | ||||
							
								
								
									
										69
									
								
								repertory/librepertory/include/events/types/item_timeout.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								repertory/librepertory/include/events/types/item_timeout.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_ITEM_TIMEOUT_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_ITEM_TIMEOUT_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct item_timeout final : public i_event { | ||||
|   item_timeout() = default; | ||||
|   item_timeout(std::string api_path_, std::string_view function_name_) | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::trace}; | ||||
|   static constexpr const std::string_view name{"item_timeout"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|ap|{}", name, function_name, api_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::item_timeout> { | ||||
|   static void to_json(json &data, const repertory::item_timeout &value) { | ||||
|     data["api_path"] = value.api_path; | ||||
|     data["function_name"] = value.function_name; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::item_timeout &value) { | ||||
|     data.at("api_path").get_to<std::string>(value.api_path); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_ITEM_TIMEOUT_HPP_ | ||||
| @@ -0,0 +1,78 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_MAX_CACHE_SIZE_REACHED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_MAX_CACHE_SIZE_REACHED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct max_cache_size_reached final : public i_event { | ||||
|   max_cache_size_reached() = default; | ||||
|   max_cache_size_reached(std::uint64_t cache_size_, | ||||
|                          std::string_view function_name_, | ||||
|                          std::uint64_t max_cache_size_) | ||||
|       : cache_size(cache_size_), | ||||
|         function_name(std::string{function_name_}), | ||||
|         max_cache_size(max_cache_size_) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"max_cache_size_reached"}; | ||||
|  | ||||
|   std::uint64_t cache_size{}; | ||||
|   std::string function_name; | ||||
|   std::uint64_t max_cache_size{}; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|size|{}|max|{}", name, function_name, | ||||
|                        cache_size, max_cache_size); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::max_cache_size_reached> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::max_cache_size_reached &value) { | ||||
|     data["cache_size"] = value.cache_size; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["max_cache_size"] = value.max_cache_size; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::max_cache_size_reached &value) { | ||||
|     data.at("cache_size").get_to<std::uint64_t>(value.cache_size); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("max_cache_size").get_to<std::uint64_t>(value.max_cache_size); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_MAX_CACHE_SIZE_REACHED_HPP_ | ||||
| @@ -0,0 +1,72 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_ORPHANED_FILE_DETECTED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_ORPHANED_FILE_DETECTED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct orphaned_file_detected final : public i_event { | ||||
|   orphaned_file_detected() = default; | ||||
|   orphaned_file_detected(std::string_view function_name_, | ||||
|                          std::string source_path_) | ||||
|       : function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"orphaned_file_detected"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|sp|{}", name, function_name, source_path); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::orphaned_file_detected> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::orphaned_file_detected &value) { | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::orphaned_file_detected &value) { | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_ORPHANED_FILE_DETECTED_HPP_ | ||||
| @@ -0,0 +1,84 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
|   in the Software without restriction, including without limitation the rights | ||||
|   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|   copies of the Software, and to permit persons to whom the Software is | ||||
|   furnished to do so, subject to the following conditions: | ||||
|  | ||||
|   The above copyright notice and this permission notice shall be included in all | ||||
|   copies or substantial portions of the Software. | ||||
|  | ||||
|   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
|   SOFTWARE. | ||||
| */ | ||||
| #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_ORPHANED_FILE_PROCESSING_FAILED_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_ORPHANED_FILE_PROCESSING_FAILED_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct orphaned_file_processing_failed final : public i_event { | ||||
|   orphaned_file_processing_failed() = default; | ||||
|   orphaned_file_processing_failed(std::string dest_path_, std::string error_, | ||||
|                                   std::string_view function_name_, | ||||
|                                   std::string source_path_) | ||||
|       : dest_path(std::move(dest_path_)), | ||||
|         error(std::move(error_)), | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{ | ||||
|       "orphaned_file_processing_failed", | ||||
|   }; | ||||
|  | ||||
|   std::string dest_path; | ||||
|   std::string error; | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|sp|{}|dp|{}|error|{}", name, function_name, | ||||
|                        source_path, dest_path, error); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::orphaned_file_processing_failed> { | ||||
|   static void to_json(json &data, | ||||
|                       const repertory::orphaned_file_processing_failed &value) { | ||||
|     data["dest_path"] = value.dest_path; | ||||
|     data["error"] = value.error; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["source_path"] = value.source_path; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, | ||||
|                         repertory::orphaned_file_processing_failed &value) { | ||||
|     data.at("dest_path").get_to<std::string>(value.dest_path); | ||||
|     data.at("error").get_to<std::string>(value.error); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("source_path").get_to<std::string>(value.source_path); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_ORPHANED_FILE_PROCESSING_FAILED_HPP_ | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user