From 905183cddc5557da45387e99dac1f5134d975efb Mon Sep 17 00:00:00 2001
From: Jakob Rath <git@jakobrath.eu>
Date: Tue, 17 Dec 2013 00:06:29 +0100
Subject: [PATCH] Implement h_attr_bool.

---
 src/bindings/ruby/lib/hammer.rb          | 5 +++++
 src/bindings/ruby/lib/hammer/internal.rb | 4 +++-
 src/bindings/ruby/lib/hammer/parser.rb   | 9 +++++++++
 3 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/bindings/ruby/lib/hammer.rb b/src/bindings/ruby/lib/hammer.rb
index 18c693a4..ebc75be3 100644
--- a/src/bindings/ruby/lib/hammer.rb
+++ b/src/bindings/ruby/lib/hammer.rb
@@ -46,3 +46,8 @@ $r = parser.parse 'abcdefgh'
 p $r[:ast][:data][:seq].elements.map {|e| e[:data][:uint]}
 # or:
 p $r.ast.data.map(&:data)
+
+
+h = Hammer::Parser
+parser = h.many(h.attr_bool(h.uint8) { |r| r.ast.data <= 100 })
+p parser.parse('abcdefgh').ast.data.map(&:data)
diff --git a/src/bindings/ruby/lib/hammer/internal.rb b/src/bindings/ruby/lib/hammer/internal.rb
index 214145a9..e799b275 100644
--- a/src/bindings/ruby/lib/hammer/internal.rb
+++ b/src/bindings/ruby/lib/hammer/internal.rb
@@ -169,7 +169,9 @@ module Hammer
 
     callback :HAction, [HParseResult.by_ref], HParsedToken.by_ref
     attach_function :h_action, [:h_parser, :HAction], :h_parser
-    #attach_function :h_attr_bool, [:h_parser, ...], :h_parser
+
+    callback :HPredicate, [HParseResult.by_ref], :bool
+    attach_function :h_attr_bool, [:h_parser, :HPredicate], :h_parser
 
     # free the parse result
     attach_function :h_parse_result_free, [HParseResult.by_ref], :void
diff --git a/src/bindings/ruby/lib/hammer/parser.rb b/src/bindings/ruby/lib/hammer/parser.rb
index f9ff4c70..b496558f 100644
--- a/src/bindings/ruby/lib/hammer/parser.rb
+++ b/src/bindings/ruby/lib/hammer/parser.rb
@@ -54,6 +54,15 @@ module Hammer
       return Hammer::Parser.new(:action, h_parser, [parser, action])
     end
 
+    # Can pass the predicate either as a Proc in second parameter, or as block.
+    def self.attr_bool(parser, predicate=nil, &block)
+      predicate = block if predicate.nil?
+      raise ArgumentError, 'no predicate' if predicate.nil?
+
+      h_parser = Hammer::Internal.h_attr_bool(parser.h_parser, predicate)
+      return Hammer::Parser.new(:attr_bool, h_parser, [parser, predicate])
+    end
+
     def self.token(string)
       # Need to copy string to a memory buffer (not just string.dup)
       # * Original string might be modified, this must not affect existing tokens
-- 
GitLab