Implement type checking/validation for filters (#4364)
Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
#include "ChannelFilterEditorDialog.hpp"
|
||||
#include "widgets/dialogs/ChannelFilterEditorDialog.hpp"
|
||||
|
||||
#include "controllers/filters/parser/FilterParser.hpp"
|
||||
#include "controllers/filters/lang/Tokenizer.hpp"
|
||||
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
@@ -99,7 +99,8 @@ ChannelFilterEditorDialog::ValueSpecifier::ValueSpecifier()
|
||||
|
||||
this->typeCombo_->insertItems(
|
||||
0, {"Constant Text", "Constant Number", "Variable"});
|
||||
this->varCombo_->insertItems(0, filterparser::validIdentifiersMap.values());
|
||||
|
||||
this->varCombo_->insertItems(0, filters::validIdentifiersMap.values());
|
||||
|
||||
this->layout_->addWidget(this->typeCombo_);
|
||||
this->layout_->addWidget(this->varCombo_, 1);
|
||||
@@ -141,7 +142,7 @@ void ChannelFilterEditorDialog::ValueSpecifier::setValue(const QString &value)
|
||||
if (this->typeCombo_->currentIndex() == 2)
|
||||
{
|
||||
this->varCombo_->setCurrentText(
|
||||
filterparser::validIdentifiersMap.value(value));
|
||||
filters::validIdentifiersMap.value(value));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -164,7 +165,7 @@ QString ChannelFilterEditorDialog::ValueSpecifier::expressionText()
|
||||
case 1: // number
|
||||
return this->valueInput_->text();
|
||||
case 2: // variable
|
||||
return filterparser::validIdentifiersMap.key(
|
||||
return filters::validIdentifiersMap.key(
|
||||
this->varCombo_->currentText());
|
||||
default:
|
||||
return "";
|
||||
@@ -221,7 +222,7 @@ QString ChannelFilterEditorDialog::BinaryOperationSpecifier::expressionText()
|
||||
return this->left_->expressionText();
|
||||
}
|
||||
|
||||
return QString("(%1) %2 (%3)")
|
||||
return QString("(%1 %2 %3)")
|
||||
.arg(this->left_->expressionText())
|
||||
.arg(opText)
|
||||
.arg(this->right_->expressionText());
|
||||
|
||||
@@ -91,23 +91,39 @@ void FiltersPage::tableCellClicked(const QModelIndex &clicked,
|
||||
{
|
||||
QMessageBox popup(this->window());
|
||||
|
||||
filterparser::FilterParser f(
|
||||
view->getModel()->data(clicked.siblingAtColumn(1)).toString());
|
||||
auto filterText =
|
||||
view->getModel()->data(clicked.siblingAtColumn(1)).toString();
|
||||
auto filterResult = filters::Filter::fromString(filterText);
|
||||
|
||||
if (f.valid())
|
||||
if (std::holds_alternative<filters::Filter>(filterResult))
|
||||
{
|
||||
popup.setIcon(QMessageBox::Icon::Information);
|
||||
popup.setWindowTitle("Valid filter");
|
||||
popup.setText("Filter is valid");
|
||||
popup.setInformativeText(
|
||||
QString("Parsed as:\n%1").arg(f.filterString()));
|
||||
auto f = std::move(std::get<filters::Filter>(filterResult));
|
||||
if (f.returnType() == filters::Type::Bool)
|
||||
{
|
||||
popup.setIcon(QMessageBox::Icon::Information);
|
||||
popup.setWindowTitle("Valid filter");
|
||||
popup.setText("Filter is valid");
|
||||
popup.setInformativeText(
|
||||
QString("Parsed as:\n%1").arg(f.filterString()));
|
||||
}
|
||||
else
|
||||
{
|
||||
popup.setIcon(QMessageBox::Icon::Warning);
|
||||
popup.setWindowTitle("Invalid filter");
|
||||
popup.setText(QString("Unexpected filter return type"));
|
||||
popup.setInformativeText(
|
||||
QString("Expected %1 but got %2")
|
||||
.arg(filters::typeToString(filters::Type::Bool))
|
||||
.arg(filters::typeToString(f.returnType())));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
auto err = std::move(std::get<filters::FilterError>(filterResult));
|
||||
popup.setIcon(QMessageBox::Icon::Warning);
|
||||
popup.setWindowTitle("Invalid filter");
|
||||
popup.setText(QString("Parsing errors occurred:"));
|
||||
popup.setInformativeText(f.errors().join("\n"));
|
||||
popup.setInformativeText(err.message);
|
||||
}
|
||||
|
||||
popup.exec();
|
||||
|
||||
Reference in New Issue
Block a user