24 #include "cafFieldValidator.h"
25 #include "cafTypedField.h"
27 #include "cafAssert.h"
28 #include "cafDataFieldAccessor.h"
30 #include "cafLogger.h"
44 template <
typename DataType>
52 : m_fieldDataAccessor( std::make_unique<DirectStorageAccessor>() )
58 explicit Field(
const DataType& fieldValue )
59 : m_fieldDataAccessor( std::make_unique<DirectStorageAccessor>( fieldValue ) )
63 Field( std::unique_ptr<DataAccessor> accessor )
64 : m_fieldDataAccessor( std::move( accessor ) )
68 ~
Field() noexcept
override {}
72 Field& operator=(
const Field& other ) =
delete;
74 Field& operator=(
const DataType& fieldValue )
76 this->setValue( fieldValue );
82 DataType value()
const override
84 CAFFA_ASSERT( this->isInitialized() );
88 return m_fieldDataAccessor->value();
90 catch (
const std::exception& e )
92 std::string errorMessage =
"Failed to get value for '" + this->keyword() +
"': " + e.what();
93 CAFFA_ERROR( errorMessage );
94 throw std::runtime_error( errorMessage );
97 void setValue(
const DataType& fieldValue )
override
99 CAFFA_ASSERT( this->isInitialized() );
103 for (
const auto& validator : m_valueValidators )
105 if (
auto [status, message] = validator->validate( fieldValue ); !status )
107 CAFFA_ASSERT( !message.empty() );
108 if ( validator->failureSeverity() == FieldValidatorInterface::FailureSeverity::VALIDATOR_ERROR ||
109 validator->failureSeverity() == FieldValidatorInterface::FailureSeverity::VALIDATOR_CRITICAL )
111 throw std::runtime_error( message );
115 CAFFA_WARNING( message );
119 m_fieldDataAccessor->setValue( fieldValue );
121 catch (
const std::exception& e )
123 std::string errorMessage =
"Failed to set value for '" + this->keyword() +
"': " + e.what();
124 CAFFA_ERROR( errorMessage );
125 throw std::runtime_error( errorMessage );
132 operator DataType()
const
134 CAFFA_ASSERT( m_fieldDataAccessor );
135 return this->value();
137 DataType operator()()
const
139 CAFFA_ASSERT( m_fieldDataAccessor );
140 return this->value();
142 DataType operator*()
const
144 CAFFA_ASSERT( m_fieldDataAccessor );
145 return this->value();
148 auto operator<=>(
const DataType& fieldValue )
const {
return this->value() <=> fieldValue; }
151 void setAccessor( std::unique_ptr<DataAccessor> accessor ) { m_fieldDataAccessor = std::move( accessor ); }
153 void setUntypedAccessor( std::unique_ptr<DataFieldAccessorInterface> accessor )
override
155 CAFFA_ASSERT(
dynamic_cast<DataAccessor*
>( accessor.get() ) !=
nullptr );
157 std::unique_ptr<DataAccessor> typedAccessor(
dynamic_cast<DataAccessor*
>( accessor.release() ) );
158 CAFFA_ASSERT( typedAccessor );
159 setAccessor( std::move( typedAccessor ) );
162 template <
typename Val
idatorType>
163 const ValidatorType* valueValidator()
const
165 for (
const auto& validator : m_valueValidators )
167 const ValidatorType* typedValidator =
dynamic_cast<const ValidatorType*
>( validator.get() );
168 if ( typedValidator )
return typedValidator;
173 template <
typename Val
idatorType>
174 ValidatorType* valueValidator()
176 for (
auto& validator : m_valueValidators )
178 const ValidatorType* typedValidator =
dynamic_cast<const ValidatorType*
>( validator.get() );
179 if ( typedValidator )
return typedValidator;
184 std::vector<const FieldValidator<DataType>*> valueValidators()
const
186 std::vector<const FieldValidator<DataType>*> allValidators;
187 for (
const auto& validator : m_valueValidators )
189 allValidators.push_back( validator.get() );
191 return allValidators;
194 std::vector<FieldValidator<DataType>*> valueValidators()
196 std::vector<FieldValidator<DataType>*> allValidators;
197 for (
auto& validator : m_valueValidators )
199 allValidators.push_back( validator.get() );
201 return allValidators;
206 m_valueValidators.push_back( std::move( valueValidator ) );
209 void clearValidators() { m_valueValidators.clear(); }
212 std::optional<DataType> defaultValue()
const {
return m_defaultValue; }
213 void setDefaultValue(
const DataType& val ) { m_defaultValue = val; }
219 std::unique_ptr<DataAccessor> m_fieldDataAccessor;
220 std::vector<std::unique_ptr<FieldValidator<DataType>>> m_valueValidators;
221 std::optional<DataType> m_defaultValue;
Abstract but typed data field accessor. Inherit to create different storage mechanisms.
Definition: cafDataFieldAccessor.h:43
Direct storage accessor, which stores data values in local memory.
Definition: cafDataFieldAccessor.h:75
Used to validate the value of data fields Implementations need the the validate method as well as rea...
Definition: cafFieldValidator.h:104
Definition: cafField.h:46
Definition: cafTypedField.h:67
Main Caffa namespace.
Definition: __init__.py:1