Более удобная проверка аргументов функций

This commit is contained in:
Victor 2016-03-26 00:10:10 +02:00
parent 23f0b340d3
commit 48f3ce1a5f
42 changed files with 93 additions and 96 deletions

View File

@ -0,0 +1,32 @@
package com.annimon.ownlang.lib;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
public final class Arguments {
public static void check(int expected, int got) {
if (got != expected) throw new ArgumentsMismatchException(String.format(
"%d %s expected, got %d", expected, pluralize(expected), got));
}
public static void checkAtLeast(int expected, int got) {
if (got < expected) throw new ArgumentsMismatchException(String.format(
"At least %d %s expected, got %d", expected, pluralize(expected), got));
}
public static void checkOrOr(int expectedOne, int expectedTwo, int got) {
if (expectedOne != got && expectedTwo != got)
throw new ArgumentsMismatchException(String.format(
"%d or %d arguments expected, got %d", expectedOne, expectedTwo, got));
}
public static void checkRange(int from, int to, int got) {
if (from > got || got > to)
throw new ArgumentsMismatchException(String.format(
"From %d to %d arguments expected, got %d", from, to, got));
}
private static String pluralize(int count) {
return (count == 1) ? "argument" : "arguments";
}
}

View File

@ -88,7 +88,7 @@ public final class canvas implements Module {
private static Function intConsumer4Convert(IntConsumer4 consumer) { private static Function intConsumer4Convert(IntConsumer4 consumer) {
return args -> { return args -> {
if (args.length != 4) throw new ArgumentsMismatchException("Four args expected"); Arguments.check(4, args.length);
consumer.accept(args[0].asInt(), args[1].asInt(), args[2].asInt(), args[3].asInt()); consumer.accept(args[0].asInt(), args[1].asInt(), args[2].asInt(), args[3].asInt());
return NumberValue.ZERO; return NumberValue.ZERO;
}; };
@ -181,7 +181,7 @@ public final class canvas implements Module {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 3) throw new ArgumentsMismatchException("Three args expected"); Arguments.check(3, args.length);
int x = args[1].asInt(); int x = args[1].asInt();
int y = args[2].asInt(); int y = args[2].asInt();
graphics.drawString(args[0].asString(), x, y); graphics.drawString(args[0].asString(), x, y);

View File

@ -69,7 +69,7 @@ public final class files implements Module {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length < 1) throw new ArgumentsMismatchException("At least one argument expected"); Arguments.checkAtLeast(1, args.length);
final File file = new File(args[0].asString()); final File file = new File(args[0].asString());
try { try {

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
@ -8,8 +7,7 @@ public final class functional_combine implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length < 1) throw new ArgumentsMismatchException("At least one arg expected"); Arguments.checkAtLeast(1, args.length);
Function result = null; Function result = null;
for (Value arg : args) { for (Value arg : args) {
if (arg.type() != Types.FUNCTION) { if (arg.type() != Types.FUNCTION) {

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
import java.util.ArrayList; import java.util.ArrayList;
@ -12,11 +11,11 @@ public final class functional_filter implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length < 2) throw new ArgumentsMismatchException("At least two args expected"); Arguments.check(2, args.length);
if (args[1].type() != Types.FUNCTION) { if (args[1].type() != Types.FUNCTION) {
throw new TypeException("Function expected in second arg"); throw new TypeException("Function expected in second argument");
} }
final Value container = args[0]; final Value container = args[0];
final Function consumer = ((FunctionValue) args[1]).getValue(); final Function consumer = ((FunctionValue) args[1]).getValue();
if (container.type() == Types.ARRAY) { if (container.type() == Types.ARRAY) {

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
import java.util.ArrayList; import java.util.ArrayList;
@ -10,8 +9,7 @@ public final class functional_flatmap implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length < 2) throw new ArgumentsMismatchException("At least two arguments expected"); Arguments.check(2, args.length);
if (args[0].type() != Types.ARRAY) { if (args[0].type() != Types.ARRAY) {
throw new TypeException("Array expected in first argument"); throw new TypeException("Array expected in first argument");
} }

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
@ -10,7 +9,7 @@ public final class functional_foreach implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 2) throw new ArgumentsMismatchException("Two args expected"); Arguments.check(2, args.length);
if (args[1].type() != Types.FUNCTION) { if (args[1].type() != Types.FUNCTION) {
throw new TypeException("Function expected in second arg"); throw new TypeException("Function expected in second arg");

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
@ -10,7 +9,7 @@ public final class functional_map implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length < 2) throw new ArgumentsMismatchException("At least two args expected"); Arguments.checkOrOr(2, 3, args.length);
final Value container = args[0]; final Value container = args[0];
if (container.type() == Types.ARRAY) { if (container.type() == Types.ARRAY) {

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
@ -10,10 +9,10 @@ public final class functional_reduce implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 3) throw new ArgumentsMismatchException("Three args expected"); Arguments.check(3, args.length);
if (args[2].type() != Types.FUNCTION) { if (args[2].type() != Types.FUNCTION) {
throw new TypeException("Function expected in third arg"); throw new TypeException("Function expected in third argument");
} }
final Value container = args[0]; final Value container = args[0];
final Value identity = args[1]; final Value identity = args[1];

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
import java.util.Arrays; import java.util.Arrays;
@ -9,8 +8,7 @@ public final class functional_sortby implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 2) throw new ArgumentsMismatchException("Two arguments expected"); Arguments.check(2, args.length);
if (args[0].type() != Types.ARRAY) { if (args[0].type() != Types.ARRAY) {
throw new TypeException("Array expected in first argument"); throw new TypeException("Array expected in first argument");
} }

View File

@ -66,7 +66,7 @@ public final class http_http implements Function {
return process(url, method, args[2], (MapValue) args[3], (FunctionValue) args[4]); return process(url, method, args[2], (MapValue) args[3], (FunctionValue) args[4]);
default: default:
throw new ArgumentsMismatchException("Wrong number of arguments"); throw new ArgumentsMismatchException("From 1 to 5 arguments expected, got " + args.length);
} }
} }

View File

@ -1,6 +1,6 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException; import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function; import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.StringValue; import com.annimon.ownlang.lib.StringValue;
import com.annimon.ownlang.lib.Value; import com.annimon.ownlang.lib.Value;
@ -11,7 +11,7 @@ public final class http_urlencode implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length == 0) throw new ArgumentsMismatchException("At least one arg expected"); Arguments.checkOrOr(1, 2, args.length);
String charset = "UTF-8"; String charset = "UTF-8";
if (args.length >= 2) { if (args.length >= 2) {

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
import java.util.Iterator; import java.util.Iterator;
import org.json.*; import org.json.*;
@ -9,7 +8,7 @@ public final class json_decode implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); Arguments.check(1, args.length);
try { try {
final String jsonRaw = args[0].asString(); final String jsonRaw = args[0].asString();
final Object root = new JSONTokener(jsonRaw).nextValue(); final Object root = new JSONTokener(jsonRaw).nextValue();

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
import java.util.Map; import java.util.Map;
import org.json.*; import org.json.*;
@ -9,7 +8,7 @@ public final class json_encode implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); Arguments.check(1, args.length);
try { try {
final Object root = process(args[0]); final Object root = process(args[0]);
final String jsonRaw = JSONObject.valueToString(root); final String jsonRaw = JSONObject.valueToString(root);

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class robot_exec implements Function { public final class robot_exec implements Function {
@ -15,7 +14,7 @@ public final class robot_exec implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length == 0) throw new ArgumentsMismatchException("At least one argument expected"); Arguments.checkAtLeast(1, args.length);
try { try {
final Process process; final Process process;

View File

@ -1,6 +1,6 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException; import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function; import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.NumberValue; import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Value; import com.annimon.ownlang.lib.Value;
@ -11,8 +11,7 @@ public final class robot_toclipboard implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); Arguments.check(1, args.length);
Toolkit.getDefaultToolkit().getSystemClipboard() Toolkit.getDefaultToolkit().getSystemClipboard()
.setContents(new StringSelection(args[0].asString()), null); .setContents(new StringSelection(args[0].asString()), null);
return NumberValue.ZERO; return NumberValue.ZERO;

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
@ -8,7 +7,7 @@ public final class std_arrayCombine implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 2) throw new ArgumentsMismatchException("Two arguments expected"); Arguments.check(2, args.length);
if (args[0].type() != Types.ARRAY) { if (args[0].type() != Types.ARRAY) {
throw new TypeException("Array expected in first argument"); throw new TypeException("Array expected in first argument");
} }

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
@ -8,7 +7,7 @@ public final class std_arrayKeyExists implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 2) throw new ArgumentsMismatchException("Two arguments expected"); Arguments.check(2, args.length);
if (args[1].type() != Types.MAP) { if (args[1].type() != Types.MAP) {
throw new TypeException("Map expected in second argument"); throw new TypeException("Map expected in second argument");
} }

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
import java.util.ArrayList; import java.util.ArrayList;
@ -11,7 +10,7 @@ public final class std_arrayKeys implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); Arguments.check(1, args.length);
if (args[0].type() != Types.MAP) { if (args[0].type() != Types.MAP) {
throw new TypeException("Map expected in first argument"); throw new TypeException("Map expected in first argument");
} }

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
import java.util.ArrayList; import java.util.ArrayList;
@ -11,7 +10,7 @@ public final class std_arrayValues implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); Arguments.check(1, args.length);
if (args[0].type() != Types.MAP) { if (args[0].type() != Types.MAP) {
throw new TypeException("Map expected in first argument"); throw new TypeException("Map expected in first argument");
} }

View File

@ -1,14 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_charat implements Function { public final class std_charat implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 2) throw new ArgumentsMismatchException("Two arguments expected"); Arguments.check(2, args.length);
final String input = args[0].asString(); final String input = args[0].asString();
final int index = args[1].asInt(); final int index = args[1].asInt();

View File

@ -1,13 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_indexof implements Function { public final class std_indexof implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length < 2 || args.length > 3) throw new ArgumentsMismatchException("Two or three arguments expected"); Arguments.checkOrOr(2, 3, args.length);
final String input = args[0].asString(); final String input = args[0].asString();
final String what = args[1].asString(); final String what = args[1].asString();

View File

@ -8,7 +8,7 @@ public final class std_join implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length < 1) throw new ArgumentsMismatchException("At least one argument expected"); Arguments.checkRange(1, 4, args.length);
if (args[0].type() != Types.ARRAY) { if (args[0].type() != Types.ARRAY) {
throw new TypeException("Array expected in first argument"); throw new TypeException("Array expected in first argument");
} }

View File

@ -1,13 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_lastindexof implements Function { public final class std_lastindexof implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length < 2 || args.length > 3) throw new ArgumentsMismatchException("Two or three arguments expected"); Arguments.checkOrOr(2, 3, args.length);
final String input = args[0].asString(); final String input = args[0].asString();
final String what = args[1].asString(); final String what = args[1].asString();

View File

@ -1,16 +1,15 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_length implements Function { public final class std_length implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length == 0) throw new ArgumentsMismatchException("At least one arg expected"); Arguments.check(1, args.length);
final Value val = args[0]; final Value val = args[0];
int length; final int length;
switch (val.type()) { switch (val.type()) {
case Types.ARRAY: case Types.ARRAY:
length = ((ArrayValue) val).size(); length = ((ArrayValue) val).size();

View File

@ -1,5 +1,6 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function; import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.NumberValue; import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Value; import com.annimon.ownlang.lib.Value;
@ -12,6 +13,7 @@ public final class std_rand implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
Arguments.checkRange(0, 2, args.length);
if (args.length == 0) return new NumberValue(RND.nextDouble()); if (args.length == 0) return new NumberValue(RND.nextDouble());
int from = 0; int from = 0;

View File

@ -1,13 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_replace implements Function { public final class std_replace implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 3) throw new ArgumentsMismatchException("Three arguments expected"); Arguments.check(3, args.length);
final String input = args[0].asString(); final String input = args[0].asString();
final String target = args[1].asString(); final String target = args[1].asString();

View File

@ -1,13 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_replaceall implements Function { public final class std_replaceall implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 3) throw new ArgumentsMismatchException("Three arguments expected"); Arguments.check(3, args.length);
final String input = args[0].asString(); final String input = args[0].asString();
final String regex = args[1].asString(); final String regex = args[1].asString();

View File

@ -1,13 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_replacefirst implements Function { public final class std_replacefirst implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 3) throw new ArgumentsMismatchException("Three arguments expected"); Arguments.check(3, args.length);
final String input = args[0].asString(); final String input = args[0].asString();
final String regex = args[1].asString(); final String regex = args[1].asString();

View File

@ -1,6 +1,6 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException; import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function; import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.NumberValue; import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Value; import com.annimon.ownlang.lib.Value;
@ -9,7 +9,7 @@ public final class std_sleep implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); Arguments.check(1, args.length);
try { try {
Thread.sleep((long) args[0].asNumber()); Thread.sleep((long) args[0].asNumber());

View File

@ -9,7 +9,7 @@ public final class std_sort implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length < 1) throw new ArgumentsMismatchException("At least one argument expected"); Arguments.checkAtLeast(1, args.length);
if (args[0].type() != Types.ARRAY) { if (args[0].type() != Types.ARRAY) {
throw new TypeException("Array expected in first argument"); throw new TypeException("Array expected in first argument");
} }

View File

@ -1,13 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_split implements Function { public final class std_split implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length < 2 || args.length > 3) throw new ArgumentsMismatchException("Two or three arguments expected"); Arguments.checkOrOr(2, 3, args.length);
final String input = args[0].asString(); final String input = args[0].asString();
final String regex = args[1].asString(); final String regex = args[1].asString();

View File

@ -1,13 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_sprintf implements Function { public final class std_sprintf implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length < 1) throw new ArgumentsMismatchException("At least one argument expected"); Arguments.checkAtLeast(1, args.length);
final String format = args[0].asString(); final String format = args[0].asString();
final Object[] values = new Object[args.length - 1]; final Object[] values = new Object[args.length - 1];

View File

@ -1,13 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_substring implements Function { public final class std_substring implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length < 2 || args.length > 3) throw new ArgumentsMismatchException("Two or three arguments expected"); Arguments.checkOrOr(2, 3, args.length);
final String input = args[0].asString(); final String input = args[0].asString();
final int startIndex = args[1].asInt(); final int startIndex = args[1].asInt();

View File

@ -1,16 +1,13 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.Console; import com.annimon.ownlang.Console;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_thread implements Function { public final class std_thread implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
// Создаём новый поток и передаём параметры, если есть. Arguments.checkAtLeast(1, args.length);
// Функция может передаваться как напрямую, так и по имени
if (args.length == 0) throw new ArgumentsMismatchException("At least one arg expected");
Function body; Function body;
if (args[0].type() == Types.FUNCTION) { if (args[0].type() == Types.FUNCTION) {

View File

@ -1,14 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_tochar implements Function { public final class std_tochar implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); Arguments.check(1, args.length);
return new StringValue(String.valueOf((char) args[0].asInt())); return new StringValue(String.valueOf((char) args[0].asInt()));
} }
} }

View File

@ -1,14 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_tolowercase implements Function { public final class std_tolowercase implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); Arguments.check(1, args.length);
return new StringValue(args[0].asString().toLowerCase()); return new StringValue(args[0].asString().toLowerCase());
} }
} }

View File

@ -1,14 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_touppercase implements Function { public final class std_touppercase implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); Arguments.check(1, args.length);
return new StringValue(args[0].asString().toUpperCase()); return new StringValue(args[0].asString().toUpperCase());
} }
} }

View File

@ -1,14 +1,12 @@
package com.annimon.ownlang.lib.modules.functions; package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
public final class std_trim implements Function { public final class std_trim implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); Arguments.check(1, args.length);
return new StringValue(args[0].asString().trim()); return new StringValue(args[0].asString().trim());
} }
} }

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules; package com.annimon.ownlang.lib.modules;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
import java.util.function.DoubleBinaryOperator; import java.util.function.DoubleBinaryOperator;
import java.util.function.DoubleFunction; import java.util.function.DoubleFunction;
@ -58,14 +57,14 @@ public final class math implements Module {
private static Function functionConvert(DoubleUnaryOperator op) { private static Function functionConvert(DoubleUnaryOperator op) {
return args -> { return args -> {
if (args.length != 1) throw new ArgumentsMismatchException("One arg expected"); Arguments.check(1, args.length);
return doubleToNumber.apply(op.applyAsDouble(args[0].asNumber())); return doubleToNumber.apply(op.applyAsDouble(args[0].asNumber()));
}; };
} }
private static Function biFunctionConvert(DoubleBinaryOperator op) { private static Function biFunctionConvert(DoubleBinaryOperator op) {
return args -> { return args -> {
if (args.length != 2) throw new ArgumentsMismatchException("Two args expected"); Arguments.check(2, args.length);
return doubleToNumber.apply(op.applyAsDouble(args[0].asNumber(), args[1].asNumber())); return doubleToNumber.apply(op.applyAsDouble(args[0].asNumber(), args[1].asNumber()));
}; };
} }

View File

@ -28,6 +28,7 @@ public final class ounit implements Module {
private static class assertEquals implements Function { private static class assertEquals implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
Arguments.check(2, args.length);
if (args[0].equals(args[1])) return NumberValue.ONE; if (args[0].equals(args[1])) return NumberValue.ONE;
throw new OUnitAssertionException("Values are not equals: " throw new OUnitAssertionException("Values are not equals: "
+ "1: " + args[0] + ", 2: " + args[1]); + "1: " + args[0] + ", 2: " + args[1]);
@ -37,6 +38,7 @@ public final class ounit implements Module {
private static class assertNotEquals implements Function { private static class assertNotEquals implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
Arguments.check(2, args.length);
if (!args[0].equals(args[1])) return NumberValue.ONE; if (!args[0].equals(args[1])) return NumberValue.ONE;
throw new OUnitAssertionException("Values are equals: " + args[0]); throw new OUnitAssertionException("Values are equals: " + args[0]);
} }
@ -45,6 +47,7 @@ public final class ounit implements Module {
private static class assertSameType implements Function { private static class assertSameType implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
Arguments.check(2, args.length);
if (args[0].type() == args[1].type()) return NumberValue.ONE; if (args[0].type() == args[1].type()) return NumberValue.ONE;
throw new OUnitAssertionException("Types mismatch. " throw new OUnitAssertionException("Types mismatch. "
+ "1: " + Types.typeToString(args[0].type()) + "1: " + Types.typeToString(args[0].type())
@ -55,6 +58,7 @@ public final class ounit implements Module {
private static class assertTrue implements Function { private static class assertTrue implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
Arguments.check(1, args.length);
if (args[0].asInt() != 0) return NumberValue.ONE; if (args[0].asInt() != 0) return NumberValue.ONE;
throw new OUnitAssertionException("Expected true, but found false."); throw new OUnitAssertionException("Expected true, but found false.");
} }
@ -63,6 +67,7 @@ public final class ounit implements Module {
private static class assertFalse implements Function { private static class assertFalse implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
Arguments.check(1, args.length);
if (args[0].asInt() == 0) return NumberValue.ONE; if (args[0].asInt() == 0) return NumberValue.ONE;
throw new OUnitAssertionException("Expected false, but found true."); throw new OUnitAssertionException("Expected false, but found true.");
} }

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang.lib.modules; package com.annimon.ownlang.lib.modules;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.lib.modules.functions.robot_exec; import com.annimon.ownlang.lib.modules.functions.robot_exec;
import com.annimon.ownlang.lib.modules.functions.robot_fromclipboard; import com.annimon.ownlang.lib.modules.functions.robot_fromclipboard;
@ -43,14 +42,14 @@ public final class robot implements Module {
Functions.set("mouseRelease", convertFunction(awtRobot::mouseRelease)); Functions.set("mouseRelease", convertFunction(awtRobot::mouseRelease));
Functions.set("mouseWheel", convertFunction(awtRobot::mouseWheel)); Functions.set("mouseWheel", convertFunction(awtRobot::mouseWheel));
Functions.set("mouseMove", (args) -> { Functions.set("mouseMove", (args) -> {
if (args.length != 2) throw new ArgumentsMismatchException("Two arguments expected"); Arguments.check(2, args.length);
try { try {
awtRobot.mouseMove(args[0].asInt(), args[1].asInt()); awtRobot.mouseMove(args[0].asInt(), args[1].asInt());
} catch (IllegalArgumentException iae) { } } catch (IllegalArgumentException iae) { }
return NumberValue.ZERO; return NumberValue.ZERO;
}); });
Functions.set("typeText", (args) -> { Functions.set("typeText", (args) -> {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); Arguments.check(1, args.length);
try { try {
typeText(args[0].asString()); typeText(args[0].asString());
} catch (IllegalArgumentException iae) { } } catch (IllegalArgumentException iae) { }
@ -87,7 +86,7 @@ public final class robot implements Module {
private static Function convertFunction(RobotIntConsumer consumer) { private static Function convertFunction(RobotIntConsumer consumer) {
return args -> { return args -> {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); Arguments.check(1, args.length);
try { try {
consumer.accept(args[0].asInt()); consumer.accept(args[0].asInt());
} catch (IllegalArgumentException iae) { } } catch (IllegalArgumentException iae) { }