plugify 1.2.8
Loading...
Searching...
No Matches
extension.hpp
1#pragma once
2
3#include <deque>
4#include <filesystem>
5#include <memory>
6#include <string>
7#include <vector>
8
9#include "plugify/manifest.hpp"
10
11namespace plugify {
12 class IAssembly;
13 class ILanguageModule;
14
15 // Extension State Enum
16 enum class ExtensionState {
17 Unknown,
18 Discovered,
19
20 Parsing,
21 Parsed,
22 Corrupted,
23
24 Resolving,
25 Resolved,
26 Unresolved,
27
28 Disabled,
29 Skipped,
30 Failed,
31
32 // Initializing,
33 // Initialized,
34
35 Loading,
36 Loaded,
37
38 Exporting,
39 Exported,
40
41 Starting,
42 Started,
43
44 Running,
45
46 Ending,
47 Ended,
48
49 Terminating,
50 Terminated,
51
52 Max
53 };
54
55 // Unified Extension class
56 class PLUGIFY_API Extension {
57 public:
58 Extension(UniqueId id, std::filesystem::path location);
59 ~Extension();
60
61 // Delete copy/move for safety (can be implemented if needed)
62 Extension(const Extension&) = delete;
63 Extension(Extension&&) noexcept;
64 Extension& operator=(const Extension&) = delete;
65 Extension& operator=(Extension&&) noexcept;
66
67 // --- Core Getters ---
68 [[nodiscard]] UniqueId GetId() const noexcept;
69 [[nodiscard]] ExtensionType GetType() const noexcept;
70 [[nodiscard]] ExtensionState GetState() const noexcept;
71 [[nodiscard]] const std::string& GetName() const noexcept;
72 [[nodiscard]] const Version& GetVersion() const noexcept;
73 [[nodiscard]] const std::string& GetLanguage() const noexcept;
74 [[nodiscard]] const std::filesystem::path& GetLocation() const noexcept;
75
76 // --- Optional Info Getters ---
77 [[nodiscard]] const std::string& GetDescription() const noexcept;
78 [[nodiscard]] const std::string& GetAuthor() const noexcept;
79 [[nodiscard]] const std::string& GetWebsite() const noexcept;
80 [[nodiscard]] const std::string& GetLicense() const noexcept;
81
82 // --- Dependencies/Conflicts ---
83 [[nodiscard]] const std::vector<std::string>& GetPlatforms() const noexcept;
84 [[nodiscard]] const std::vector<Dependency>& GetDependencies() const noexcept;
85 [[nodiscard]] const std::vector<Conflict>& GetConflicts() const noexcept;
86 [[nodiscard]] const std::vector<Obsolete>& GetObsoletes() const noexcept;
87
88 // --- Plugin-specific (returns empty/null for modules) ---
89 [[nodiscard]] const std::string& GetEntry() const noexcept;
90 [[nodiscard]] const std::vector<Method>& GetMethods() const noexcept;
91 [[nodiscard]] const std::vector<MethodData>& GetMethodsData() const noexcept;
92
93 // --- Module-specific (returns empty/null for plugins) ---
94 [[nodiscard]] const std::filesystem::path& GetRuntime() const noexcept;
95 [[nodiscard]] const std::vector<std::filesystem::path>& GetDirectories() const noexcept;
96 [[nodiscard]] std::shared_ptr<IAssembly> GetAssembly() const noexcept;
97
98 // --- Shared Runtime ---
99 [[nodiscard]] MemAddr GetUserData() const noexcept;
100 [[nodiscard]] MethodTable GetMethodTable() const noexcept;
101 [[nodiscard]] ILanguageModule* GetLanguageModule() const noexcept;
102 [[nodiscard]] const Manifest& GetManifest() const noexcept;
103
104 // --- State & Error Management ---
105 [[nodiscard]] const std::vector<std::string>& GetErrors() const noexcept;
106 [[nodiscard]] const std::vector<std::string>& GetWarnings() const noexcept;
107 [[nodiscard]] bool HasErrors() const noexcept;
108 [[nodiscard]] bool HasWarnings() const noexcept;
109
110 //[[nodiscard]] bool IsLoaded() const noexcept;
111 [[nodiscard]] bool IsPlugin() const noexcept {
112 return GetType() == ExtensionType::Plugin;
113 }
114
115 [[nodiscard]] bool IsModule() const noexcept {
116 return GetType() == ExtensionType::Module;
117 }
118
119 // --- Timing/Performance ---
120 [[nodiscard]] std::chrono::milliseconds GetOperationTime(ExtensionState state) const;
121 [[nodiscard]] std::chrono::milliseconds GetTotalTime() const;
122 [[nodiscard]] std::string GetPerformanceReport() const;
123
124 // --- State Management ---
125 void StartOperation(ExtensionState newState);
126 void EndOperation(ExtensionState newState);
127 void SetState(ExtensionState state);
128
129 // --- Error/Warning Management ---
130 void AddError(std::string error);
131 void AddWarning(std::string warning);
132 void ClearErrors();
133 void ClearWarnings();
134
135 // --- Runtime Updates ---
136 void SetUserData(MemAddr data);
137 void SetMethodTable(MethodTable table);
138 void SetLanguageModule(ILanguageModule* module);
139 void SetManifest(Manifest manifest);
140
141 // --- Plugin-specific setters ---
142 void SetMethodsData(std::vector<MethodData> methodsData);
143
144 // --- Module-specific setters ---
145 void SetAssembly(std::shared_ptr<IAssembly> assembly);
146
147 // --- Comparison ---
148 [[nodiscard]] bool operator==(const Extension& other) const noexcept;
149 [[nodiscard]] auto operator<=>(const Extension& other) const noexcept;
150
151 // --- File extensions ---
152 [[nodiscard]] static plg::path_view GetFileExtension(ExtensionType type);
153 [[nodiscard]] static ExtensionType GetExtensionType(const std::filesystem::path& path);
154
155 // --- Helpers ---
156 [[nodiscard]] static bool IsValidTransition(ExtensionState from, ExtensionState to);
157 [[nodiscard]] std::string ToString() const;
158 [[nodiscard]] const std::string& GetVersionString() const noexcept;
159 // bool CanLoad() const noexcept;
160 // bool CanStart() const noexcept;
161 // bool CanUpdate() const noexcept;
162 // bool CanStop() const noexcept;
163 void AddDependency(std::string dep);
164 void Reset();
165
166 private:
167 struct Impl;
168 PLUGIFY_NO_DLL_EXPORT_WARNING(std::unique_ptr<Impl> _impl;)
169 };
170}
Interface for user-implemented language modules.
A wrapper class for memory addresses, providing utility functions for pointer manipulation.
Definition mem_addr.hpp:12
Represents a table of method availability flags.
Definition method.hpp:71