From 0e9826e3ef72fb902d188f380345232916a4feae Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 30 Aug 2017 17:05:27 +0300 Subject: [PATCH] Add arguments validator --- .../ArgumentsMismatchException.java | 14 +++++ .../com/annimon/hotarufx/lib/Validator.java | 51 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 app/src/main/java/com/annimon/hotarufx/exceptions/ArgumentsMismatchException.java create mode 100644 app/src/main/java/com/annimon/hotarufx/lib/Validator.java diff --git a/app/src/main/java/com/annimon/hotarufx/exceptions/ArgumentsMismatchException.java b/app/src/main/java/com/annimon/hotarufx/exceptions/ArgumentsMismatchException.java new file mode 100644 index 0000000..bed181a --- /dev/null +++ b/app/src/main/java/com/annimon/hotarufx/exceptions/ArgumentsMismatchException.java @@ -0,0 +1,14 @@ +package com.annimon.hotarufx.exceptions; + +import com.annimon.hotarufx.lexer.SourcePosition; + +public class ArgumentsMismatchException extends HotaruRuntimeException { + + public ArgumentsMismatchException(String message) { + super(message); + } + + public ArgumentsMismatchException(String message, SourcePosition start, SourcePosition end) { + super(message, start, end); + } +} diff --git a/app/src/main/java/com/annimon/hotarufx/lib/Validator.java b/app/src/main/java/com/annimon/hotarufx/lib/Validator.java new file mode 100644 index 0000000..03e80a2 --- /dev/null +++ b/app/src/main/java/com/annimon/hotarufx/lib/Validator.java @@ -0,0 +1,51 @@ +package com.annimon.hotarufx.lib; + +import com.annimon.hotarufx.exceptions.ArgumentsMismatchException; +import com.annimon.hotarufx.exceptions.TypeException; +import lombok.RequiredArgsConstructor; +import lombok.val; + +@RequiredArgsConstructor(staticName = "with") +public class Validator { + + private final Value[] args; + + public Validator check(int expected) { + if (args.length != expected) throw new ArgumentsMismatchException(String.format( + "%d %s expected, got %d", expected, pluralize(expected), args.length)); + return this; + } + + public Validator checkAtLeast(int expected) { + if (args.length < expected) throw new ArgumentsMismatchException(String.format( + "At least %d %s expected, got %d", expected, pluralize(expected), args.length)); + return this; + } + + public Validator checkOrOr(int expectedOne, int expectedTwo) { + if (expectedOne != args.length && expectedTwo != args.length) + throw new ArgumentsMismatchException(String.format( + "%d or %d arguments expected, got %d", expectedOne, expectedTwo, args.length)); + return this; + } + + public Validator checkRange(int from, int to) { + if (from > args.length || args.length > to) + throw new ArgumentsMismatchException(String.format( + "From %d to %d arguments expected, got %d", from, to, args.length)); + return this; + } + + public MapValue requireMapAt(int index) { + checkAtLeast(index + 1); + val value = args[index]; + if (value.type() != Types.MAP) { + throw new TypeException(String.format("Map required at %d argument", index)); + } + return (MapValue) value; + } + + private static String pluralize(int count) { + return (count == 1) ? "argument" : "arguments"; + } +}