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