Class Index [+]

Quicksearch
# Пример, который демонстрирует загрузку из файла описания некоторого
# сервиса, которое хранится в следующем формате:
#
#   {service
#     {name <str>}
#     {ips <nonspace>+ }
#     [{message <nonspace>
#         [{priority <int>}]
#         [{field
#             {name <str>}
#             {type <nonspace>}]*
#     }]*
#   }
#
# Например:
#   {service
#     {name "DayTime"}
#     {ips localhost:3028 my.site.org:5000 }
#     {message GetCurrentTime}
#     {message GetUTCTime
#       {priority 0}
#       {field {name "localTime"} {type String}}
#       {field {name "timeZone"} {type String}}
#     }
#   }
#
# Формат запуска примера:
#   ruby -Ilib examples/service_description.rb <description-file>
#

require 'cls-ruby'
require 'cls-ruby/tag_no_value'
require 'cls-ruby/tag_scalar'
require 'cls-ruby/tag_scalar_vector'
require 'cls-ruby/tag_vector_of_tags'

module ServiceDescriptionExample

# Описание одного поля сообщения.
Field = Struct.new( :name, :type )

# Описание одного сообщения.
Message = Struct.new( :name, :priority, :fields )

# Описание сервиса.
Service = Struct.new( :name, :ips, :messages )

# Функция загрузки описания из указанного файла.
# 
# :call-seq:
# load_cfg_file( file_name ) => Service
#
def ServiceDescriptionExample.load_cfg_file( file_name )
  tag = Impl::TagService.new
  ClsRuby::parse_file( file_name, tag )
  tag.value
end

# Реализация тегов в описании сервиса.
module Impl

  # Класс тега {field}.
  #
  class TagField < ClsRuby::TagNoValue
    mandatory_child_tag :name, ClsRuby::TagStringScalar
    mandatory_child_tag :type, ClsRuby::TagScalar,
        :format => ClsRuby::SCALAR_NONSPACE_STRING

    default_tag_params :name => 'field'

    def value
      Field.new( @name.value, @type.value )
    end
  end

  # Класс тега {message}.
  #
  class TagMessage < ClsRuby::TagScalar
    child_tag :priority, ClsRuby::TagIntScalar
    child_tag :field, ClsRuby::TagVectorOfTags, :type => TagField

    default_tag_params :name => 'message',
        :format => ClsRuby::SCALAR_NONSPACE_STRING

    def value
      Message.new(
          super,
          @priority.tag_defined? ? 0 : @priority.value,
          @field.collect_values_by( :value ) )
    end
  end

  # Класс тега {service}
  #
  class TagService < ClsRuby::TagNoValue
    mandatory_child_tag :name, ClsRuby::TagStringScalar
    mandatory_child_tag :ips, ClsRuby::TagScalarVector,
        :format => ClsRuby::SCALAR_NONSPACE_STRING
    child_tag :message, ClsRuby::TagVectorOfTags,
        :type => TagMessage

    default_tag_params :name => 'service'

    def value
      Service.new(
          @name.value,
          @ips.value,
          @message.collect_values_by( :value ) )
    end
  end
end # module Impl

end # module ServiceDescriptionExample

ARGV.each do |file_name|
  s = ServiceDescriptionExample.load_cfg_file( file_name )
  puts "#{file_name}: #{s}"
end

# vim:ts=2:sts=2:sw=2:expandtab:ft=txt:tw=78

[Validate]

Generated with the Darkfish Rdoc Generator 2.