24 #include "cafDataField.h" 25 #include "cafFieldValidator.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() );
86 if ( !m_fieldDataAccessor )
88 std::string errorMessage =
"Failed to get value for '" + this->keyword() +
"': Field is not accessible";
89 CAFFA_ERROR( errorMessage );
90 throw std::runtime_error( errorMessage );
95 return m_fieldDataAccessor->value();
97 catch (
const std::exception& e )
99 std::string errorMessage =
"Failed to get value for '" + this->keyword() +
"': " + e.what();
100 CAFFA_ERROR( errorMessage );
101 throw std::runtime_error( errorMessage );
105 void setValue(
const DataType& fieldValue )
override 107 CAFFA_ASSERT( this->isInitialized() );
109 if ( !m_fieldDataAccessor )
111 std::string errorMessage =
"Failed to set value for '" + this->keyword() +
"': Field is not accessible";
112 CAFFA_ERROR( errorMessage );
113 throw std::runtime_error( errorMessage );
118 for (
const auto& validator : m_valueValidators )
120 if (
auto [status, message] = validator->validate( fieldValue ); !status )
122 CAFFA_ASSERT( !message.empty() );
123 if ( validator->failureSeverity() == FieldValidatorInterface::FailureSeverity::VALIDATOR_ERROR ||
124 validator->failureSeverity() == FieldValidatorInterface::FailureSeverity::VALIDATOR_CRITICAL )
126 throw std::runtime_error( message );
130 CAFFA_WARNING( message );
134 m_fieldDataAccessor->setValue( fieldValue );
136 catch (
const std::exception& e )
138 std::string errorMessage =
"Failed to set value for '" + this->keyword() +
"': " + e.what();
139 CAFFA_ERROR( errorMessage );
140 throw std::runtime_error( errorMessage );
147 operator DataType()
const {
return this->value(); }
148 DataType operator()()
const {
return this->value(); }
149 DataType operator*()
const {
return this->value(); }
151 auto operator<=>(
const DataType& fieldValue )
const {
return this->value() <=> fieldValue; }
153 bool isReadable()
const override {
return m_fieldDataAccessor !=
nullptr && m_fieldDataAccessor->hasGetter(); }
154 bool isWritable()
const override {
return m_fieldDataAccessor !=
nullptr && m_fieldDataAccessor->hasSetter(); }
157 void setAccessor( std::unique_ptr<DataAccessor> accessor ) { m_fieldDataAccessor = std::move( accessor ); }
159 void setUntypedAccessor( std::unique_ptr<DataFieldAccessorInterface> accessor )
override 163 std::unique_ptr<DataAccessor> typedAccessor( dynamic_cast<DataAccessor*>( accessor.release() ) );
164 CAFFA_ASSERT( typedAccessor );
165 setAccessor( std::move( typedAccessor ) );
169 setAccessor(
nullptr );
173 std::vector<const FieldValidator<DataType>*> valueValidators()
const 175 std::vector<const FieldValidator<DataType>*> allValidators;
176 for (
const auto& validator : m_valueValidators )
178 allValidators.push_back( validator.get() );
180 return allValidators;
183 std::vector<FieldValidator<DataType>*> valueValidators()
185 std::vector<FieldValidator<DataType>*> allValidators;
186 for (
auto& validator : m_valueValidators )
188 allValidators.push_back( validator.get() );
190 return allValidators;
195 m_valueValidators.push_back( std::move( valueValidator ) );
198 void clearValidators() { m_valueValidators.clear(); }
201 std::optional<DataType> defaultValue()
const {
return m_defaultValue; }
202 void setDefaultValue(
const DataType& val ) { m_defaultValue = val; }
208 std::unique_ptr<DataAccessor> m_fieldDataAccessor;
209 std::vector<std::unique_ptr<FieldValidator<DataType>>> m_valueValidators;
210 std::optional<DataType> m_defaultValue;
Used to validate the value of data fields Implementations need the the validate method as well as rea...
Definition: cafFieldValidator.h:94
bool isReadable() const override
Definition: cafField.h:153
Abstract but typed data field accessor. Inherit to create different storage mechanisms.
Definition: cafDataFieldAccessor.h:42
Definition: cafDataField.h:40
Definition: cafField.h:45
bool isWritable() const override
Definition: cafField.h:154
Main Caffa namespace.
Definition: cafApplication.h:30
Direct storage accessor, which stores data values in local memory.
Definition: cafDataFieldAccessor.h:86