BareGit
#include "tool.hpp"

mw::E<void> ToolRegistry::registerTool(std::unique_ptr<Tool> tool)
{
    if(tools_.contains(tool->name()))
    {
        return std::unexpected(mw::runtimeError(
            std::format("Tool '{}' is already registered.", tool->name())));
    }
    tools_[tool->name()] = std::move(tool);
    return {};
}

mw::E<void> ToolRegistry::registerToolWithNamespace(const std::string& ns,
                                                    std::unique_ptr<Tool> tool)
{
    std::string prefixed_name = std::format("{}_{}", ns, tool->name());
    if(tools_.contains(prefixed_name))
    {
        return std::unexpected(mw::runtimeError(
            std::format("Tool '{}' is already registered.", prefixed_name)));
    }

    tools_[prefixed_name] = std::move(tool);
    return {};
}

Tool* ToolRegistry::getTool(const std::string& name) const
{
    auto it = tools_.find(name);
    return it != tools_.end() ? it->second.get() : nullptr;
}

std::vector<Tool*> ToolRegistry::getAllTools() const
{
    std::vector<Tool*> result;
    for(const auto& [name, tool] : tools_)
    {
        result.push_back(tool.get());
    }
    return result;
}