summaryrefslogtreecommitdiff
path: root/compiler/cpp/src/thrift/generate/validator_parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/cpp/src/thrift/generate/validator_parser.h')
-rw-r--r--compiler/cpp/src/thrift/generate/validator_parser.h208
1 files changed, 208 insertions, 0 deletions
diff --git a/compiler/cpp/src/thrift/generate/validator_parser.h b/compiler/cpp/src/thrift/generate/validator_parser.h
new file mode 100644
index 000000000..076af2ed6
--- /dev/null
+++ b/compiler/cpp/src/thrift/generate/validator_parser.h
@@ -0,0 +1,208 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef T_VALIDATOR_GENERATOR_H
+#define T_VALIDATOR_GENERATOR_H
+
+#include "thrift/generate/t_generator.h"
+#include <fstream>
+#include <iostream>
+#include <limits>
+#include <string>
+#include <vector>
+
+class validation_value {
+public:
+ struct validation_function {
+ public:
+ std::string name;
+ std::vector<validation_value*> arguments;
+ };
+
+ enum validation_value_type {
+ VV_INTEGER,
+ VV_DOUBLE,
+ VV_BOOL,
+ VV_ENUM,
+ VV_STRING,
+ VV_FUNCTION,
+ VV_FIELD_REFERENCE,
+ VV_UNKNOWN
+ };
+
+ validation_value() : val_type(VV_UNKNOWN) {}
+ validation_value(const int64_t val) : int_val(val), val_type(VV_INTEGER) {}
+ validation_value(const double val) : double_val(val), val_type(VV_DOUBLE) {}
+ validation_value(const bool val) : bool_val(val), val_type(VV_BOOL) {}
+ validation_value(t_enum_value* val) : enum_val(val), val_type(VV_ENUM) {}
+ validation_value(const std::string val) : string_val(val), val_type(VV_STRING) {}
+ validation_value(validation_function* val) : function_val(val), val_type(VV_FUNCTION) {}
+ validation_value(t_field* val) : field_reference_val(val), val_type(VV_FIELD_REFERENCE) {}
+
+ void set_int(const int64_t val) {
+ int_val = val;
+ val_type = VV_INTEGER;
+ }
+ int64_t get_int() const { return int_val; };
+
+ void set_double(const double val) {
+ double_val = val;
+ val_type = VV_DOUBLE;
+ }
+ double get_double() { return double_val; };
+
+ void set_bool(const bool val) {
+ bool_val = val;
+ val_type = VV_BOOL;
+ }
+ bool get_bool() const { return bool_val; };
+
+ void set_enum(t_enum_value* val) {
+ enum_val = val;
+ val_type = VV_ENUM;
+ }
+ t_enum_value* get_enum() const { return enum_val; };
+
+ void set_string(const std::string val) {
+ string_val = val;
+ val_type = VV_STRING;
+ }
+ std::string get_string() const { return string_val; };
+
+ void set_function(validation_function* val) {
+ function_val = val;
+ val_type = VV_FUNCTION;
+ }
+
+ validation_function* get_function() { return function_val; };
+
+ void set_field_reference(t_field* val) {
+ field_reference_val = val;
+ val_type = VV_FIELD_REFERENCE;
+ }
+ t_field* get_field_reference() const { return field_reference_val; };
+
+ bool is_field_reference() const { return val_type == VV_FIELD_REFERENCE; };
+
+ bool is_validation_function() const { return val_type == VV_FUNCTION; };
+
+ validation_value_type get_type() const { return val_type; };
+
+private:
+ int64_t int_val = 0;
+ double double_val = 0.0;
+ bool bool_val = false;
+ t_enum_value* enum_val = nullptr;
+ std::string string_val;
+ validation_function* function_val;
+ t_field* field_reference_val;
+
+ validation_value_type val_type;
+};
+
+class validation_rule {
+public:
+ validation_rule(){};
+ validation_rule(std::string name) : name(name){};
+ validation_rule(std::string name, validation_rule* inner) : name(name), inner(inner){};
+
+ std::string get_name() { return name; };
+ void append_value(validation_value* value) { values.push_back(value); }
+ const std::vector<validation_value*>& get_values() { return values; };
+ validation_rule* get_inner() { return inner; };
+
+private:
+ std::string name;
+ std::vector<validation_value*> values;
+ validation_rule* inner;
+};
+
+class validation_parser {
+public:
+ validation_parser() {}
+ validation_parser(t_struct* reference) : reference(reference) {}
+ std::vector<validation_rule*> parse_field(
+ t_type* type,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ void set_reference(t_struct* reference) { this->reference = reference; };
+
+private:
+ std::vector<validation_rule*> parse_bool_field(
+ t_type* type,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ std::vector<validation_rule*> parse_enum_field(
+ t_type* type,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ std::vector<validation_rule*> parse_double_field(
+ t_type* type,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ std::vector<validation_rule*> parse_integer_field(
+ t_type* type,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ std::vector<validation_rule*> parse_string_field(
+ t_type* type,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ std::vector<validation_rule*> parse_set_field(
+ t_type* type,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ std::vector<validation_rule*> parse_list_field(
+ t_type* type,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ std::vector<validation_rule*> parse_map_field(
+ t_type* type,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ std::vector<validation_rule*> parse_struct_field(
+ t_type* type,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ std::vector<validation_rule*> parse_xception_field(
+ t_type* type,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ std::vector<validation_rule*> parse_union_field(
+ t_type* type,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ bool is_reference_field(std::string value);
+ bool is_validation_function(std::string value);
+ void add_bool_rule(std::vector<validation_rule*>& rules,
+ std::string key,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ void add_double_rule(std::vector<validation_rule*>& rules,
+ std::string key,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ void add_double_list_rule(std::vector<validation_rule*>& rules,
+ std::string key,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ void add_integer_rule(std::vector<validation_rule*>& rules,
+ std::string key,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ void add_integer_list_rule(std::vector<validation_rule*>& rules,
+ std::string key,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ void add_string_rule(std::vector<validation_rule*>& rules,
+ std::string key,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ void add_enum_list_rule(std::vector<validation_rule*>& rules,
+ t_enum* enum_,
+ std::string key,
+ std::map<std::string, std::vector<std::string>>& annotations);
+ t_field* get_referenced_field(std::string annotation_value);
+ validation_value::validation_function* get_validation_function(std::string annotation_value);
+ t_struct* reference;
+};
+
+#endif