mirror of https://github.com/Icinga/icinga2.git
Avoid accessing attributes for validators where not necessary
This commit is contained in:
parent
e26494bf08
commit
21254fb610
|
@ -1564,10 +1564,10 @@ void Application::SetLastReloadFailed(double ts)
|
||||||
m_LastReloadFailed = ts;
|
m_LastReloadFailed = ts;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::ValidateName(const String& value, const ValidationUtils& utils)
|
void Application::ValidateName(const Lazy<String>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<Application>::ValidateName(value, utils);
|
ObjectImpl<Application>::ValidateName(lvalue, utils);
|
||||||
|
|
||||||
if (value != "app")
|
if (lvalue() != "app")
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "name" }, "Application object must be named 'app'."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "name" }, "Application object must be named 'app'."));
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,7 +174,7 @@ protected:
|
||||||
|
|
||||||
virtual void OnShutdown();
|
virtual void OnShutdown();
|
||||||
|
|
||||||
void ValidateName(const String& value, const ValidationUtils& utils) final;
|
void ValidateName(const Lazy<String>& lvalue, const ValidationUtils& utils) final;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static Application::Ptr m_Instance; /**< The application instance. */
|
static Application::Ptr m_Instance; /**< The application instance. */
|
||||||
|
|
|
@ -210,7 +210,7 @@ void ConfigObject::ModifyAttribute(const String& attr, const Value& value, bool
|
||||||
}
|
}
|
||||||
|
|
||||||
ModAttrValidationUtils utils;
|
ModAttrValidationUtils utils;
|
||||||
ValidateField(fid, newValue, utils);
|
ValidateField(fid, Lazy<Value>{newValue}, utils);
|
||||||
|
|
||||||
SetField(fid, newValue);
|
SetField(fid, newValue);
|
||||||
|
|
||||||
|
|
|
@ -183,14 +183,14 @@ bool Logger::IsTimestampEnabled()
|
||||||
return m_TimestampEnabled;
|
return m_TimestampEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logger::ValidateSeverity(const String& value, const ValidationUtils& utils)
|
void Logger::ValidateSeverity(const Lazy<String>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<Logger>::ValidateSeverity(value, utils);
|
ObjectImpl<Logger>::ValidateSeverity(lvalue, utils);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
StringToSeverity(value);
|
StringToSeverity(lvalue());
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "severity" }, "Invalid severity specified: " + value));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "severity" }, "Invalid severity specified: " + lvalue()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ public:
|
||||||
static void SetConsoleLogSeverity(LogSeverity logSeverity);
|
static void SetConsoleLogSeverity(LogSeverity logSeverity);
|
||||||
static LogSeverity GetConsoleLogSeverity();
|
static LogSeverity GetConsoleLogSeverity();
|
||||||
|
|
||||||
void ValidateSeverity(const String& value, const ValidationUtils& utils) final;
|
void ValidateSeverity(const Lazy<String>& lvalue, const ValidationUtils& utils) final;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void Start(bool runtimeCreated) override;
|
void Start(bool runtimeCreated) override;
|
||||||
|
|
|
@ -168,7 +168,7 @@ void Object::Validate(int types, const ValidationUtils& utils)
|
||||||
/* Nothing to do here. */
|
/* Nothing to do here. */
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::ValidateField(int id, const Value& value, const ValidationUtils& utils)
|
void Object::ValidateField(int id, const Lazy<Value>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
/* Nothing to do here. */
|
/* Nothing to do here. */
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,6 +98,63 @@ struct TypeHelper<T, true>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct Lazy
|
||||||
|
{
|
||||||
|
using Accessor = std::function<T ()>;
|
||||||
|
|
||||||
|
explicit Lazy(T value)
|
||||||
|
: m_Cached(true), m_Value(value)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
explicit Lazy(Accessor accessor)
|
||||||
|
: m_Accessor(accessor)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
template<typename U>
|
||||||
|
explicit Lazy(const Lazy<U>& other)
|
||||||
|
{
|
||||||
|
if (other.m_Cached) {
|
||||||
|
m_Accessor = Accessor();
|
||||||
|
m_Value = static_cast<T>(other.m_Value);
|
||||||
|
m_Cached = true;
|
||||||
|
} else {
|
||||||
|
auto accessor = other.m_Accessor;
|
||||||
|
m_Accessor = [accessor]() { return static_cast<T>(accessor()); };
|
||||||
|
m_Cached = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename U>
|
||||||
|
operator Lazy<U>() const
|
||||||
|
{
|
||||||
|
if (m_Cached)
|
||||||
|
return Lazy<U>(m_Value);
|
||||||
|
else {
|
||||||
|
Accessor accessor = m_Accessor;
|
||||||
|
return Lazy<U>([accessor]() { return static_cast<U>(accessor()); });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const T& operator()() const
|
||||||
|
{
|
||||||
|
if (!m_Cached) {
|
||||||
|
m_Value = m_Accessor();
|
||||||
|
m_Cached = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Accessor m_Accessor;
|
||||||
|
mutable bool m_Cached{false};
|
||||||
|
mutable T m_Value;
|
||||||
|
|
||||||
|
template<typename U>
|
||||||
|
friend struct Lazy;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for all heap-allocated objects. At least one of its methods
|
* Base class for all heap-allocated objects. At least one of its methods
|
||||||
* has to be virtual for RTTI to work.
|
* has to be virtual for RTTI to work.
|
||||||
|
@ -124,7 +181,7 @@ public:
|
||||||
virtual void SetFieldByName(const String& field, const Value& value, const DebugInfo& debugInfo);
|
virtual void SetFieldByName(const String& field, const Value& value, const DebugInfo& debugInfo);
|
||||||
virtual bool HasOwnField(const String& field) const;
|
virtual bool HasOwnField(const String& field) const;
|
||||||
virtual bool GetOwnField(const String& field, Value *result) const;
|
virtual bool GetOwnField(const String& field, Value *result) const;
|
||||||
virtual void ValidateField(int id, const Value& value, const ValidationUtils& utils);
|
virtual void ValidateField(int id, const Lazy<Value>& lvalue, const ValidationUtils& utils);
|
||||||
virtual void NotifyField(int id, const Value& cookie = Empty);
|
virtual void NotifyField(int id, const Value& cookie = Empty);
|
||||||
virtual Object::Ptr NavigateField(int id) const;
|
virtual Object::Ptr NavigateField(int id) const;
|
||||||
|
|
||||||
|
|
|
@ -103,13 +103,13 @@ void SyslogLogger::OnConfigLoaded()
|
||||||
m_Facility = Convert::ToLong(facilityString);
|
m_Facility = Convert::ToLong(facilityString);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyslogLogger::ValidateFacility(const String& value, const ValidationUtils& utils)
|
void SyslogLogger::ValidateFacility(const Lazy<String>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<SyslogLogger>::ValidateFacility(value, utils);
|
ObjectImpl<SyslogLogger>::ValidateFacility(lvalue, utils);
|
||||||
|
|
||||||
if (m_FacilityMap.find(value) == m_FacilityMap.end()) {
|
if (m_FacilityMap.find(lvalue()) == m_FacilityMap.end()) {
|
||||||
try {
|
try {
|
||||||
Convert::ToLong(value);
|
Convert::ToLong(lvalue());
|
||||||
} catch (const std::exception&) {
|
} catch (const std::exception&) {
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "facility" }, "Invalid facility specified."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "facility" }, "Invalid facility specified."));
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ public:
|
||||||
static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata);
|
static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata);
|
||||||
|
|
||||||
void OnConfigLoaded() override;
|
void OnConfigLoaded() override;
|
||||||
void ValidateFacility(const String& value, const ValidationUtils& utils) override;
|
void ValidateFacility(const Lazy<String>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static std::map<String, int> m_FacilityMap;
|
static std::map<String, int> m_FacilityMap;
|
||||||
|
|
|
@ -598,12 +598,12 @@ void CompatLogger::RotationTimerHandler()
|
||||||
ScheduleNextRotation();
|
ScheduleNextRotation();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CompatLogger::ValidateRotationMethod(const String& value, const ValidationUtils& utils)
|
void CompatLogger::ValidateRotationMethod(const Lazy<String>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<CompatLogger>::ValidateRotationMethod(value, utils);
|
ObjectImpl<CompatLogger>::ValidateRotationMethod(lvalue, utils);
|
||||||
|
|
||||||
if (value != "HOURLY" && value != "DAILY" &&
|
if (lvalue() != "HOURLY" && lvalue() != "DAILY" &&
|
||||||
value != "WEEKLY" && value != "MONTHLY" && value != "NONE") {
|
lvalue() != "WEEKLY" && lvalue() != "MONTHLY" && lvalue() != "NONE") {
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "rotation_method" }, "Rotation method '" + value + "' is invalid."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "rotation_method" }, "Rotation method '" + lvalue() + "' is invalid."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ public:
|
||||||
|
|
||||||
static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata);
|
static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata);
|
||||||
|
|
||||||
void ValidateRotationMethod(const String& value, const ValidationUtils& utils) override;
|
void ValidateRotationMethod(const Lazy<String>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void Start(bool runtimeCreated) override;
|
void Start(bool runtimeCreated) override;
|
||||||
|
|
|
@ -440,19 +440,19 @@ void DbConnection::PrepareDatabase()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DbConnection::ValidateFailoverTimeout(double value, const ValidationUtils& utils)
|
void DbConnection::ValidateFailoverTimeout(const Lazy<double>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<DbConnection>::ValidateFailoverTimeout(value, utils);
|
ObjectImpl<DbConnection>::ValidateFailoverTimeout(lvalue, utils);
|
||||||
|
|
||||||
if (value < 60)
|
if (lvalue() < 60)
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "failover_timeout" }, "Failover timeout minimum is 60s."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "failover_timeout" }, "Failover timeout minimum is 60s."));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DbConnection::ValidateCategories(const Array::Ptr& value, const ValidationUtils& utils)
|
void DbConnection::ValidateCategories(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<DbConnection>::ValidateCategories(value, utils);
|
ObjectImpl<DbConnection>::ValidateCategories(lvalue, utils);
|
||||||
|
|
||||||
int filter = FilterArrayToInt(value, DbQuery::GetCategoryFilterMap(), 0);
|
int filter = FilterArrayToInt(lvalue(), DbQuery::GetCategoryFilterMap(), 0);
|
||||||
|
|
||||||
if (filter != DbCatEverything && (filter & ~(DbCatInvalid | DbCatEverything | DbCatConfig | DbCatState |
|
if (filter != DbCatEverything && (filter & ~(DbCatInvalid | DbCatEverything | DbCatConfig | DbCatState |
|
||||||
DbCatAcknowledgement | DbCatComment | DbCatDowntime | DbCatEventHandler | DbCatExternalCommand |
|
DbCatAcknowledgement | DbCatComment | DbCatDowntime | DbCatEventHandler | DbCatExternalCommand |
|
||||||
|
|
|
@ -74,8 +74,8 @@ public:
|
||||||
int GetQueryCount(RingBuffer::SizeType span);
|
int GetQueryCount(RingBuffer::SizeType span);
|
||||||
virtual int GetPendingQueryCount() const = 0;
|
virtual int GetPendingQueryCount() const = 0;
|
||||||
|
|
||||||
void ValidateFailoverTimeout(double value, const ValidationUtils& utils) final;
|
void ValidateFailoverTimeout(const Lazy<double>& lvalue, const ValidationUtils& utils) final;
|
||||||
void ValidateCategories(const Array::Ptr& value, const ValidationUtils& utils) final;
|
void ValidateCategories(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils) final;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void OnConfigLoaded() override;
|
void OnConfigLoaded() override;
|
||||||
|
|
|
@ -187,18 +187,18 @@ void Checkable::NotifyDowntimeEnd(const Downtime::Ptr& downtime)
|
||||||
OnNotificationsRequested(checkable, NotificationDowntimeEnd, checkable->GetLastCheckResult(), downtime->GetAuthor(), downtime->GetComment(), nullptr);
|
OnNotificationsRequested(checkable, NotificationDowntimeEnd, checkable->GetLastCheckResult(), downtime->GetAuthor(), downtime->GetComment(), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Checkable::ValidateCheckInterval(double value, const ValidationUtils& utils)
|
void Checkable::ValidateCheckInterval(const Lazy<double>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<Checkable>::ValidateCheckInterval(value, utils);
|
ObjectImpl<Checkable>::ValidateCheckInterval(lvalue, utils);
|
||||||
|
|
||||||
if (value <= 0)
|
if (lvalue() <= 0)
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "check_interval" }, "Interval must be greater than 0."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "check_interval" }, "Interval must be greater than 0."));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Checkable::ValidateMaxCheckAttempts(int value, const ValidationUtils& utils)
|
void Checkable::ValidateMaxCheckAttempts(const Lazy<int>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<Checkable>::ValidateMaxCheckAttempts(value, utils);
|
ObjectImpl<Checkable>::ValidateMaxCheckAttempts(lvalue, utils);
|
||||||
|
|
||||||
if (value <= 0)
|
if (lvalue() <= 0)
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "max_check_attempts" }, "Value must be greater than 0."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "max_check_attempts" }, "Value must be greater than 0."));
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,8 +191,8 @@ public:
|
||||||
void RemoveReverseDependency(const intrusive_ptr<Dependency>& dep);
|
void RemoveReverseDependency(const intrusive_ptr<Dependency>& dep);
|
||||||
std::vector<intrusive_ptr<Dependency> > GetReverseDependencies() const;
|
std::vector<intrusive_ptr<Dependency> > GetReverseDependencies() const;
|
||||||
|
|
||||||
void ValidateCheckInterval(double value, const ValidationUtils& utils) final;
|
void ValidateCheckInterval(const Lazy<double>& lvalue, const ValidationUtils& value) final;
|
||||||
void ValidateMaxCheckAttempts(int value, const ValidationUtils& utils) final;
|
void ValidateMaxCheckAttempts(const Lazy<int>& lvalue, const ValidationUtils& value) final;
|
||||||
|
|
||||||
static void IncreasePendingChecks();
|
static void IncreasePendingChecks();
|
||||||
static void DecreasePendingChecks();
|
static void DecreasePendingChecks();
|
||||||
|
|
|
@ -29,9 +29,9 @@ using namespace icinga;
|
||||||
|
|
||||||
REGISTER_TYPE(CustomVarObject);
|
REGISTER_TYPE(CustomVarObject);
|
||||||
|
|
||||||
void CustomVarObject::ValidateVars(const Dictionary::Ptr& value, const ValidationUtils& utils)
|
void CustomVarObject::ValidateVars(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
MacroProcessor::ValidateCustomVars(this, value);
|
MacroProcessor::ValidateCustomVars(this, lvalue());
|
||||||
}
|
}
|
||||||
|
|
||||||
int icinga::FilterArrayToInt(const Array::Ptr& typeFilters, const std::map<String, int>& filterMap, int defaultValue)
|
int icinga::FilterArrayToInt(const Array::Ptr& typeFilters, const std::map<String, int>& filterMap, int defaultValue)
|
||||||
|
|
|
@ -38,7 +38,7 @@ class CustomVarObject : public ObjectImpl<CustomVarObject>
|
||||||
public:
|
public:
|
||||||
DECLARE_OBJECT(CustomVarObject);
|
DECLARE_OBJECT(CustomVarObject);
|
||||||
|
|
||||||
void ValidateVars(const Dictionary::Ptr& value, const ValidationUtils& utils) final;
|
void ValidateVars(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils) final;
|
||||||
};
|
};
|
||||||
|
|
||||||
int FilterArrayToInt(const Array::Ptr& typeFilters, const std::map<String, int>& filterMap, int defaultValue);
|
int FilterArrayToInt(const Array::Ptr& typeFilters, const std::map<String, int>& filterMap, int defaultValue);
|
||||||
|
|
|
@ -209,11 +209,11 @@ TimePeriod::Ptr Dependency::GetPeriod() const
|
||||||
return TimePeriod::GetByName(GetPeriodRaw());
|
return TimePeriod::GetByName(GetPeriodRaw());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dependency::ValidateStates(const Array::Ptr& value, const ValidationUtils& utils)
|
void Dependency::ValidateStates(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<Dependency>::ValidateStates(value, utils);
|
ObjectImpl<Dependency>::ValidateStates(lvalue, utils);
|
||||||
|
|
||||||
int sfilter = FilterArrayToInt(value, Notification::GetStateFilterMap(), 0);
|
int sfilter = FilterArrayToInt(lvalue(), Notification::GetStateFilterMap(), 0);
|
||||||
|
|
||||||
if (GetParentServiceName().IsEmpty() && (sfilter & ~(StateFilterUp | StateFilterDown)) != 0)
|
if (GetParentServiceName().IsEmpty() && (sfilter & ~(StateFilterUp | StateFilterDown)) != 0)
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "states" }, "State filter is invalid for host dependency."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "states" }, "State filter is invalid for host dependency."));
|
||||||
|
|
|
@ -49,7 +49,7 @@ public:
|
||||||
|
|
||||||
bool IsAvailable(DependencyType dt) const;
|
bool IsAvailable(DependencyType dt) const;
|
||||||
|
|
||||||
void ValidateStates(const Array::Ptr& value, const ValidationUtils& utils) override;
|
void ValidateStates(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
static void EvaluateApplyRules(const intrusive_ptr<Host>& host);
|
static void EvaluateApplyRules(const intrusive_ptr<Host>& host);
|
||||||
static void EvaluateApplyRules(const intrusive_ptr<Service>& service);
|
static void EvaluateApplyRules(const intrusive_ptr<Service>& service);
|
||||||
|
|
|
@ -409,18 +409,18 @@ void Downtime::DowntimesExpireTimerHandler()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Downtime::ValidateStartTime(const Timestamp& value, const ValidationUtils& utils)
|
void Downtime::ValidateStartTime(const Lazy<Timestamp>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<Downtime>::ValidateStartTime(value, utils);
|
ObjectImpl<Downtime>::ValidateStartTime(lvalue, utils);
|
||||||
|
|
||||||
if (value <= 0)
|
if (lvalue() <= 0)
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "start_time" }, "Start time must be greater than 0."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "start_time" }, "Start time must be greater than 0."));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Downtime::ValidateEndTime(const Timestamp& value, const ValidationUtils& utils)
|
void Downtime::ValidateEndTime(const Lazy<Timestamp>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<Downtime>::ValidateEndTime(value, utils);
|
ObjectImpl<Downtime>::ValidateEndTime(lvalue, utils);
|
||||||
|
|
||||||
if (value <= 0)
|
if (lvalue() <= 0)
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "end_time" }, "End time must be greater than 0."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "end_time" }, "End time must be greater than 0."));
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,8 +70,8 @@ protected:
|
||||||
void Start(bool runtimeCreated) override;
|
void Start(bool runtimeCreated) override;
|
||||||
void Stop(bool runtimeRemoved) override;
|
void Stop(bool runtimeRemoved) override;
|
||||||
|
|
||||||
void ValidateStartTime(const Timestamp& value, const ValidationUtils& utils) override;
|
void ValidateStartTime(const Lazy<Timestamp>& lvalue, const ValidationUtils& utils) override;
|
||||||
void ValidateEndTime(const Timestamp& value, const ValidationUtils& utils) override;
|
void ValidateEndTime(const Lazy<Timestamp>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ObjectImpl<Checkable>::Ptr m_Checkable;
|
ObjectImpl<Checkable>::Ptr m_Checkable;
|
||||||
|
|
|
@ -289,7 +289,7 @@ String IcingaApplication::GetNodeName() const
|
||||||
return ScriptGlobal::Get("NodeName");
|
return ScriptGlobal::Get("NodeName");
|
||||||
}
|
}
|
||||||
|
|
||||||
void IcingaApplication::ValidateVars(const Dictionary::Ptr& value, const ValidationUtils& utils)
|
void IcingaApplication::ValidateVars(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
MacroProcessor::ValidateCustomVars(this, value);
|
MacroProcessor::ValidateCustomVars(this, lvalue());
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ public:
|
||||||
|
|
||||||
String GetNodeName() const;
|
String GetNodeName() const;
|
||||||
|
|
||||||
void ValidateVars(const Dictionary::Ptr& value, const ValidationUtils& utils) override;
|
void ValidateVars(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void DumpProgramState();
|
void DumpProgramState();
|
||||||
|
|
|
@ -642,11 +642,11 @@ void Notification::Validate(int types, const ValidationUtils& utils)
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, std::vector<String>(), "Validation failed: No users/user_groups specified."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, std::vector<String>(), "Validation failed: No users/user_groups specified."));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Notification::ValidateStates(const Array::Ptr& value, const ValidationUtils& utils)
|
void Notification::ValidateStates(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<Notification>::ValidateStates(value, utils);
|
ObjectImpl<Notification>::ValidateStates(lvalue, utils);
|
||||||
|
|
||||||
int filter = FilterArrayToInt(value, GetStateFilterMap(), 0);
|
int filter = FilterArrayToInt(lvalue(), GetStateFilterMap(), 0);
|
||||||
|
|
||||||
if (GetServiceName().IsEmpty() && (filter == -1 || (filter & ~(StateFilterUp | StateFilterDown)) != 0))
|
if (GetServiceName().IsEmpty() && (filter == -1 || (filter & ~(StateFilterUp | StateFilterDown)) != 0))
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "states" }, "State filter is invalid."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "states" }, "State filter is invalid."));
|
||||||
|
@ -655,11 +655,11 @@ void Notification::ValidateStates(const Array::Ptr& value, const ValidationUtils
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "states" }, "State filter is invalid."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "states" }, "State filter is invalid."));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Notification::ValidateTypes(const Array::Ptr& value, const ValidationUtils& utils)
|
void Notification::ValidateTypes(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<Notification>::ValidateTypes(value, utils);
|
ObjectImpl<Notification>::ValidateTypes(lvalue, utils);
|
||||||
|
|
||||||
int filter = FilterArrayToInt(value, GetTypeFilterMap(), 0);
|
int filter = FilterArrayToInt(lvalue(), GetTypeFilterMap(), 0);
|
||||||
|
|
||||||
if (filter == -1 || (filter & ~(NotificationDowntimeStart | NotificationDowntimeEnd | NotificationDowntimeRemoved |
|
if (filter == -1 || (filter & ~(NotificationDowntimeStart | NotificationDowntimeEnd | NotificationDowntimeRemoved |
|
||||||
NotificationCustom | NotificationAcknowledgement | NotificationProblem | NotificationRecovery |
|
NotificationCustom | NotificationAcknowledgement | NotificationProblem | NotificationRecovery |
|
||||||
|
|
|
@ -106,8 +106,8 @@ public:
|
||||||
|
|
||||||
void Validate(int types, const ValidationUtils& utils) override;
|
void Validate(int types, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
void ValidateStates(const Array::Ptr& value, const ValidationUtils& utils) override;
|
void ValidateStates(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils) override;
|
||||||
void ValidateTypes(const Array::Ptr& value, const ValidationUtils& utils) override;
|
void ValidateTypes(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
static void EvaluateApplyRules(const intrusive_ptr<Host>& host);
|
static void EvaluateApplyRules(const intrusive_ptr<Host>& host);
|
||||||
static void EvaluateApplyRules(const intrusive_ptr<Service>& service);
|
static void EvaluateApplyRules(const intrusive_ptr<Service>& service);
|
||||||
|
|
|
@ -196,11 +196,11 @@ void ScheduledDowntime::CreateNextDowntime()
|
||||||
GetFixed(), String(), GetDuration(), GetName(), GetName());
|
GetFixed(), String(), GetDuration(), GetName(), GetName());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScheduledDowntime::ValidateRanges(const Dictionary::Ptr& value, const ValidationUtils& utils)
|
void ScheduledDowntime::ValidateRanges(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<ScheduledDowntime>::ValidateRanges(value, utils);
|
ObjectImpl<ScheduledDowntime>::ValidateRanges(lvalue, utils);
|
||||||
|
|
||||||
if (!value)
|
if (!lvalue())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* create a fake time environment to validate the definitions */
|
/* create a fake time environment to validate the definitions */
|
||||||
|
@ -208,8 +208,8 @@ void ScheduledDowntime::ValidateRanges(const Dictionary::Ptr& value, const Valid
|
||||||
tm reference = Utility::LocalTime(refts);
|
tm reference = Utility::LocalTime(refts);
|
||||||
Array::Ptr segments = new Array();
|
Array::Ptr segments = new Array();
|
||||||
|
|
||||||
ObjectLock olock(value);
|
ObjectLock olock(lvalue());
|
||||||
for (const Dictionary::Pair& kv : value) {
|
for (const Dictionary::Pair& kv : lvalue()) {
|
||||||
try {
|
try {
|
||||||
tm begin_tm, end_tm;
|
tm begin_tm, end_tm;
|
||||||
int stride;
|
int stride;
|
||||||
|
|
|
@ -48,7 +48,7 @@ public:
|
||||||
static void EvaluateApplyRules(const intrusive_ptr<Host>& host);
|
static void EvaluateApplyRules(const intrusive_ptr<Host>& host);
|
||||||
static void EvaluateApplyRules(const intrusive_ptr<Service>& service);
|
static void EvaluateApplyRules(const intrusive_ptr<Service>& service);
|
||||||
|
|
||||||
void ValidateRanges(const Dictionary::Ptr& value, const ValidationUtils& utils) override;
|
void ValidateRanges(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void OnAllConfigLoaded() override;
|
void OnAllConfigLoaded() override;
|
||||||
|
|
|
@ -381,9 +381,9 @@ void TimePeriod::Dump()
|
||||||
Log(LogDebug, "TimePeriod", "---");
|
Log(LogDebug, "TimePeriod", "---");
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimePeriod::ValidateRanges(const Dictionary::Ptr& value, const ValidationUtils& utils)
|
void TimePeriod::ValidateRanges(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
if (!value)
|
if (!lvalue())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* create a fake time environment to validate the definitions */
|
/* create a fake time environment to validate the definitions */
|
||||||
|
@ -391,8 +391,8 @@ void TimePeriod::ValidateRanges(const Dictionary::Ptr& value, const ValidationUt
|
||||||
tm reference = Utility::LocalTime(refts);
|
tm reference = Utility::LocalTime(refts);
|
||||||
Array::Ptr segments = new Array();
|
Array::Ptr segments = new Array();
|
||||||
|
|
||||||
ObjectLock olock(value);
|
ObjectLock olock(lvalue());
|
||||||
for (const Dictionary::Pair& kv : value) {
|
for (const Dictionary::Pair& kv : lvalue()) {
|
||||||
try {
|
try {
|
||||||
tm begin_tm, end_tm;
|
tm begin_tm, end_tm;
|
||||||
int stride;
|
int stride;
|
||||||
|
|
|
@ -46,7 +46,7 @@ public:
|
||||||
bool IsInside(double ts) const;
|
bool IsInside(double ts) const;
|
||||||
double FindNextTransition(double begin);
|
double FindNextTransition(double begin);
|
||||||
|
|
||||||
void ValidateRanges(const Dictionary::Ptr& value, const ValidationUtils& utils) override;
|
void ValidateRanges(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void AddSegment(double s, double end);
|
void AddSegment(double s, double end);
|
||||||
|
|
|
@ -97,21 +97,21 @@ TimePeriod::Ptr User::GetPeriod() const
|
||||||
return TimePeriod::GetByName(GetPeriodRaw());
|
return TimePeriod::GetByName(GetPeriodRaw());
|
||||||
}
|
}
|
||||||
|
|
||||||
void User::ValidateStates(const Array::Ptr& value, const ValidationUtils& utils)
|
void User::ValidateStates(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<User>::ValidateStates(value, utils);
|
ObjectImpl<User>::ValidateStates(lvalue, utils);
|
||||||
|
|
||||||
int filter = FilterArrayToInt(value, Notification::GetStateFilterMap(), 0);
|
int filter = FilterArrayToInt(lvalue(), Notification::GetStateFilterMap(), 0);
|
||||||
|
|
||||||
if (filter == -1 || (filter & ~(StateFilterUp | StateFilterDown | StateFilterOK | StateFilterWarning | StateFilterCritical | StateFilterUnknown)) != 0)
|
if (filter == -1 || (filter & ~(StateFilterUp | StateFilterDown | StateFilterOK | StateFilterWarning | StateFilterCritical | StateFilterUnknown)) != 0)
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "states" }, "State filter is invalid."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "states" }, "State filter is invalid."));
|
||||||
}
|
}
|
||||||
|
|
||||||
void User::ValidateTypes(const Array::Ptr& value, const ValidationUtils& utils)
|
void User::ValidateTypes(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<User>::ValidateTypes(value, utils);
|
ObjectImpl<User>::ValidateTypes(lvalue, utils);
|
||||||
|
|
||||||
int filter = FilterArrayToInt(value, Notification::GetTypeFilterMap(), 0);
|
int filter = FilterArrayToInt(lvalue(), Notification::GetTypeFilterMap(), 0);
|
||||||
|
|
||||||
if (filter == -1 || (filter & ~(NotificationDowntimeStart | NotificationDowntimeEnd | NotificationDowntimeRemoved |
|
if (filter == -1 || (filter & ~(NotificationDowntimeStart | NotificationDowntimeEnd | NotificationDowntimeRemoved |
|
||||||
NotificationCustom | NotificationAcknowledgement | NotificationProblem | NotificationRecovery |
|
NotificationCustom | NotificationAcknowledgement | NotificationProblem | NotificationRecovery |
|
||||||
|
|
|
@ -44,8 +44,8 @@ public:
|
||||||
/* Notifications */
|
/* Notifications */
|
||||||
TimePeriod::Ptr GetPeriod() const;
|
TimePeriod::Ptr GetPeriod() const;
|
||||||
|
|
||||||
void ValidateStates(const Array::Ptr& value, const ValidationUtils& utils) override;
|
void ValidateStates(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils) override;
|
||||||
void ValidateTypes(const Array::Ptr& value, const ValidationUtils& utils) override;
|
void ValidateTypes(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void Stop(bool runtimeRemoved) override;
|
void Stop(bool runtimeRemoved) override;
|
||||||
|
|
|
@ -220,10 +220,10 @@ void LivestatusListener::ClientHandler(const Socket::Ptr& client)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LivestatusListener::ValidateSocketType(const String& value, const ValidationUtils& utils)
|
void LivestatusListener::ValidateSocketType(const Lazy<String>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<LivestatusListener>::ValidateSocketType(value, utils);
|
ObjectImpl<LivestatusListener>::ValidateSocketType(lvalue, utils);
|
||||||
|
|
||||||
if (value != "unix" && value != "tcp")
|
if (lvalue() != "unix" && lvalue() != "tcp")
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "socket_type" }, "Socket type '" + value + "' is invalid."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "socket_type" }, "Socket type '" + lvalue() + "' is invalid."));
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ public:
|
||||||
static int GetClientsConnected();
|
static int GetClientsConnected();
|
||||||
static int GetConnections();
|
static int GetConnections();
|
||||||
|
|
||||||
void ValidateSocketType(const String& value, const ValidationUtils& utils) override;
|
void ValidateSocketType(const Lazy<String>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void Start(bool runtimeCreated) override;
|
void Start(bool runtimeCreated) override;
|
||||||
|
|
|
@ -342,18 +342,18 @@ Value GraphiteWriter::EscapeMacroMetric(const Value& value)
|
||||||
return EscapeMetric(value);
|
return EscapeMetric(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphiteWriter::ValidateHostNameTemplate(const String& value, const ValidationUtils& utils)
|
void GraphiteWriter::ValidateHostNameTemplate(const Lazy<String>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<GraphiteWriter>::ValidateHostNameTemplate(value, utils);
|
ObjectImpl<GraphiteWriter>::ValidateHostNameTemplate(lvalue, utils);
|
||||||
|
|
||||||
if (!MacroProcessor::ValidateMacroString(value))
|
if (!MacroProcessor::ValidateMacroString(lvalue()))
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "host_name_template" }, "Closing $ not found in macro format string '" + value + "'."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "host_name_template" }, "Closing $ not found in macro format string '" + lvalue() + "'."));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphiteWriter::ValidateServiceNameTemplate(const String& value, const ValidationUtils& utils)
|
void GraphiteWriter::ValidateServiceNameTemplate(const Lazy<String>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<GraphiteWriter>::ValidateServiceNameTemplate(value, utils);
|
ObjectImpl<GraphiteWriter>::ValidateServiceNameTemplate(lvalue, utils);
|
||||||
|
|
||||||
if (!MacroProcessor::ValidateMacroString(value))
|
if (!MacroProcessor::ValidateMacroString(lvalue()))
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "service_name_template" }, "Closing $ not found in macro format string '" + value + "'."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "service_name_template" }, "Closing $ not found in macro format string '" + lvalue() + "'."));
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,8 +44,8 @@ public:
|
||||||
|
|
||||||
static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata);
|
static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata);
|
||||||
|
|
||||||
void ValidateHostNameTemplate(const String& value, const ValidationUtils& utils) override;
|
void ValidateHostNameTemplate(const Lazy<String>& lvalue, const ValidationUtils& utils) override;
|
||||||
void ValidateServiceNameTemplate(const String& value, const ValidationUtils& utils) override;
|
void ValidateServiceNameTemplate(const Lazy<String>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void OnConfigLoaded() override;
|
void OnConfigLoaded() override;
|
||||||
|
|
|
@ -494,15 +494,15 @@ void InfluxdbWriter::Flush()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InfluxdbWriter::ValidateHostTemplate(const Dictionary::Ptr& value, const ValidationUtils& utils)
|
void InfluxdbWriter::ValidateHostTemplate(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<InfluxdbWriter>::ValidateHostTemplate(value, utils);
|
ObjectImpl<InfluxdbWriter>::ValidateHostTemplate(lvalue, utils);
|
||||||
|
|
||||||
String measurement = value->Get("measurement");
|
String measurement = lvalue()->Get("measurement");
|
||||||
if (!MacroProcessor::ValidateMacroString(measurement))
|
if (!MacroProcessor::ValidateMacroString(measurement))
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "host_template", "measurement" }, "Closing $ not found in macro format string '" + measurement + "'."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "host_template", "measurement" }, "Closing $ not found in macro format string '" + measurement + "'."));
|
||||||
|
|
||||||
Dictionary::Ptr tags = value->Get("tags");
|
Dictionary::Ptr tags = lvalue()->Get("tags");
|
||||||
if (tags) {
|
if (tags) {
|
||||||
ObjectLock olock(tags);
|
ObjectLock olock(tags);
|
||||||
for (const Dictionary::Pair& pair : tags) {
|
for (const Dictionary::Pair& pair : tags) {
|
||||||
|
@ -512,15 +512,15 @@ void InfluxdbWriter::ValidateHostTemplate(const Dictionary::Ptr& value, const Va
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InfluxdbWriter::ValidateServiceTemplate(const Dictionary::Ptr& value, const ValidationUtils& utils)
|
void InfluxdbWriter::ValidateServiceTemplate(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<InfluxdbWriter>::ValidateServiceTemplate(value, utils);
|
ObjectImpl<InfluxdbWriter>::ValidateServiceTemplate(lvalue, utils);
|
||||||
|
|
||||||
String measurement = value->Get("measurement");
|
String measurement = lvalue()->Get("measurement");
|
||||||
if (!MacroProcessor::ValidateMacroString(measurement))
|
if (!MacroProcessor::ValidateMacroString(measurement))
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "service_template", "measurement" }, "Closing $ not found in macro format string '" + measurement + "'."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "service_template", "measurement" }, "Closing $ not found in macro format string '" + measurement + "'."));
|
||||||
|
|
||||||
Dictionary::Ptr tags = value->Get("tags");
|
Dictionary::Ptr tags = lvalue()->Get("tags");
|
||||||
if (tags) {
|
if (tags) {
|
||||||
ObjectLock olock(tags);
|
ObjectLock olock(tags);
|
||||||
for (const Dictionary::Pair& pair : tags) {
|
for (const Dictionary::Pair& pair : tags) {
|
||||||
|
|
|
@ -44,8 +44,8 @@ public:
|
||||||
|
|
||||||
static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata);
|
static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata);
|
||||||
|
|
||||||
void ValidateHostTemplate(const Dictionary::Ptr& value, const ValidationUtils& utils) override;
|
void ValidateHostTemplate(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils) override;
|
||||||
void ValidateServiceTemplate(const Dictionary::Ptr& value, const ValidationUtils& utils) override;
|
void ValidateServiceTemplate(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void OnConfigLoaded() override;
|
void OnConfigLoaded() override;
|
||||||
|
|
|
@ -158,18 +158,18 @@ void PerfdataWriter::RotationTimerHandler()
|
||||||
RotateFile(m_HostOutputFile, GetHostTempPath(), GetHostPerfdataPath());
|
RotateFile(m_HostOutputFile, GetHostTempPath(), GetHostPerfdataPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
void PerfdataWriter::ValidateHostFormatTemplate(const String& value, const ValidationUtils& utils)
|
void PerfdataWriter::ValidateHostFormatTemplate(const Lazy<String>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<PerfdataWriter>::ValidateHostFormatTemplate(value, utils);
|
ObjectImpl<PerfdataWriter>::ValidateHostFormatTemplate(lvalue, utils);
|
||||||
|
|
||||||
if (!MacroProcessor::ValidateMacroString(value))
|
if (!MacroProcessor::ValidateMacroString(lvalue()))
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "host_format_template" }, "Closing $ not found in macro format string '" + value + "'."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "host_format_template" }, "Closing $ not found in macro format string '" + lvalue() + "'."));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PerfdataWriter::ValidateServiceFormatTemplate(const String& value, const ValidationUtils& utils)
|
void PerfdataWriter::ValidateServiceFormatTemplate(const Lazy<String>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<PerfdataWriter>::ValidateServiceFormatTemplate(value, utils);
|
ObjectImpl<PerfdataWriter>::ValidateServiceFormatTemplate(lvalue, utils);
|
||||||
|
|
||||||
if (!MacroProcessor::ValidateMacroString(value))
|
if (!MacroProcessor::ValidateMacroString(lvalue()))
|
||||||
BOOST_THROW_EXCEPTION(ValidationError(this, { "service_format_template" }, "Closing $ not found in macro format string '" + value + "'."));
|
BOOST_THROW_EXCEPTION(ValidationError(this, { "service_format_template" }, "Closing $ not found in macro format string '" + lvalue() + "'."));
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,8 +42,8 @@ public:
|
||||||
|
|
||||||
static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata);
|
static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata);
|
||||||
|
|
||||||
void ValidateHostFormatTemplate(const String& value, const ValidationUtils& utils) override;
|
void ValidateHostFormatTemplate(const Lazy<String>& lvalue, const ValidationUtils& utils) override;
|
||||||
void ValidateServiceFormatTemplate(const String& value, const ValidationUtils& utils) override;
|
void ValidateServiceFormatTemplate(const Lazy<String>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void Start(bool runtimeCreated) override;
|
void Start(bool runtimeCreated) override;
|
||||||
|
|
|
@ -1399,14 +1399,14 @@ Endpoint::Ptr ApiListener::GetLocalEndpoint() const
|
||||||
return m_LocalEndpoint;
|
return m_LocalEndpoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApiListener::ValidateTlsProtocolmin(const String& value, const ValidationUtils& utils)
|
void ApiListener::ValidateTlsProtocolmin(const Lazy<String>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<ApiListener>::ValidateTlsProtocolmin(value, utils);
|
ObjectImpl<ApiListener>::ValidateTlsProtocolmin(lvalue, utils);
|
||||||
|
|
||||||
if (value != SSL_TXT_TLSV1
|
if (lvalue() != SSL_TXT_TLSV1
|
||||||
#ifdef SSL_TXT_TLSV1_1
|
#ifdef SSL_TXT_TLSV1_1
|
||||||
&& value != SSL_TXT_TLSV1_1 &&
|
&& lvalue() != SSL_TXT_TLSV1_1 &&
|
||||||
value != SSL_TXT_TLSV1_2
|
lvalue() != SSL_TXT_TLSV1_2
|
||||||
#endif /* SSL_TXT_TLSV1_1 */
|
#endif /* SSL_TXT_TLSV1_1 */
|
||||||
) {
|
) {
|
||||||
String message = "Invalid TLS version. Must be one of '" SSL_TXT_TLSV1 "'";
|
String message = "Invalid TLS version. Must be one of '" SSL_TXT_TLSV1 "'";
|
||||||
|
|
|
@ -114,7 +114,7 @@ protected:
|
||||||
void Start(bool runtimeCreated) override;
|
void Start(bool runtimeCreated) override;
|
||||||
void Stop(bool runtimeDeleted) override;
|
void Stop(bool runtimeDeleted) override;
|
||||||
|
|
||||||
void ValidateTlsProtocolmin(const String& value, const ValidationUtils& utils) override;
|
void ValidateTlsProtocolmin(const Lazy<String>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<SSL_CTX> m_SSLContext;
|
std::shared_ptr<SSL_CTX> m_SSLContext;
|
||||||
|
|
|
@ -144,11 +144,11 @@ Zone::Ptr Zone::GetLocalZone()
|
||||||
return local->GetZone();
|
return local->GetZone();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Zone::ValidateEndpointsRaw(const Array::Ptr& value, const ValidationUtils& utils)
|
void Zone::ValidateEndpointsRaw(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils)
|
||||||
{
|
{
|
||||||
ObjectImpl<Zone>::ValidateEndpointsRaw(value, utils);
|
ObjectImpl<Zone>::ValidateEndpointsRaw(lvalue, utils);
|
||||||
|
|
||||||
if (value && value->GetLength() > 2) {
|
if (lvalue() && lvalue()->GetLength() > 2) {
|
||||||
Log(LogWarning, "Zone")
|
Log(LogWarning, "Zone")
|
||||||
<< "The Zone object '" << GetName() << "' has more than two endpoints."
|
<< "The Zone object '" << GetName() << "' has more than two endpoints."
|
||||||
<< " Due to a known issue this type of configuration is strongly"
|
<< " Due to a known issue this type of configuration is strongly"
|
||||||
|
|
|
@ -50,7 +50,7 @@ public:
|
||||||
static Zone::Ptr GetLocalZone();
|
static Zone::Ptr GetLocalZone();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void ValidateEndpointsRaw(const Array::Ptr& value, const ValidationUtils& utils) override;
|
void ValidateEndpointsRaw(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Zone::Ptr m_Parent;
|
Zone::Ptr m_Parent;
|
||||||
|
|
|
@ -470,53 +470,56 @@ void ClassCompiler::HandleClass(const Klass& klass, const ClassDebugInfo&)
|
||||||
|
|
||||||
for (const Field& field : klass.Fields) {
|
for (const Field& field : klass.Fields) {
|
||||||
m_Impl << "\t" << "if (" << (field.Attributes & (FAEphemeral|FAConfig|FAState)) << " & types)" << std::endl
|
m_Impl << "\t" << "if (" << (field.Attributes & (FAEphemeral|FAConfig|FAState)) << " & types)" << std::endl
|
||||||
<< "\t\t" << "Validate" << field.GetFriendlyName() << "(Get" << field.GetFriendlyName() << "(), utils);" << std::endl;
|
<< "\t\t" << "Validate" << field.GetFriendlyName() << "(Lazy<" << field.Type.GetRealType() << ">([this]() { return Get" << field.GetFriendlyName() << "(); }), utils);" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Impl << "}" << std::endl << std::endl;
|
m_Impl << "}" << std::endl << std::endl;
|
||||||
|
|
||||||
for (const Field& field : klass.Fields) {
|
for (const Field& field : klass.Fields) {
|
||||||
std::string argName;
|
std::string argName, valName;
|
||||||
|
|
||||||
if (field.Type.ArrayRank > 0)
|
if (field.Type.ArrayRank > 0) {
|
||||||
argName = "avalue";
|
argName = "avalue";
|
||||||
else
|
valName = "value";
|
||||||
|
} else {
|
||||||
argName = "value";
|
argName = "value";
|
||||||
|
valName = "value()";
|
||||||
|
}
|
||||||
|
|
||||||
m_Header << "\t" << "void SimpleValidate" << field.GetFriendlyName() << "(" << field.Type.GetArgumentType() << " " << argName << ", const ValidationUtils& utils);" << std::endl;
|
m_Header << "\t" << "void SimpleValidate" << field.GetFriendlyName() << "(const Lazy<" << field.Type.GetRealType() << ">& " << argName << ", const ValidationUtils& utils);" << std::endl;
|
||||||
|
|
||||||
m_Impl << "void ObjectImpl<" << klass.Name << ">::SimpleValidate" << field.GetFriendlyName() << "(" << field.Type.GetArgumentType() << " " << argName << ", const ValidationUtils& utils)" << std::endl
|
m_Impl << "void ObjectImpl<" << klass.Name << ">::SimpleValidate" << field.GetFriendlyName() << "(const Lazy<" << field.Type.GetRealType() << ">& " << argName << ", const ValidationUtils& utils)" << std::endl
|
||||||
<< "{" << std::endl;
|
<< "{" << std::endl;
|
||||||
|
|
||||||
if (field.Attributes & FARequired) {
|
if (field.Attributes & FARequired) {
|
||||||
if (field.Type.GetRealType().find("::Ptr") != std::string::npos)
|
if (field.Type.GetRealType().find("::Ptr") != std::string::npos)
|
||||||
m_Impl << "\t" << "if (!" << argName << ")" << std::endl;
|
m_Impl << "\t" << "if (!" << argName << "())" << std::endl;
|
||||||
else
|
else
|
||||||
m_Impl << "\t" << "if (" << argName << ".IsEmpty())" << std::endl;
|
m_Impl << "\t" << "if (" << argName << "().IsEmpty())" << std::endl;
|
||||||
|
|
||||||
m_Impl << "\t\t" << "BOOST_THROW_EXCEPTION(ValidationError(dynamic_cast<ConfigObject *>(this), { \"" << field.Name << R"(" }, "Attribute must not be empty."));)" << std::endl << std::endl;
|
m_Impl << "\t\t" << "BOOST_THROW_EXCEPTION(ValidationError(dynamic_cast<ConfigObject *>(this), { \"" << field.Name << R"(" }, "Attribute must not be empty."));)" << std::endl << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (field.Attributes & FADeprecated) {
|
if (field.Attributes & FADeprecated) {
|
||||||
if (field.Type.GetRealType().find("::Ptr") != std::string::npos)
|
if (field.Type.GetRealType().find("::Ptr") != std::string::npos)
|
||||||
m_Impl << "\t" << "if (" << argName << ")" << std::endl;
|
m_Impl << "\t" << "if (" << argName << "())" << std::endl;
|
||||||
else
|
else
|
||||||
m_Impl << "\t" << "if (" << argName << " != GetDefault" << field.GetFriendlyName() << "())" << std::endl;
|
m_Impl << "\t" << "if (" << argName << "() != GetDefault" << field.GetFriendlyName() << "())" << std::endl;
|
||||||
|
|
||||||
m_Impl << "\t\t" << "Log(LogWarning, \"" << klass.Name << "\") << \"Attribute '" << field.Name << R"(' for object '" << dynamic_cast<ConfigObject *>(this)->GetName() << "' of type '" << dynamic_cast<ConfigObject *>(this)->GetReflectionType()->GetName() << "' is deprecated and should not be used.";)" << std::endl;
|
m_Impl << "\t\t" << "Log(LogWarning, \"" << klass.Name << "\") << \"Attribute '" << field.Name << R"(' for object '" << dynamic_cast<ConfigObject *>(this)->GetName() << "' of type '" << dynamic_cast<ConfigObject *>(this)->GetReflectionType()->GetName() << "' is deprecated and should not be used.";)" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (field.Type.ArrayRank > 0) {
|
if (field.Type.ArrayRank > 0) {
|
||||||
m_Impl << "\t" << "if (avalue) {" << std::endl
|
m_Impl << "\t" << "if (avalue()) {" << std::endl
|
||||||
<< "\t\t" << "ObjectLock olock(avalue);" << std::endl
|
<< "\t\t" << "ObjectLock olock(avalue());" << std::endl
|
||||||
<< "\t\t" << "for (const Value& value : avalue) {" << std::endl;
|
<< "\t\t" << "for (const Value& value : avalue()) {" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ftype = FieldTypeToIcingaName(field, true);
|
std::string ftype = FieldTypeToIcingaName(field, true);
|
||||||
|
|
||||||
if (ftype == "Value") {
|
if (ftype == "Value") {
|
||||||
m_Impl << "\t" << "if (value.IsObjectType<Function>()) {" << std::endl
|
m_Impl << "\t" << "if (" << valName << ".IsObjectType<Function>()) {" << std::endl
|
||||||
<< "\t\t" << "Function::Ptr func = value;" << std::endl
|
<< "\t\t" << "Function::Ptr func = " << valName << ";" << std::endl
|
||||||
<< "\t\t" << "if (func->IsDeprecated())" << std::endl
|
<< "\t\t" << "if (func->IsDeprecated())" << std::endl
|
||||||
<< "\t\t\t" << "Log(LogWarning, \"" << klass.Name << "\") << \"Attribute '" << field.Name << R"(' for object '" << dynamic_cast<ConfigObject *>(this)->GetName() << "' of type '" << dynamic_cast<ConfigObject *>(this)->GetReflectionType()->GetName() << "' is set to a deprecated function: " << func->GetName();)" << std::endl
|
<< "\t\t\t" << "Log(LogWarning, \"" << klass.Name << "\") << \"Attribute '" << field.Name << R"(' for object '" << dynamic_cast<ConfigObject *>(this)->GetName() << "' of type '" << dynamic_cast<ConfigObject *>(this)->GetReflectionType()->GetName() << "' is set to a deprecated function: " << func->GetName();)" << std::endl
|
||||||
<< "\t" << "}" << std::endl << std::endl;
|
<< "\t" << "}" << std::endl << std::endl;
|
||||||
|
@ -526,18 +529,18 @@ void ClassCompiler::HandleClass(const Klass& klass, const ClassDebugInfo&)
|
||||||
m_Impl << "\t" << "if (";
|
m_Impl << "\t" << "if (";
|
||||||
|
|
||||||
if (field.Type.ArrayRank > 0)
|
if (field.Type.ArrayRank > 0)
|
||||||
m_Impl << "value.IsEmpty() || ";
|
m_Impl << valName << ".IsEmpty() || ";
|
||||||
else
|
else
|
||||||
m_Impl << "!value.IsEmpty() && ";
|
m_Impl << "!" << valName << ".IsEmpty() && ";
|
||||||
|
|
||||||
m_Impl << "!utils.ValidateName(\"" << field.Type.TypeName << "\", value))" << std::endl
|
m_Impl << "!utils.ValidateName(\"" << field.Type.TypeName << "\", " << valName << "))" << std::endl
|
||||||
<< "\t\t" << "BOOST_THROW_EXCEPTION(ValidationError(dynamic_cast<ConfigObject *>(this), { \"" << field.Name << R"(" }, "Object '" + value + "' of type ')" << field.Type.TypeName
|
<< "\t\t" << "BOOST_THROW_EXCEPTION(ValidationError(dynamic_cast<ConfigObject *>(this), { \"" << field.Name << R"(" }, "Object '" + )" << valName << R"( + "' of type ')" << field.Type.TypeName
|
||||||
<< "' does not exist.\"));" << std::endl;
|
<< "' does not exist.\"));" << std::endl;
|
||||||
} else if (field.Type.ArrayRank > 0 && (ftype == "Number" || ftype == "Boolean")) {
|
} else if (field.Type.ArrayRank > 0 && (ftype == "Number" || ftype == "Boolean")) {
|
||||||
m_Impl << "\t" << "try {" << std::endl
|
m_Impl << "\t" << "try {" << std::endl
|
||||||
<< "\t\t" << "Convert::ToDouble(value);" << std::endl
|
<< "\t\t" << "Convert::ToDouble(" << valName << ");" << std::endl
|
||||||
<< "\t" << "} catch (const std::invalid_argument&) {" << std::endl
|
<< "\t" << "} catch (const std::invalid_argument&) {" << std::endl
|
||||||
<< "\t\t" << "BOOST_THROW_EXCEPTION(ValidationError(dynamic_cast<ConfigObject *>(this), { \"" << field.Name << R"(", "Array element '" + value + "' of type '" + value.GetReflectionType()->GetName() + "' is not valid here; expected type ')" << ftype << "'.\"));" << std::endl
|
<< "\t\t" << "BOOST_THROW_EXCEPTION(ValidationError(dynamic_cast<ConfigObject *>(this), { \"" << field.Name << R"(", "Array element '" + " << valName << " + "' of type '" + " << valName << ".GetReflectionType()->GetName() + "' is not valid here; expected type ')" << ftype << "'.\"));" << std::endl
|
||||||
<< "\t" << "}" << std::endl;
|
<< "\t" << "}" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -649,14 +652,14 @@ void ClassCompiler::HandleClass(const Klass& klass, const ClassDebugInfo&)
|
||||||
|
|
||||||
/* ValidateField */
|
/* ValidateField */
|
||||||
m_Header << "public:" << std::endl
|
m_Header << "public:" << std::endl
|
||||||
<< "\t" << "void ValidateField(int id, const Value& value, const ValidationUtils& utils) override;" << std::endl;
|
<< "\t" << "void ValidateField(int id, const Lazy<Value>& lvalue, const ValidationUtils& utils) override;" << std::endl;
|
||||||
|
|
||||||
m_Impl << "void ObjectImpl<" << klass.Name << ">::ValidateField(int id, const Value& value, const ValidationUtils& utils)" << std::endl
|
m_Impl << "void ObjectImpl<" << klass.Name << ">::ValidateField(int id, const Lazy<Value>& lvalue, const ValidationUtils& utils)" << std::endl
|
||||||
<< "{" << std::endl;
|
<< "{" << std::endl;
|
||||||
|
|
||||||
if (!klass.Parent.empty())
|
if (!klass.Parent.empty())
|
||||||
m_Impl << "\t" << "int real_id = id - " << klass.Parent << "::TypeInstance->GetFieldCount(); " << std::endl
|
m_Impl << "\t" << "int real_id = id - " << klass.Parent << "::TypeInstance->GetFieldCount(); " << std::endl
|
||||||
<< "\t" << "if (real_id < 0) { " << klass.Parent << "::ValidateField(id, value, utils); return; }" << std::endl;
|
<< "\t" << "if (real_id < 0) { " << klass.Parent << "::ValidateField(id, lvalue, utils); return; }" << std::endl;
|
||||||
|
|
||||||
m_Impl << "\t" << "switch (";
|
m_Impl << "\t" << "switch (";
|
||||||
|
|
||||||
|
@ -673,9 +676,9 @@ void ClassCompiler::HandleClass(const Klass& klass, const ClassDebugInfo&)
|
||||||
<< "\t\t\t" << "Validate" << field.GetFriendlyName() << "(";
|
<< "\t\t\t" << "Validate" << field.GetFriendlyName() << "(";
|
||||||
|
|
||||||
if (field.Attributes & FAEnum)
|
if (field.Attributes & FAEnum)
|
||||||
m_Impl << "static_cast<" << field.Type.GetRealType() << ">(static_cast<int>(";
|
m_Impl << "static_cast<Lazy<" << field.Type.GetRealType() << "> >(static_cast<Lazy<int> >(";
|
||||||
|
|
||||||
m_Impl << "value";
|
m_Impl << "lvalue";
|
||||||
|
|
||||||
if (field.Attributes & FAEnum)
|
if (field.Attributes & FAEnum)
|
||||||
m_Impl << "))";
|
m_Impl << "))";
|
||||||
|
@ -1039,7 +1042,7 @@ void ClassCompiler::HandleClass(const Klass& klass, const ClassDebugInfo&)
|
||||||
/* validators */
|
/* validators */
|
||||||
for (const Field& field : klass.Fields) {
|
for (const Field& field : klass.Fields) {
|
||||||
m_Header << "protected:" << std::endl
|
m_Header << "protected:" << std::endl
|
||||||
<< "\t" << "virtual void Validate" << field.GetFriendlyName() << "(" << field.Type.GetArgumentType() << " value, const ValidationUtils& utils);" << std::endl;
|
<< "\t" << "virtual void Validate" << field.GetFriendlyName() << "(const Lazy<" << field.Type.GetRealType() << ">& lvalue, const ValidationUtils& utils);" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* instance variables */
|
/* instance variables */
|
||||||
|
@ -1144,7 +1147,7 @@ void ClassCompiler::CodeGenValidator(const std::string& name, const std::string&
|
||||||
<< "\t\t\t" << "if (utils.ValidateName(\"" << rule.Type << "\", value))" << std::endl
|
<< "\t\t\t" << "if (utils.ValidateName(\"" << rule.Type << "\", value))" << std::endl
|
||||||
<< "\t\t\t\t" << "return;" << std::endl
|
<< "\t\t\t\t" << "return;" << std::endl
|
||||||
<< "\t\t\t" << "else" << std::endl
|
<< "\t\t\t" << "else" << std::endl
|
||||||
<< "\t\t\t\t" << R"(BOOST_THROW_EXCEPTION(ValidationError(dynamic_pointer_cast<ConfigObject>(object), location, "Object '" + value + "' of type ')" << rule.Type << "' does not exist.\"));" << std::endl
|
<< "\t\t\t\t" << R"(BOOST_THROW_EXCEPTION(ValidationError(dynamic_pointer_cast<ConfigObject>(object), location, "Object '" + ")" << "xxx" << R"( + "' of type ')" << rule.Type << "' does not exist.\"));" << std::endl
|
||||||
<< "\t\t" << "}" << std::endl;
|
<< "\t\t" << "}" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1309,12 +1312,12 @@ void ClassCompiler::HandleValidator(const Validator& validator, const ClassDebug
|
||||||
CodeGenValidator(it.first.first + it.first.second, it.first.first, validator.Rules, it.second.Name, it.second.Type, ValidatorField);
|
CodeGenValidator(it.first.first + it.first.second, it.first.first, validator.Rules, it.second.Name, it.second.Type, ValidatorField);
|
||||||
|
|
||||||
for (const auto& it : m_MissingValidators) {
|
for (const auto& it : m_MissingValidators) {
|
||||||
m_Impl << "void ObjectImpl<" << it.first.first << ">::Validate" << it.first.second << "(" << it.second.Type.GetArgumentType() << " value, const ValidationUtils& utils)" << std::endl
|
m_Impl << "void ObjectImpl<" << it.first.first << ">::Validate" << it.first.second << "(const Lazy<" << it.second.Type.GetRealType() << ">& lvalue, const ValidationUtils& utils)" << std::endl
|
||||||
<< "{" << std::endl
|
<< "{" << std::endl
|
||||||
<< "\t" << "SimpleValidate" << it.first.second << "(value, utils);" << std::endl
|
<< "\t" << "SimpleValidate" << it.first.second << "(lvalue, utils);" << std::endl
|
||||||
<< "\t" << "std::vector<String> location;" << std::endl
|
<< "\t" << "std::vector<String> location;" << std::endl
|
||||||
<< "\t" << "location.emplace_back(\"" << it.second.Name << "\");" << std::endl
|
<< "\t" << "location.emplace_back(\"" << it.second.Name << "\");" << std::endl
|
||||||
<< "\t" << "TIValidate" << it.first.first << it.first.second << "(this, value, location, utils);" << std::endl
|
<< "\t" << "TIValidate" << it.first.first << it.first.second << "(this, lvalue(), location, utils);" << std::endl
|
||||||
<< "\t" << "location.pop_back();" << std::endl
|
<< "\t" << "location.pop_back();" << std::endl
|
||||||
<< "}" << std::endl << std::endl;
|
<< "}" << std::endl << std::endl;
|
||||||
}
|
}
|
||||||
|
@ -1325,9 +1328,9 @@ void ClassCompiler::HandleValidator(const Validator& validator, const ClassDebug
|
||||||
void ClassCompiler::HandleMissingValidators()
|
void ClassCompiler::HandleMissingValidators()
|
||||||
{
|
{
|
||||||
for (const auto& it : m_MissingValidators) {
|
for (const auto& it : m_MissingValidators) {
|
||||||
m_Impl << "void ObjectImpl<" << it.first.first << ">::Validate" << it.first.second << "(" << it.second.Type.GetArgumentType() << " value, const ValidationUtils& utils)" << std::endl
|
m_Impl << "void ObjectImpl<" << it.first.first << ">::Validate" << it.first.second << "(const Lazy<" << it.second.Type.GetRealType() << ">& lvalue, const ValidationUtils& utils)" << std::endl
|
||||||
<< "{" << std::endl
|
<< "{" << std::endl
|
||||||
<< "\t" << "SimpleValidate" << it.first.second << "(value, utils);" << std::endl
|
<< "\t" << "SimpleValidate" << it.first.second << "(lvalue, utils);" << std::endl
|
||||||
<< "}" << std::endl << std::endl;
|
<< "}" << std::endl << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue