plugify 1.2.8
Loading...
Searching...
No Matches
plugify.hpp
1#pragma once
2
3#include "plugify/config.hpp"
4#include "plugify/config_provider.hpp"
5#include "plugify/dependency_resolver.hpp"
6#include "plugify/event_bus.hpp"
7#include "plugify/file_system.hpp"
8#include "plugify/global.h"
9#include "plugify/lifecycle.hpp"
10#include "plugify/manager.hpp"
11#include "plugify/manifest_parser.hpp"
12#include "plugify/provider.hpp"
13#include "plugify/service_locator.hpp"
14// #include "plugify/progress_reporter.hpp"
15// #include "plugify/metric_collector.hpp"
16// #include "plugify/plugin_lifecycle.hpp"
17#include "plugify/assembly_loader.hpp"
18
19namespace plugify {
20 class Plugify;
21
22 // Builder pattern for configuration
23 class PLUGIFY_API PlugifyBuilder {
24 public:
27 PlugifyBuilder(const PlugifyBuilder& other) = delete;
28 PlugifyBuilder(PlugifyBuilder&& other) noexcept = delete;
29 PlugifyBuilder& operator=(const PlugifyBuilder& other) = delete;
30 PlugifyBuilder& operator=(PlugifyBuilder&& other) noexcept = delete;
31
32 // Path configuration methods - these have clear precedence
33 PlugifyBuilder& WithBaseDir(std::filesystem::path dir);
34 PlugifyBuilder& WithPaths(Config::Paths paths);
35
36 // Config methods with clear semantics
37 PlugifyBuilder& WithConfig(Config config);
38 PlugifyBuilder& WithConfigFile(std::filesystem::path path);
39 // PlugifyBuilder& WithPartialConfig(Config config); // Merges with existing
40
41 // Explicit runtime configuration
42 PlugifyBuilder& WithManualUpdate(); // Default
44 WithBackgroundUpdate(std::chrono::milliseconds interval = std::chrono::milliseconds{ 16 });
45 PlugifyBuilder& WithUpdateCallback(std::function<void(std::chrono::milliseconds)> callback);
46
47 // Service registration...
48 PlugifyBuilder& WithLogger(std::shared_ptr<ILogger> logger);
49 PlugifyBuilder& WithFileSystem(std::shared_ptr<IFileSystem> fs);
50 PlugifyBuilder& WithAssemblyLoader(std::shared_ptr<IAssemblyLoader> loader);
51 // PlugifyBuilder& WithConfigProvider(std::shared_ptr<IConfigProvider> provider);
52 PlugifyBuilder& WithManifestParser(std::shared_ptr<IManifestParser> parser);
53 PlugifyBuilder& WithDependencyResolver(std::shared_ptr<IDependencyResolver> resolver);
54 PlugifyBuilder& WithExtensionLifecycle(std::shared_ptr<IExtensionLifecycle> lifecycle);
55 // PlugifyBuilder& WithProgressReporter(std::shared_ptr<IProgressReporter> reporter);
56 // PlugifyBuilder& WithMetricsCollector(std::shared_ptr<IMetricsCollector> metrics);
57 PlugifyBuilder& WithEventBus(std::shared_ptr<IEventBus> bus);
58
59 PlugifyBuilder& WithDefaults();
60
61 // Service registration with concepts for type safety
62 template <typename Interface, typename Implementation>
63 requires std::derived_from<Implementation, Interface>
64 PlugifyBuilder& WithService(std::shared_ptr<Implementation> service) {
65 GetServices().RegisterInstance<Interface>(std::move(service));
66 return *this;
67 }
68
70
71 PLUGIFY_ACCESS : const ServiceLocator& GetServices() const noexcept;
72 Result<Config> LoadConfigFromFile(const std::filesystem::path& path) const;
73 struct Impl;
74 PLUGIFY_NO_DLL_EXPORT_WARNING(std::unique_ptr<Impl> _impl;)
75 };
76
77 class PLUGIFY_API Plugify {
78 public:
79 ~Plugify();
80 Plugify(const Plugify& other) = delete;
81 Plugify(Plugify&& other) noexcept = delete;
82 Plugify& operator=(const Plugify& other) = delete;
83 Plugify& operator=(Plugify&& other) noexcept = delete;
84
85 // Lifecycle
86 Result<void> Initialize() const;
87 void Terminate() const;
88 [[nodiscard]] bool IsInitialized() const;
89 void Update(std::chrono::milliseconds deltaTime = std::chrono::milliseconds{ 0 }) const;
90
91 // Component access
92 [[nodiscard]] const Manager& GetManager() const noexcept;
93 [[nodiscard]] const ServiceLocator& GetServices() const noexcept;
94 [[nodiscard]] const Config& GetConfig() const noexcept;
95 [[nodiscard]] const Version& GetVersion() const noexcept;
96
97 // Metrics and profiling
98 /*struct Metrics {
99 size_t loadedExtensions;
100 size_t memoryUsageMB;
101 double averageLoadTimeMs;
102 double averageUpdateTimeMs;
103 };
104 [[nodiscard]] Metrics GetMetrics() const;*/
105
106 // Factory method
107 [[nodiscard]] static PlugifyBuilder CreateBuilder();
108
109 PLUGIFY_ACCESS : explicit Plugify(ServiceLocator services, Config config);
110 struct Impl;
111 PLUGIFY_NO_DLL_EXPORT_WARNING(std::unique_ptr<Impl> _impl;)
112 };
113
114 // Convenience factory
116 MakePlugify(const std::filesystem::path& rootDir = std::filesystem::current_path());
117}
DI Container / Service Locator with PIMPL.