Класс тега для парсинга последовательностей скалярных значений с возможными ограничениями на каждое из них.
Конструктор поддерживает следующие дополнительные ключи в хэше params:
объект, реализующий интерфейс ScalarFormat. Этот объект будет использован для для преобразования токенов входного потока в значения нужного пользователю типа.
объект, реализующий интерфейс ScalarChecker. Этот объект, если он задан, будет использован для проверки извлекаемых из входного потока значений.
true, если разрешается пустая последовательность (по умолчанию в последовательности должен быть хотя бы один элемент).
значение тега. Если этот параметр указан, то тег сразу объявляется определенным. Ожидается, что значением будет Array. Корректность значения не проверятся.
Пример использования:
Пусть необходимо парсить следующую структуру: {params {init_bytes <uint:0..255>*} {shutdown_bytes <uint:0..255>*} {devices <str>+} } Например: {params {init_bytes 0 0 254 254 0 0} {shutdown_bytes 0xff 0xff 0xff} {devices "com1" "com2" "com3" } } Для этого можно применить тег: class TagParams < ClsRuby::Tag child_tag :init_bytes, ClsRuby::TagScalarVector, :format => ClsRuby::SCALAR_UINT, :constraint => 0..255, :can_be_empty => true child_tag :shutdown_bytes, ClsRuby::TagScalarVector, :format => ClsRuby::SCALAR_UINT, :constraint => 0..255, :can_be_empty => true child_tag :devices, ClsRuby::TagScalarVector, :format => ClsRuby::SCALAR_STRING, :mandatory => true end
Для извлечения значения следует воспользоваться методом TagScalarVector#value. Но, если тег не был определен, то TagScalarVector#value возвратит значение []. Для упрощения работы с необязательными тегами можно воспользоваться методом fetch:
tag = ClsRuby::TagScalarVector.new( :name => 'init_bytes', :format => ClsRuby::SCALAR_UINT, :constraint => 0..255 ) ... bytes = tag.fetch( [ 0, 0, 0 ] )
Конструктор порождает исключение FormatUndefinedEx, если в params нет ключа :format, или если этому ключу соответствует nil.
# File lib/cls-ruby/tag_scalar_vector.rb, line 80 def initialize( params = {} ) super( params ) tag_scalar_extract_params( tag_params ) @can_be_empty = tag_params.fetch( :can_be_empty, false ) @value = [] v = tag_params.fetch( :value, nil ) send( :value=, v ) if v end
Вспомогательный метод для извлечения значения из необязательного тега.
Если тег не определен, то возвращает значение default.
# File lib/cls-ruby/tag_scalar_vector.rb, line 107 def fetch( default ) tag_defined? ? value : default end
Порождает исключение ValueMissedEx, если к моменту закрытия тега значение не было определено.
# File lib/cls-ruby/tag_scalar_vector.rb, line 126 def tag_on_finish raise ValueMissedEx.new( "value missed for tag '#{tag_name}'" ) if !@can_be_empty && 0 == @value.size super end
# File lib/cls-ruby/tag_scalar_vector.rb, line 142 def tag_on_format( formatter ) @value.each do |v| formatter.value( @format.format( v ) ) end end
Порождает исключение TagAlreadyDefinedEx, если тег уже определен.
# File lib/cls-ruby/tag_scalar_vector.rb, line 117 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_vector.rb, line 134 def tag_on_tok_nonspace( token ) @value << tag_scalar_check( token, @format.on_tok_nonspace( token ) ) end
# File lib/cls-ruby/tag_scalar_vector.rb, line 138 def tag_on_tok_string( token ) @value << tag_scalar_check( token, @format.on_tok_string( token ) ) end
# File lib/cls-ruby/tag_scalar_vector.rb, line 111 def tag_reset @value = [] super end
Делает тег определенным с заданными значениями.
Старые значения выбрасываются.
+Примечание+. Значения на корректность не проверяется.
вектор значений для тега.
# File lib/cls-ruby/tag_scalar_vector.rb, line 98 def value=( values ) @value = values tag_make_defined self end
Generated with the Darkfish Rdoc Generator 2.