lib/bindata/virtual.rb in bindata-1.6.0 vs lib/bindata/virtual.rb in bindata-1.8.0

- old
+ new

@@ -1,6 +1,6 @@ -require "bindata/base_primitive" +require "bindata/base" module BinData # A virtual field is one that is neither read, written nor occupies space. # It is used to make assertions or as a convenient label for determining # offsets. @@ -15,33 +15,39 @@ # # obj = A.read("abcdeabcde") # obj.a #=> "abcde" # obj.c.offset #=> 10 # - class Virtual < BinData::BasePrimitive + # obj = A.read("abcdeABCDE") #=> BinData::ValidityError: assertion failed for obj.c + # + # == Parameters + # + # Parameters may be provided at initialisation to control the behaviour of + # an object. These params include those for BinData::Base as well as: + # + # [<tt>:assert</tt>] Raise an error when reading or assigning if the value + # of this evaluated parameter is false. + # + class Virtual < BinData::Base - default_parameter :onlyif => false + optional_parameter :assert - class << self - def sanitize_parameters!(params) #:nodoc: - if params.has_parameter?(:asserted_value) - fail ":asserted_value can not be used on virtual field" - end - end - end + def clear?; true; end + def snapshot; nil; end + def do_num_bytes; 0; end + def do_write(io); end - #--------------- - private - - def value_to_binary_string(val) - "" + def assign(val) + assert! end - def read_and_return_value(io) - "" + def do_read(io) + assert! end - def sensible_default - "" + def assert! + if has_parameter?(:assert) and not eval_parameter(:assert) + raise ValidityError, "assertion failed for #{debug_name}" + end end end end