summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFlaviu Tamas <tamasflaviu@gmail.com>2015-01-10 20:36:34 -0500
committerFlaviu Tamas <tamasflaviu@gmail.com>2015-01-10 20:36:34 -0500
commitfb51221aa890df5535103c4056c2b09c994addbb (patch)
tree09bde988a8847c836bbb197528e6bb27d9694af8
parentd7dbf7e01177c67e8438aff814aa9263312d87b1 (diff)
downloadNim-fb51221aa890df5535103c4056c2b09c994addbb.tar.gz
Expose the pattern string, rename some procs
-rw-r--r--src/nre.nim20
-rw-r--r--test/captures.nim3
2 files changed, 12 insertions, 11 deletions
diff --git a/src/nre.nim b/src/nre.nim
index b6835bd00..92cc7bbf4 100644
--- a/src/nre.nim
+++ b/src/nre.nim
@@ -10,7 +10,7 @@ import optional_t
 # Type definitions {{{
 type
   Regex* = ref object
-    pattern: string  # not nil
+    pattern*: string  # not nil
     pcreObj: ptr pcre.Pcre  # not nil
     pcreExtra: ptr pcre.ExtraData  ## nil
 
@@ -43,18 +43,20 @@ proc getinfo[T](self: Regex, opt: cint): T =
     # XXX Error message that doesn't expose implementation details
     raise newException(FieldError, "Invalid getinfo for $1, errno $2" % [$opt, $retcode])
 
-# Capture accessors {{{
-proc captureCount(self: Regex): int =
-  ## get the maximum number of captures
+# Regex accessors {{{
+proc captureCount*(self: Regex): int =
+  ## Get the maximum number of captures
   ##
   ## Does not return the number of captured captures
   return getinfo[int](self, pcre.INFO_CAPTURECOUNT)
 
-proc captureNames*(self: Regex): seq[string] =
-  result = @[]
-  for key in self.captureNameToId.keys:
-    result.add(key)
+proc captureNameId*(self: Regex): Table[string, int] =
+  ## Returns a map from named capture groups to their numerical
+  ## identifier
+  return self.captureNameToId
+# }}}
 
+# Capture accessors {{{
 proc captureBounds*(self: RegexMatch): CaptureBounds = return CaptureBounds(self)
 
 proc captures*(self: RegexMatch): Captures = return Captures(self)
@@ -107,7 +109,7 @@ proc `[]`*(self: Captures, name: string): string =
   return self.captures[self.pattern.captureNameToId.fget(name)]
 
 template asTableImpl(cond: bool): stmt {.immediate, dirty.} =
-  for key in RegexMatch(self).pattern.captureNames:
+  for key in RegexMatch(self).pattern.captureNameId.keys:
     let nextVal = self[key]
     if cond:
       result[key] = default
diff --git a/test/captures.nim b/test/captures.nim
index e987e9ca4..340c3d638 100644
--- a/test/captures.nim
+++ b/test/captures.nim
@@ -37,8 +37,7 @@ suite "captures":
   test "capture count":
     let ex1 = initRegex("(?<foo>foo)(?<bar>bar)?")
     check(ex1.captureCount == 2)
-    # Don't have sets, do this :<
-    check(ex1.captureNames == @["foo", "bar"] or ex1.captureNames == @["bar", "foo"])
+    check(ex1.captureNameId == {"foo" : 0, "bar" : 1}.toTable())
 
   test "named capture table":
     let ex1 = initRegex("(?<foo>foo)(?<bar>bar)?").match("foo").get