Sha256: f29b91b0c70a62ee928e32e78590218639db52f531f2f9d7ff3ce6b0b64fe42c

Contents?: true

Size: 1.76 KB

Versions: 2

Compression:

Stored size: 1.76 KB

Contents

# This file provides support for the +var+ attribute of the Rant
# application (Rant::RantApp#var).

module Rant
    module RantVar

	class Error < StandardError
	end

	class ConstraintError < Error
	end

	class InvalidVidError < Error
	end

	class InvalidConstraintError < Error
	end

	class Space

	    def initialize
		# holds all values
		@store = {}
		# holds constraints for values in @store
		@constraints = {}
	    end

	    # Get var with name +vid+.
	    def [](vid)
		unless RantVar.valid_vid? vid
		    raise InvalidVidError, vid 
		end
		@store[vid]
	    end

	    # Set var with name +vid+ to val. Throws a ConstraintError
	    # if +val+ doesn't match the constraint on +vid+ (if a
	    # constraint is registered for +vid+).
	    def []=(vid, val)
		unless RantVar.valid_vid? vid
		    raise InvalidVidError, vid 
		end
		c = @constraints[vid]
		@store[vid] = c ? c.filter(val) : val
	    end

	    # Add +constraint+ for var with id +vid+.
	    def constrain vid, constraint
		unless RantVar.valid_vid? vid
		    raise InvalidVidError, vid 
		end
		unless RantVar.valid_constraint? constraint
		    raise InvalidConstraintError, constraint
		end
		@constraints[vid] = constraint
	    end

	end	# class Space

	module Constraint
	end	# module Constraint

	# A +vid+ has to be a String to be valid.
	def valid_vid?(obj)
	    String === obj
	end
	
	# A constraint has to respond to the following methods:
	# [filter(val)]
	#   Filter _val_ or throw ConstraintError if _val_ doesn't
	#   match constraint.
	# [matches?(val)]
	#   Return true if _val_ matches constraint.
	def valid_constraint?(obj)
	    # TODO: check for arity
	    obj.respond_to?(:filter) && obj.respond_to?(:matches?)
	end

	module_function :valid_constraint?, :valid_vid?
    end	# module RantVar
end	# module Rant

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rant-0.3.2 lib/rant/rantvar.rb
rant-0.3.0 lib/rant/rantvar.rb