wiRedPanda
Logic Circuit Simulator
Loading...
Searching...
No Matches
BaseHandler.h
Go to the documentation of this file.
1// Copyright 2015 - 2026, GIBIS-UNIFESP and the wiRedPanda contributors
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4#pragma once
5
6#include <QJsonObject>
7#include <QString>
8
10
11class MainWindow;
12class MCPValidator;
13class Scene;
14class GraphicElement;
15
24{
25public:
26 explicit BaseHandler(MainWindow *mainWindow, const MCPValidator *validator);
27 virtual ~BaseHandler() = default;
28
29 // Pure virtual method for handling commands - each handler implements this
30 virtual QJsonObject handleCommand(const QString &command, const QJsonObject &params, const QJsonValue &requestId) = 0;
31
32 // Public utility methods available to all classes
33 QJsonObject createErrorResponse(const QString &error,
34 const QJsonValue &requestId = QJsonValue(),
35 int code = JsonRpcError::InternalError) const;
36 QJsonObject createSuccessResponse(const QJsonObject &result = {}, const QJsonValue &requestId = QJsonValue()) const;
39 const Scene *currentScene() const;
40 bool validateElementId(int elementId, const QString &paramName, QString &errorMsg) const;
41 bool validateNonEmptyString(const QJsonValue &value, const QString &paramName, QString &errorMsg) const;
42 bool validateNonNegativeInteger(const QJsonValue &value, const QString &paramName, QString &errorMsg) const;
43 bool validateNumeric(const QJsonValue &value, const QString &paramName, QString &errorMsg) const;
44 bool validateParameters(const QJsonObject &params, const QStringList &required) const;
45 bool validatePortRange(GraphicElement *element, int portIndex, bool isOutput, const QString &paramName, QString &errorMsg) const;
46 bool validatePositiveInteger(const QJsonValue &value, const QString &paramName, QString &errorMsg) const;
47
54 template<typename Fn>
55 QJsonObject tryCommand(Fn &&fn, const QString &action, const QJsonValue &requestId = QJsonValue())
56 {
57 try {
58 return std::forward<Fn>(fn)();
59 } catch (const std::exception &e) {
60 return createErrorResponse(QString("Failed to %1: %2").arg(action, e.what()),
62 } catch (...) {
63 return createErrorResponse(QString("Failed to %1: Unknown exception").arg(action),
65 }
66 }
67
74 GraphicElement *validatedElement(const QJsonObject &params, const QString &paramName, QString &errorMsg);
75
76 // Port lookup by label (similar to CircuitBuilder in testutils.cpp)
77 bool inputPortByLabel(GraphicElement *element, const QString &label, int &portIndex, QString &errorMsg) const;
78 bool outputPortByLabel(GraphicElement *element, const QString &label, int &portIndex, QString &errorMsg) const;
79 QString availableInputPorts(GraphicElement *element) const;
80 QString availableOutputPorts(GraphicElement *element) const;
81
82protected:
83 QString availablePorts(GraphicElement *element, bool isOutput) const;
84 // Shared resources
87};
Numeric error codes returned in MCP responses, per JSON-RPC 2.0.
bool validatePortRange(GraphicElement *element, int portIndex, bool isOutput, const QString &paramName, QString &errorMsg) const
const MCPValidator * m_validator
Definition BaseHandler.h:86
QString availableOutputPorts(GraphicElement *element) const
QJsonObject createSuccessResponse(const QJsonObject &result={}, const QJsonValue &requestId=QJsonValue()) const
QJsonObject tryCommand(Fn &&fn, const QString &action, const QJsonValue &requestId=QJsonValue())
Wraps fn in a try/catch, returning an error response on exception.
Definition BaseHandler.h:55
bool validateElementId(int elementId, const QString &paramName, QString &errorMsg) const
QString availablePorts(GraphicElement *element, bool isOutput) const
virtual ~BaseHandler()=default
GraphicElement * validatedElement(const QJsonObject &params, const QString &paramName, QString &errorMsg)
Validates paramName in params, looks up the element, and returns it.
virtual QJsonObject handleCommand(const QString &command, const QJsonObject &params, const QJsonValue &requestId)=0
bool validateNonNegativeInteger(const QJsonValue &value, const QString &paramName, QString &errorMsg) const
BaseHandler(MainWindow *mainWindow, const MCPValidator *validator)
QJsonObject createErrorResponse(const QString &error, const QJsonValue &requestId=QJsonValue(), int code=JsonRpcError::InternalError) const
MainWindow * m_mainWindow
Definition BaseHandler.h:85
bool outputPortByLabel(GraphicElement *element, const QString &label, int &portIndex, QString &errorMsg) const
bool validateParameters(const QJsonObject &params, const QStringList &required) const
bool inputPortByLabel(GraphicElement *element, const QString &label, int &portIndex, QString &errorMsg) const
bool validatePositiveInteger(const QJsonValue &value, const QString &paramName, QString &errorMsg) const
QString availableInputPorts(GraphicElement *element) const
bool validateNonEmptyString(const QJsonValue &value, const QString &paramName, QString &errorMsg) const
bool validateNumeric(const QJsonValue &value, const QString &paramName, QString &errorMsg) const
Scene * currentScene()
Abstract base class for all graphical circuit elements in wiRedPanda.
JSON Schema validator for MCP commands and responses using native json-schema-validator.
The top-level application window hosting the tab bar, menus, element palette, and editor.
Definition MainWindow.h:47
Main circuit editing scene.
Definition Scene.h:56
constexpr int OperationFailed
Generic Qt API / handler operation failure (catch-all for tryCommand).
constexpr int InternalError
Internal JSON-RPC error (last-resort).