aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nimrec/recordset.nim8
-rw-r--r--tests/test.nim25
2 files changed, 33 insertions, 0 deletions
diff --git a/nimrec/recordset.nim b/nimrec/recordset.nim
index 29422e9..0a29029 100644
--- a/nimrec/recordset.nim
+++ b/nimrec/recordset.nim
@@ -13,6 +13,7 @@ import times
type
FieldKind* {.pure.} = enum
Integer
+ Real
String
FieldDescriptor* = ref object
@@ -76,10 +77,14 @@ proc newRecordSet*(record: Record): RecordSet =
let desc = addFieldDescriptor(result, label)
case kind
of "int": desc.kind = FieldKind.Integer
+ of "real": desc.kind = FieldKind.Real
else: desc.kind = FieldKind.String
let integerPeg = peg"^ '-'? ('0' / ([1-9] \d*)) $"
+# This should correspond to the JSON Number spec at the moment
+let realPeg = peg"^ '-'? ('0' / ([1-9] \d*)) ('.' \d+)? ([Ee] [+-]? \d+)? $"
+
proc validate*(record: Record, recordSet: RecordSet) =
let labels = toSet(toSeq(labels(record)))
@@ -106,6 +111,9 @@ proc validate*(record: Record, recordSet: RecordSet) =
of FieldKind.Integer:
if not (value =~ integerPeg):
raise newException(IntegrityError, format("integer expected"))
+ of FieldKind.Real:
+ if not (value =~ realPeg):
+ raise newException(IntegrityError, format("real expected"))
else: discard
iterator recordsInSet*(stream: Stream, kind: string): Record =
diff --git a/tests/test.nim b/tests/test.nim
index 3eda4eb..06c7ce0 100644
--- a/tests/test.nim
+++ b/tests/test.nim
@@ -433,3 +433,28 @@ suite "type basics: integers":
let data = prologue & "Value: " & value & "\n"
expect(Exception):
discard toSeq(recordsInSet(newStringStream(data), "Entry"))
+
+suite "type basics: reals":
+ const prologue = """
+%rec: Entry
+%type: Value real
+
+"""
+
+ test "valid reals":
+ const values = ["0", "1", "123456789", "987654321", "-123456789",
+ "-987654321", "-0",
+ "0.0", "0.12345", "1234.5678",
+ "1e8", "1E8", "1e+9", "1E-9", "1e10"]
+
+ for value in values:
+ let data = prologue & "Value: " & value & "\n"
+ discard toSeq(recordsInSet(newStringStream(data), "Entry"))
+
+ test "invalid reals":
+ const values = ["0.", "foobar", "01", "1-"]
+
+ for value in values:
+ let data = prologue & "Value: " & value & "\n"
+ expect(Exception):
+ discard toSeq(recordsInSet(newStringStream(data), "Entry"))