1 #pragma once
2 #include "ConfigVariable.h"
3 #include "net/address_utils.h"
4 #include "core/types.h"
5 
6 bool is_not_invalid_doid(const doid_t& id);
7 bool is_not_reserved_doid(const doid_t& id);
8 bool is_not_invalid_channel(const channel_t& c);
9 bool is_not_reserved_channel(const channel_t& c);
10 bool is_boolean_keyword(const std::string& str);
11 bool is_existing_and_readable_file(const std::string& file);
12 
13 class BooleanValueConstraint : public RawConfigConstraint<bool>
14 {
15   public:
BooleanValueConstraint(ConfigVariable<bool> & var)16     BooleanValueConstraint(ConfigVariable<bool>& var) :
17         RawConfigConstraint(is_boolean_keyword, var,
18                             "Boolean value must be either \"true\" or \"false\".")
19     {
20     }
21 };
22 class InvalidDoidConstraint : public ConfigConstraint<doid_t>
23 {
24   public:
InvalidDoidConstraint(ConfigVariable<doid_t> & var)25     InvalidDoidConstraint(ConfigVariable<doid_t>& var) :
26         ConfigConstraint(is_not_invalid_doid, var,
27                          "Doid value cannot be INVALID_DOID (0).")
28     {
29     }
30 };
31 class ReservedDoidConstraint : public ConfigConstraint<doid_t>
32 {
33   public:
ReservedDoidConstraint(ConfigVariable<doid_t> & var)34     ReservedDoidConstraint(ConfigVariable<doid_t>& var) :
35         ConfigConstraint(is_not_reserved_doid, var,
36                          "Doid value cannot be reserved doid (1 - 999).")
37     {
38     }
39 };
40 class InvalidChannelConstraint : public ConfigConstraint<channel_t>
41 {
42   public:
InvalidChannelConstraint(ConfigVariable<channel_t> & var)43     InvalidChannelConstraint(ConfigVariable<channel_t>& var) :
44         ConfigConstraint(is_not_invalid_channel, var,
45                          "Channel value cannot be INVALID_CHANNEL (0).")
46     {
47     }
48 };
49 class ReservedChannelConstraint : public ConfigConstraint<channel_t>
50 {
51   public:
ReservedChannelConstraint(ConfigVariable<channel_t> & var)52     ReservedChannelConstraint(ConfigVariable<channel_t>& var) :
53         ConfigConstraint(is_not_reserved_channel, var,
54                          "Channel value cannot be in a reserved channel range.")
55     {
56     }
57 };
58 class ValidAddressConstraint : public ConfigConstraint<std::string>
59 {
60   public:
ValidAddressConstraint(ConfigVariable<std::string> & var)61     ValidAddressConstraint(ConfigVariable<std::string>& var) :
62         ConfigConstraint(is_valid_address, var,
63                          "String is not a valid IPv4/IPv6 address or hostname.")
64     {
65     }
66 };
67 class FileAvailableConstraint : public ConfigConstraint<std::string>
68 {
69   public:
FileAvailableConstraint(ConfigVariable<std::string> & var)70     FileAvailableConstraint(ConfigVariable<std::string>& var) :
71         ConfigConstraint(is_existing_and_readable_file, var,
72                          "File could not be found/opened.")
73     {
74     }
75 };
76