Класс тега для парсинга скалярных значений с возможными ограничениями на них.
Конструктор поддерживает следующие дополнительные ключи в хэше params:
объект, реализующий интерфейс ScalarFormat. Этот объект будет использован для для преобразования токенов входного потока в значения нужного пользователю типа.
объект, реализующий интерфейс ScalarChecker. Этот объект, если он задан, будет использован для проверки извлекаемых из входного потока значений.
значение тега. Если этот параметр указан, то тег сразу объявляется определенным. Корректность значения не проверятся.
Пример использования:
Пусть необходимо парсить следующую структуру: {params {min <int:1..100>} {max <int:100..1000>} {password <str>} } Для этого можно применить тег: class TagParams < ClsRuby::Tag def initialize( params ) super( params ) @min = ClsRuby::TagScalar.new( :name => 'min', :owner => self, :mandatory => true, :format => ClsRuby::SCALAR_INT, :constraint => 1..100 ) @max = ClsRuby::TagScalar.new( :name => 'max', :owner => self, :mandatory => true, :format => ClsRuby::SCALAR_INT, :constraint => 100..1000 ) @password = ClsRuby::TagScalar.new( :name => 'password', :owner => self, :mandatory => true, :format => ClsRuby::SCALAR_STRING ) end end
Для извлечения значения следует воспользоваться методом TagScalar#value. Но, если тег не был определен, то TagScalar#value возвратит значение nil. Для упрощения работы с необязательными тегами можно воспользоваться методом fetch:
|| Парсит тег формата: || {age [{hours <uint>}] [{minutes <uint>]} [{seconds <uint>}]} || и возвращает в методе value значение в секундах. class TagAge < ClsRuby::TagNoValue child_tag :hours, ClsRuby::TagUintScalar, :constraint => 1..24 child_tag :minutes, ClsRuby::TagUintScalar, :constraint => 1...60 child_tag :seconds, ClsRuby::TagUintScalar, :constraint => 1...60 def value @hours.fetch( 0 ) * 3600 + @minutes.fetch( 0 ) * 60 + @seconds.fetch( 0 ) end end
Конструктор порождает исключение FormatUndefinedEx, если в params нет ключа :format, или если этому ключу соответствует nil.
# File lib/cls-ruby/tag_scalar.rb, line 81 def initialize( params = {} ) super( params ) tag_scalar_extract_params( tag_params ) @value = nil v = tag_params.fetch( :value, nil ) send( :value=, v ) if v end
Вспомогательный метод для извлечения значения из необязательного тега.
Если тег не определен, то возвращает значение default.
# File lib/cls-ruby/tag_scalar.rb, line 103 def fetch( default ) tag_defined? ? value : default end
Порождает исключение ValueMissedEx, если к моменту закрытия тега значение не было определено.
# File lib/cls-ruby/tag_scalar.rb, line 123 def tag_on_finish raise ValueMissedEx.new( "value missed for tag '#{tag_name}'" ) unless @value super end
# File lib/cls-ruby/tag_scalar.rb, line 140 def tag_on_format( formatter ) formatter.value( @format.format( @value ) ) end
Порождает исключение TagAlreadyDefinedEx, если тег уже определен.
# File lib/cls-ruby/tag_scalar.rb, line 114 def tag_on_start( name ) super( name ) raise TagAlreadyDefinedEx.new( "tag '#{tag_name}' already defined" ) if tag_defined? end
# File lib/cls-ruby/tag_scalar.rb, line 130 def tag_on_tok_nonspace( token ) tag_scalar_value_must_be_nil @value = tag_scalar_check( token, @format.on_tok_nonspace( token ) ) end
# File lib/cls-ruby/tag_scalar.rb, line 135 def tag_on_tok_string( token ) tag_scalar_value_must_be_nil @value = tag_scalar_check( token, @format.on_tok_string( token ) ) end
Порождает исключение ValueAlreadyDefinedEx, если @value отлично от nil.
# File lib/cls-ruby/tag_scalar.rb, line 146 def tag_scalar_value_must_be_nil raise ValueAlreadyDefinedEx.new( "tag '#{tag_name}' already has value '#{@value}'" ) if @value end
Generated with the Darkfish Rdoc Generator 2.