LeviLamina
Loading...
Searching...
No Matches
ServiceManager.h
1#pragma once
2
3#include <optional>
4#include <type_traits>
5#include <vector>
6
7#include "ll/api/event/EventBus.h"
8#include "ll/api/event/MultiListener.h"
9#include "ll/api/event/service/ServiceEvents.h"
10#include "ll/api/mod/NativeMod.h"
11#include "ll/api/service/Service.h"
12#include "ll/api/service/ServiceId.h"
13
14#include "ll/api/Expected.h"
15
16namespace ll::service {
17
18struct GetServiceError : ErrorInfoBase {
19 enum class ErrorType : char {
20 NotExist = 0,
21 VersionMismatch = 1,
22 };
23 using enum ErrorType;
24
25 ErrorType code;
26 size_t version;
27
28 GetServiceError(ErrorType code, size_t version = 0) : code(code), version(version) {}
29
30 LLAPI std::string message(std::string_view locale) const noexcept override;
31};
32
34 std::string name;
35 size_t version;
36 std::string modName;
37 std::shared_ptr<Service> service;
38};
39
40class ServiceManager {
41public:
42 LLNDAPI static ServiceManager& getInstance();
43
44 template <IsService T>
45 event::ListenerPtr subscribeService(std::function<void(std::shared_ptr<T> const&)> const& fn) {
46 if (auto service = getService<T>(); service) {
47 fn(*service);
48 }
49 auto listener = event::MultiListener<
50 event::server::ServiceRegisterEvent,
51 event::server::ServiceUnregisterEvent>::create([fn](auto&& event) {
52 if (event.service()->getServiceId() == T::ServiceId) {
53 if constexpr (
54 std::is_same_v<std::remove_cvref_t<decltype((event))>, event::server::ServiceUnregisterEvent>
55 ) {
56 fn(nullptr);
57 } else {
58 fn(std::static_pointer_cast<T>(event.service()));
59 }
60 }
61 });
62 event::EventBus::getInstance().addListener(listener);
63 return listener;
64 }
65
66 template <IsService T>
67 Expected<std::shared_ptr<T>> getService() {
68 auto res = getService(getServiceId<T>);
69 if (!res) {
70 return forwardError(res.error());
71 }
72 return std::static_pointer_cast<T>(*res);
73 }
74
75 LLNDAPI Expected<std::shared_ptr<Service>> getService(ServiceIdView const& id);
76
77 LLNDAPI std::optional<QueryServiceResult> queryService(std::string_view name);
78 LLNDAPI std::vector<QueryServiceResult> queryServices(std::string_view name);
79
80 LLAPI bool registerService(
81 std::shared_ptr<Service> const& service,
82 std::shared_ptr<mod::Mod> const& mod = mod::NativeMod::current()
83 );
84
85 LLAPI bool unregisterService(ServiceIdView const& id);
86
87 LLAPI void unregisterService(mod::Mod const& mod);
88
89 ServiceManager(ServiceManager const&) = delete;
90 ServiceManager(ServiceManager&&) = delete;
91 ServiceManager& operator=(ServiceManager const&) = delete;
92 ServiceManager& operator=(ServiceManager&&) = delete;
93
94private:
95 class Impl;
96 std::unique_ptr<Impl> impl;
97
98 ServiceManager();
99 ~ServiceManager();
100};
101
102} // namespace ll::service
Definition MultiListener.h:12
Definition Mod.h:17
Definition ServiceId.h:24
Definition ServiceManager.h:33