source/model-generator/FieldConstraints.h (81 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <re2/re2.h>
#include <mariana-trench/Field.h>
#include <mariana-trench/model-generator/TypeConstraints.h>
namespace marianatrench {
class FieldConstraint {
public:
FieldConstraint() = default;
virtual ~FieldConstraint() = default;
FieldConstraint(const FieldConstraint& other) = delete;
FieldConstraint(FieldConstraint&& other) = delete;
FieldConstraint& operator=(const FieldConstraint& other) = delete;
FieldConstraint& operator=(FieldConstraint&& other) = delete;
static std::unique_ptr<FieldConstraint> from_json(
const Json::Value& constraint);
virtual bool satisfy(const Field* field) const = 0;
virtual bool operator==(const FieldConstraint& other) const = 0;
};
class FieldNameConstraint final : public FieldConstraint {
public:
explicit FieldNameConstraint(const std::string& regex_string);
bool satisfy(const Field* field) const override;
bool operator==(const FieldConstraint& other) const override;
private:
re2::RE2 pattern_;
};
class IsStaticFieldConstraint final : public FieldConstraint {
public:
explicit IsStaticFieldConstraint(bool expected);
bool satisfy(const Field* field) const override;
bool operator==(const FieldConstraint& other) const override;
private:
bool expected_;
};
class SignatureFieldConstraint final : public FieldConstraint {
public:
explicit SignatureFieldConstraint(const std::string& regex_string);
bool satisfy(const Field* field) const override;
bool operator==(const FieldConstraint& other) const override;
private:
re2::RE2 pattern_;
};
class HasAnnotationFieldConstraint final : public FieldConstraint {
public:
explicit HasAnnotationFieldConstraint(
const std::string& type,
const std::optional<std::string>& annotation);
bool satisfy(const Field* field) const override;
bool operator==(const FieldConstraint& other) const override;
private:
std::string type_;
std::optional<re2::RE2> annotation_;
};
class ParentFieldConstraint final : public FieldConstraint {
public:
explicit ParentFieldConstraint(
std::unique_ptr<TypeConstraint> inner_constraint);
bool satisfy(const Field* field) const override;
bool operator==(const FieldConstraint& other) const override;
private:
std::unique_ptr<TypeConstraint> inner_constraint_;
};
class AllOfFieldConstraint final : public FieldConstraint {
public:
explicit AllOfFieldConstraint(
std::vector<std::unique_ptr<FieldConstraint>> constraints);
bool satisfy(const Field* field) const override;
bool operator==(const FieldConstraint& other) const override;
private:
std::vector<std::unique_ptr<FieldConstraint>> constraints_;
};
class AnyOfFieldConstraint final : public FieldConstraint {
public:
explicit AnyOfFieldConstraint(
std::vector<std::unique_ptr<FieldConstraint>> constraints);
bool satisfy(const Field* field) const override;
bool operator==(const FieldConstraint& other) const override;
private:
std::vector<std::unique_ptr<FieldConstraint>> constraints_;
};
} // namespace marianatrench