Class: Safer::HashProtocol
- Inherits:
-
Object
- Object
- Safer::HashProtocol
- Defined in:
- lib/safer/hashprotocol.rb
Overview
Check that the keys in a Hash object follow a set of constraints. ==Usage In this example, we use a Hash to simulate keyword parameters to our function. class YourClass SHP = Safer::HashProtocol
we support two versions of the keyword arguments to our function.
In both versions, the Hash is required to have a :type field.
CommonKeywords = SHP::HasKey.create(:type)
In the old version, a person's full name is presented in the :name
keyword.
V1Keywords = SHP::HasKey.create(:name)
In the new version, the full name is separated into :familyName
and :givenName.
V2Keywords = SHP::HasKey.create(:familyName, :givenName)
Check if the keywords in the Hash match Version1 (that is,
:name and :type fields must be present in the Hash, and no other
fields should be present).
V1Check = SHP::Only.new(SHP::All.new(*CommonKeywords + *V1Keywords))
Check if the keywords in the Hash match Version2 (that is,
:familyName, :givenName, and :type fields must be present in the Hash,
and no other fields should be present).
V2Check = SHP::Only.new(SHP::All.new(*CommonKeywords + *V2Keywords))
Check if the Hash matches either version 1 or version 2.
ValidCheck = SHP::Any.new(V1Check, V2Check) def my_fn(h) if ! (ValidCheck === h) raise ArgumentError, "h should conform to #ValidCheck.description" end case h when V1Check v1_process(h, h) when V2Check v2_process(h, h, h) end end end ==Rationale It is a common design practice in Ruby code to use Hash objects to get an analogue to function keyword arguments in other languages. Among other uses, this practice simplifies the implementation of embedded DSLs within Ruby. When used in this way, the Hash keys are semantically meaningful, and are generally entered by hand. It's important to get these Hashes right. Safer::HashProtocol is intended to help, by simultaneously providing a means of documenting the key combinations required of a Hash, and by detecting when the Hash does not contain a valid set of keys.
Defined Under Namespace
Classes: All, Any, Base, Compound, HasKey, Not, Only, ProtocolBase, Single
Constant Summary collapse
- Protocol =
Object signature required of HashProtocol objects. Derived from ProtocolBase.
Safer::Protocol.create_from_class(ProtocolBase)