container: root: plugin: common: add PluggableSpace entrypoint

This commit is contained in:
2026-01-08 14:23:53 -08:00
parent cf5c2c4baa
commit 8a277485ba

View File

@@ -1,6 +1,6 @@
// docker-finance | modern accounting for the power-user // docker-finance | modern accounting for the power-user
// //
// Copyright (C) 2021-2025 Aaron Fiore (Founder, Evergreen Crypto LLC) // Copyright (C) 2021-2026 Aaron Fiore (Founder, Evergreen Crypto LLC)
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by // it under the terms of the GNU General Public License as published by
@@ -75,9 +75,9 @@ class PluginPath final : public ::dfi::common::PluggablePath
class PluginSpace final : public ::dfi::common::PluggableSpace class PluginSpace final : public ::dfi::common::PluggableSpace
{ {
public: public:
explicit PluginSpace(const std::string& inner) explicit PluginSpace(const std::string& inner, const std::string& entry)
: ::dfi::common::PluggableSpace( : ::dfi::common::PluggableSpace(
::dfi::common::type::PluggableSpace({"plugin", inner})) ::dfi::common::type::PluggableSpace({"plugin", inner, entry}))
{ {
} }
}; };
@@ -146,8 +146,9 @@ class Plugin final
//! and pass `using bar = char; bar b;` to the plugin's loader (plugin-implementation defined). //! and pass `using bar = char; bar b;` to the plugin's loader (plugin-implementation defined).
//! //!
//! \warning //! \warning
//! To utilize plugin auto-loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace;\n //! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace\n
//! e.g., "repo/example/example.cc" requires the plugin's auto-loader to exist in the namespace `dfi::plugin::example`.\n //! and the plugin's entrypoint class *MUST* align with the plugin's filename; e.g., "repo/example/example.cc" requires that\n
//! the auto-(un)loader exist within the entrypoint class name `example_cc` within the namespace `dfi::plugin::example`.\n\n
//! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead. //! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead.
//! //!
//! \ingroup cpp_plugin //! \ingroup cpp_plugin
@@ -156,7 +157,7 @@ void load(const common::PluginPath& path, const common::PluginArgs& args)
{ {
::dfi::common::type:: ::dfi::common::type::
Pluggable<common::PluginPath, common::PluginSpace, common::PluginArgs> Pluggable<common::PluginPath, common::PluginSpace, common::PluginArgs>
type{path, common::PluginSpace{path.parent()}, args}; type{path, common::PluginSpace{path.parent(), path.child()}, args};
common::Plugin plugin{type}; common::Plugin plugin{type};
plugin.load(); plugin.load();
@@ -185,8 +186,9 @@ void load(const common::PluginPath& path, const common::PluginArgs& args)
//! &emsp; `using bar = char; bar b;` for `${DOCKER_FINANCE_CLIENT_PLUGINS}/root/example/example.cc` //! &emsp; `using bar = char; bar b;` for `${DOCKER_FINANCE_CLIENT_PLUGINS}/root/example/example.cc`
//! //!
//! \warning //! \warning
//! To utilize plugin auto-loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace;\n //! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace\n
//! e.g., "repo/example/example.cc" requires the plugin's auto-loader to exist in the namespace `dfi::plugin::example`.\n //! and the plugin's entrypoint class *MUST* align with the plugin's filename; e.g., "repo/example/example.cc" requires that\n
//! the auto-(un)loader exist within the entrypoint class name `example_cc` within the namespace `dfi::plugin::example`.\n\n
//! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead. //! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead.
//! //!
//! \ingroup cpp_plugin //! \ingroup cpp_plugin
@@ -231,8 +233,9 @@ void load(
//! and pass `using bar = char; bar b;` to the plugin's loader (plugin-implementation defined). //! and pass `using bar = char; bar b;` to the plugin's loader (plugin-implementation defined).
//! //!
//! \warning //! \warning
//! To utilize plugin auto-loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace;\n //! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace\n
//! e.g., "repo/example/example.cc" requires the plugin's auto-loader to exist in the namespace `dfi::plugin::example`.\n //! and the plugin's entrypoint class *MUST* align with the plugin's filename; e.g., "repo/example/example.cc" requires that\n
//! the auto-(un)loader exist within the entrypoint class name `example_cc` within the namespace `dfi::plugin::example`.\n\n
//! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead. //! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead.
//! //!
//! \ingroup cpp_plugin //! \ingroup cpp_plugin
@@ -260,8 +263,9 @@ void load(const std::string& path, const std::string& arg = {})
//! &emsp; ${DOCKER_FINANCE_CLIENT_PLUGINS}/root/example/example.cc //! &emsp; ${DOCKER_FINANCE_CLIENT_PLUGINS}/root/example/example.cc
//! //!
//! \warning //! \warning
//! To utilize plugin auto-loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace;\n //! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace\n
//! e.g., "repo/example/example.cc" requires the plugin's auto-loader to exist in the namespace `dfi::plugin::example`.\n //! and the plugin's entrypoint class *MUST* align with the plugin's filename; e.g., "repo/example/example.cc" requires that\n
//! the auto-(un)loader exist within the entrypoint class name `example_cc` within the namespace `dfi::plugin::example`.\n\n
//! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead. //! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead.
//! //!
//! \ingroup cpp_plugin //! \ingroup cpp_plugin
@@ -307,8 +311,9 @@ void load(const std::initializer_list<std::string>& paths)
//! and pass `using bar = char; bar b;` to the plugin's unloader (plugin-implementation defined). //! and pass `using bar = char; bar b;` to the plugin's unloader (plugin-implementation defined).
//! //!
//! \warning //! \warning
//! To utilize plugin auto-unloader functionality, the plugin's parent directory *MUST* align with the plugin's namespace;\n //! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace\n
//! e.g., "repo/example/example.cc" requires the plugin's auto-unloader to exist in the namespace `dfi::plugin::example`.\n //! and the plugin's entrypoint class *MUST* align with the plugin's filename; e.g., "repo/example/example.cc" requires that\n
//! the auto-(un)loader exist within the entrypoint class name `example_cc` within the namespace `dfi::plugin::example`.\n\n
//! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead. //! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead.
//! //!
//! \ingroup cpp_plugin //! \ingroup cpp_plugin
@@ -317,7 +322,7 @@ void unload(const common::PluginPath& path, const common::PluginArgs& args)
{ {
::dfi::common::type:: ::dfi::common::type::
Pluggable<common::PluginPath, common::PluginSpace, common::PluginArgs> Pluggable<common::PluginPath, common::PluginSpace, common::PluginArgs>
type{path, common::PluginSpace{path.parent()}, args}; type{path, common::PluginSpace{path.parent(), path.child()}, args};
common::Plugin plugin{type}; common::Plugin plugin{type};
plugin.unload(); plugin.unload();
@@ -346,8 +351,9 @@ void unload(const common::PluginPath& path, const common::PluginArgs& args)
//! &emsp; `using bar = char; bar b;` for `${DOCKER_FINANCE_CLIENT_PLUGINS}/root/example/example.cc` //! &emsp; `using bar = char; bar b;` for `${DOCKER_FINANCE_CLIENT_PLUGINS}/root/example/example.cc`
//! //!
//! \warning //! \warning
//! To utilize plugin auto-unloader functionality, the plugin's parent directory *MUST* align with the plugin's namespace;\n //! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace\n
//! e.g., "repo/example/example.cc" requires the plugin's auto-unloader to exist in the namespace `dfi::plugin::example`.\n //! and the plugin's entrypoint class *MUST* align with the plugin's filename; e.g., "repo/example/example.cc" requires that\n
//! the auto-(un)loader exist within the entrypoint class name `example_cc` within the namespace `dfi::plugin::example`.\n\n
//! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead. //! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead.
//! //!
//! \ingroup cpp_plugin //! \ingroup cpp_plugin
@@ -392,8 +398,9 @@ void unload(
//! and pass `using bar = char; bar b;` to the plugin's unloader (plugin-implementation defined). //! and pass `using bar = char; bar b;` to the plugin's unloader (plugin-implementation defined).
//! //!
//! \warning //! \warning
//! To utilize plugin auto-unloader functionality, the plugin's parent directory *MUST* align with the plugin's namespace;\n //! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace\n
//! e.g., "repo/example/example.cc" requires the plugin's auto-unloader to exist in the namespace `dfi::plugin::example`.\n //! and the plugin's entrypoint class *MUST* align with the plugin's filename; e.g., "repo/example/example.cc" requires that\n
//! the auto-(un)loader exist within the entrypoint class name `example_cc` within the namespace `dfi::plugin::example`.\n\n
//! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead. //! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead.
//! //!
//! \ingroup cpp_plugin //! \ingroup cpp_plugin
@@ -421,8 +428,9 @@ void unload(const std::string& path, const std::string& arg = {})
//! &emsp; ${DOCKER_FINANCE_CLIENT_PLUGINS}/root/example/example.cc //! &emsp; ${DOCKER_FINANCE_CLIENT_PLUGINS}/root/example/example.cc
//! //!
//! \warning //! \warning
//! To utilize plugin auto-unloader functionality, the plugin's parent directory *MUST* align with the plugin's namespace;\n //! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace\n
//! e.g., "repo/example/example.cc" requires the plugin's auto-unloader to exist in the namespace `dfi::plugin::example`.\n //! and the plugin's entrypoint class *MUST* align with the plugin's filename; e.g., "repo/example/example.cc" requires that\n
//! the auto-(un)loader exist within the entrypoint class name `example_cc` within the namespace `dfi::plugin::example`.\n\n
//! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead. //! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead.
//! //!
//! \ingroup cpp_plugin //! \ingroup cpp_plugin
@@ -458,8 +466,9 @@ void unload(const std::initializer_list<std::string>& paths)
//! and pass `using foo = int; foo f;` to the plugin's loader (plugin-implementation defined) //! and pass `using foo = int; foo f;` to the plugin's loader (plugin-implementation defined)
//! //!
//! \warning //! \warning
//! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace;\n //! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace\n
//! e.g., "repo/example/example.cc" requires the plugin's auto-(un)loader to exist in the namespace `dfi::plugin::example`.\n //! and the plugin's entrypoint class *MUST* align with the plugin's filename; e.g., "repo/example/example.cc" requires that\n
//! the auto-(un)loader exist within the entrypoint class name `example_cc` within the namespace `dfi::plugin::example`.\n\n
//! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead. //! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead.
//! //!
//! \ingroup cpp_plugin //! \ingroup cpp_plugin
@@ -468,7 +477,7 @@ void reload(const common::PluginPath& path, const common::PluginArgs& args)
{ {
::dfi::common::type:: ::dfi::common::type::
Pluggable<common::PluginPath, common::PluginSpace, common::PluginArgs> Pluggable<common::PluginPath, common::PluginSpace, common::PluginArgs>
type{path, common::PluginSpace{path.parent()}, args}; type{path, common::PluginSpace{path.parent(), path.child()}, args};
common::Plugin plugin{type}; common::Plugin plugin{type};
plugin.reload(); plugin.reload();
@@ -496,8 +505,9 @@ void reload(const common::PluginPath& path, const common::PluginArgs& args)
//! &emsp; `using bar = char; bar b;` for `${DOCKER_FINANCE_CLIENT_PLUGINS}/root/example/example.cc` //! &emsp; `using bar = char; bar b;` for `${DOCKER_FINANCE_CLIENT_PLUGINS}/root/example/example.cc`
//! //!
//! \warning //! \warning
//! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace;\n //! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace\n
//! e.g., "repo/example/example.cc" requires the plugin's auto-(un)loader to exist in the namespace `dfi::plugin::example`.\n //! and the plugin's entrypoint class *MUST* align with the plugin's filename; e.g., "repo/example/example.cc" requires that\n
//! the auto-(un)loader exist within the entrypoint class name `example_cc` within the namespace `dfi::plugin::example`.\n\n
//! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead. //! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead.
//! //!
//! \ingroup cpp_plugin //! \ingroup cpp_plugin
@@ -542,8 +552,9 @@ void reload(
//! and pass `using bar = char; bar b;` to the plugin's auto-unloader (plugin-implementation defined). //! and pass `using bar = char; bar b;` to the plugin's auto-unloader (plugin-implementation defined).
//! //!
//! \warning //! \warning
//! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace;\n //! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace\n
//! e.g., "repo/example/example.cc" requires the plugin's auto-(un)loader to exist in the namespace `dfi::plugin::example`.\n //! and the plugin's entrypoint class *MUST* align with the plugin's filename; e.g., "repo/example/example.cc" requires that\n
//! the auto-(un)loader exist within the entrypoint class name `example_cc` within the namespace `dfi::plugin::example`.\n\n
//! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead. //! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead.
//! //!
//! \ingroup cpp_plugin //! \ingroup cpp_plugin
@@ -573,8 +584,9 @@ void reload(
//! &emsp; ${DOCKER_FINANCE_CLIENT_PLUGINS}/root/example/example.cc //! &emsp; ${DOCKER_FINANCE_CLIENT_PLUGINS}/root/example/example.cc
//! //!
//! \warning //! \warning
//! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace;\n //! To utilize plugin auto-(un)loader functionality, the plugin's parent directory *MUST* align with the plugin's namespace\n
//! e.g., "repo/example/example.cc" requires the plugin's auto-(un)loader to exist in the namespace `dfi::plugin::example`.\n //! and the plugin's entrypoint class *MUST* align with the plugin's filename; e.g., "repo/example/example.cc" requires that\n
//! the auto-(un)loader exist within the entrypoint class name `example_cc` within the namespace `dfi::plugin::example`.\n\n
//! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead. //! To avoid this requisite, though ill-advised, use a `dfi::common` file loader instead.
//! //!
//! \ingroup cpp_plugin //! \ingroup cpp_plugin