Parent

Class/Module Index [+]

Quicksearch

ClsRuby::TagScalar

Класс тега для парсинга скалярных значений с возможными ограничениями на них.

Конструктор поддерживает следующие дополнительные ключи в хэше params:

:format

объект, реализующий интерфейс ScalarFormat. Этот объект будет использован для для преобразования токенов входного потока в значения нужного пользователю типа.

:constraint

объект, реализующий интерфейс ScalarChecker. Этот объект, если он задан, будет использован для проверки извлекаемых из входного потока значений.

:value

значение тега. Если этот параметр указан, то тег сразу объявляется определенным. Корректность значения не проверятся.

Пример использования:

Пусть необходимо парсить следующую структуру:
{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

Attributes

value[R]

Чтение разобранного тегом значения.

Public Class Methods

new( params = {} ) click to toggle source

Конструктор порождает исключение 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

Public Instance Methods

fetch( default ) click to toggle source

Вспомогательный метод для извлечения значения из необязательного тега.

Если тег не определен, то возвращает значение default.

# File lib/cls-ruby/tag_scalar.rb, line 103
def fetch( default )
  tag_defined? ? value : default
end
tag_on_finish() click to toggle source

Порождает исключение 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
tag_on_format( formatter ) click to toggle source
# File lib/cls-ruby/tag_scalar.rb, line 140
def tag_on_format( formatter )
  formatter.value( @format.format( @value ) )
end
tag_on_start( name ) click to toggle source

Порождает исключение 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
tag_on_tok_nonspace( token ) click to toggle source
# 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
tag_on_tok_string( token ) click to toggle source
# 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
tag_reset() click to toggle source

Сбрасывает тег в начальное состояние.

# File lib/cls-ruby/tag_scalar.rb, line 108
def tag_reset
  @value = nil
  super
end
value=( value ) click to toggle source

Делает тег определенным с заданным значением.

Примечание. Значение на корректность не проверяется.

# File lib/cls-ruby/tag_scalar.rb, line 94
def value=( value )
  @value = value
  tag_make_defined
  self
end

Private Instance Methods

tag_scalar_value_must_be_nil() click to toggle source

Порождает исключение 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

[Validate]

Generated with the Darkfish Rdoc Generator 2.