diff --git a/include/XSLT/impl/handler/xslt_value_validation.hpp b/include/XSLT/impl/handler/xslt_value_validation.hpp index 52a61fb2..57b86fda 100644 --- a/include/XSLT/impl/handler/xslt_value_validation.hpp +++ b/include/XSLT/impl/handler/xslt_value_validation.hpp @@ -6,6 +6,78 @@ namespace Arabica namespace XSLT { +template class AttributeValidatorsBuilder; +template class AttributeValidators; + +template +class AttributeValidator +{ +private: + explicit AttributeValidator(bool required) : + required_(required) + { + } // AttributeValidator + + bool required_; + + friend class AttributeValidators; +}; // class AttributeValidator + +template +class AttributeValidators +{ +public: + static AttributeValidatorsBuilder rule(const string_type& name, bool required); + +private: + void put(const string_type& name, bool required) + { + rules_[name] = AttributeValidate(required); + } // put + + AttributeValidators() { } + + typedef std::map > ValidatorMap; + typedef typename std::map >::const_iterator ValidatorMapIterator; + + ValidatorMap rules_; +}; + +template +class AttributeValidatorsBuilder +{ +public: + operator AttributeValidator&() { return validators_; } + + AttributeValidatorsBuilder& rule(const string_type& name, bool required) + { + validators_.put(name, required); + return *this; + } // rule + +private: + AttributeValidatorsBuilder() { } + AttributeValidatorsBuilder(const AttributeValidatorsBuilder& rhs) : + validators_(validators) + { + } // AttributeValidatorsBuilder + + AttributeValidator validators_; + + friend class AttributeValidators; +}; // class AttributeValidatorsBuilder + +template +AttributeValidatorsBuilder + AttributeValidators::rule(const string_type& name, bool required) +{ + AttributeValidatorsBuilder builder; + builder.rule(name, required); + return builder; +} // AttributeValidator::rule + +//// + template struct ValueRule {