// !! This file has been generated by dnsdist-rules-generator.py, do not edit by hand!!
std::shared_ptr<AllRule> getAllSelector()
{
  return std::make_shared<AllRule>();
}
std::shared_ptr<DNSSECRule> getDNSSECSelector()
{
  return std::make_shared<DNSSECRule>();
}
std::shared_ptr<DSTPortRule> getDSTPortSelector(uint16_t port)
{
  return std::make_shared<DSTPortRule>(port);
}
std::shared_ptr<EDNSOptionRule> getEDNSOptionSelector(uint16_t option_code)
{
  return std::make_shared<EDNSOptionRule>(option_code);
}
std::shared_ptr<EDNSVersionRule> getEDNSVersionSelector(uint8_t version)
{
  return std::make_shared<EDNSVersionRule>(version);
}
std::shared_ptr<ERCodeRule> getERCodeSelector(uint8_t rcode)
{
  return std::make_shared<ERCodeRule>(rcode);
}
std::shared_ptr<HTTPHeaderRule> getHTTPHeaderSelector(const std::string& header, const std::string& expression)
{
  return std::make_shared<HTTPHeaderRule>(header, expression);
}
std::shared_ptr<HTTPPathRule> getHTTPPathSelector(const std::string& path)
{
  return std::make_shared<HTTPPathRule>(path);
}
std::shared_ptr<HTTPPathRegexRule> getHTTPPathRegexSelector(const std::string& expression)
{
  return std::make_shared<HTTPPathRegexRule>(expression);
}
std::shared_ptr<LuaFFIPerThreadRule> getLuaFFIPerThreadSelector(const std::string& code)
{
  return std::make_shared<LuaFFIPerThreadRule>(code);
}
std::shared_ptr<MaxQPSRule> getMaxQPSSelector(uint32_t qps, std::optional<uint32_t> burst)
{
  return std::make_shared<MaxQPSRule>(qps, burst ? *burst : 0);
}
std::shared_ptr<MaxQPSIPRule> getMaxQPSIPSelector(uint32_t qps, std::optional<uint8_t> ipv4_mask, std::optional<uint8_t> ipv6_mask, std::optional<uint32_t> burst, std::optional<uint32_t> expiration, std::optional<uint32_t> cleanup_delay, std::optional<uint32_t> scan_fraction, std::optional<uint32_t> shards)
{
  return std::make_shared<MaxQPSIPRule>(qps, ipv4_mask ? *ipv4_mask : 32, ipv6_mask ? *ipv6_mask : 64, burst ? *burst : 0, expiration ? *expiration : 300, cleanup_delay ? *cleanup_delay : 60, scan_fraction ? *scan_fraction : 10, shards ? *shards : 10);
}
std::shared_ptr<OpcodeRule> getOpcodeSelector(uint8_t code)
{
  return std::make_shared<OpcodeRule>(code);
}
std::shared_ptr<PayloadSizeRule> getPayloadSizeSelector(const std::string& comparison, uint16_t size)
{
  return std::make_shared<PayloadSizeRule>(comparison, size);
}
std::shared_ptr<PoolAvailableRule> getPoolAvailableSelector(const std::string& pool)
{
  return std::make_shared<PoolAvailableRule>(pool);
}
std::shared_ptr<PoolOutstandingRule> getPoolOutstandingSelector(const std::string& pool, uint64_t max_outstanding)
{
  return std::make_shared<PoolOutstandingRule>(pool, max_outstanding);
}
std::shared_ptr<ProbaRule> getProbaSelector(double probability)
{
  return std::make_shared<ProbaRule>(probability);
}
std::shared_ptr<ProxyProtocolValueRule> getProxyProtocolValueSelector(uint8_t option_type, std::optional<std::string> option_value)
{
  return std::make_shared<ProxyProtocolValueRule>(option_type, option_value ? *option_value : "");
}
std::shared_ptr<QNameLabelsCountRule> getQNameLabelsCountSelector(uint16_t min_labels_count, uint16_t max_labels_count)
{
  return std::make_shared<QNameLabelsCountRule>(min_labels_count, max_labels_count);
}
std::shared_ptr<QNameWireLengthRule> getQNameWireLengthSelector(uint16_t min, uint16_t max)
{
  return std::make_shared<QNameWireLengthRule>(min, max);
}
std::shared_ptr<RCodeRule> getRCodeSelector(uint8_t rcode)
{
  return std::make_shared<RCodeRule>(rcode);
}
std::shared_ptr<RDRule> getRDSelector()
{
  return std::make_shared<RDRule>();
}
std::shared_ptr<RE2Rule> getRE2Selector(const std::string& expression)
{
  return std::make_shared<RE2Rule>(expression);
}
std::shared_ptr<RecordsCountRule> getRecordsCountSelector(uint8_t section, uint16_t minimum, uint16_t maximum)
{
  return std::make_shared<RecordsCountRule>(section, minimum, maximum);
}
std::shared_ptr<RecordsTypeCountRule> getRecordsTypeCountSelector(uint8_t section, uint16_t record_type, uint16_t minimum, uint16_t maximum)
{
  return std::make_shared<RecordsTypeCountRule>(section, record_type, minimum, maximum);
}
std::shared_ptr<RegexRule> getRegexSelector(const std::string& expression)
{
  return std::make_shared<RegexRule>(expression);
}
std::shared_ptr<SNIRule> getSNISelector(const std::string& server_name)
{
  return std::make_shared<SNIRule>(server_name);
}
std::shared_ptr<TagRule> getTagSelector(const std::string& tag, std::optional<std::string> value, std::optional<bool> emptyAsWildcard)
{
  return std::make_shared<TagRule>(tag, value ? *value : "", emptyAsWildcard ? *emptyAsWildcard : true);
}
std::shared_ptr<TCPRule> getTCPSelector(bool tcp)
{
  return std::make_shared<TCPRule>(tcp);
}
std::shared_ptr<TrailingDataRule> getTrailingDataSelector()
{
  return std::make_shared<TrailingDataRule>();
}
