package org.manalith.ircbot.plugin.curex;
import java.util.ArrayList;
import org.manalith.ircbot.plugin.curex.TokenObject.TokenType;
import org.manalith.ircbot.plugin.curex.exceptions.IllegalArgumentException;
import org.manalith.ircbot.plugin.curex.exceptions.MissingArgumentException;
public class CommandParser {
private String[] opt;
private ArrayList<TokenObject> intArr;
public CommandParser(String[] options) {
opt = new String[options.length];
for (int i = 0; i < options.length; i++)
opt[i] = options[i];
intArr = new ArrayList<>();
}
public ArrayList<TokenObject> parse() throws Exception {
ArrayList<TokenObject> result = new ArrayList<>();
for (String str : opt)
intArr.add(new TokenObject(str));
switch (intArr.size()) { // number of arguments
case 0:
result.add(new TokenObject("show"));
break;
case 1:
switch (intArr.get(0).getTokenType().value()) {
case 0: // Command
switch (intArr.get(0).getTokenSubtype().value()) {
case 0:
case 1:
case 3: // show, help, unitlist
result.add(intArr.get(0));
break;
case 2: // calc
throw new MissingArgumentException(1);
case 7: // UnDefined
throw new IllegalArgumentException(1);
}
break;
case 1: // Unit
result.add(new TokenObject("show"));
result.add(intArr.get(0));
break;
case 2: // Number
result.add(new TokenObject("calc"));
result.add(intArr.get(0));
result.add(new TokenObject("USD"));
result.add(new TokenObject("KRW"));
break;
case 3: // Unknown
throw new IllegalArgumentException(1);
}
break;
case 2:
switch (intArr.get(0).getTokenType().value()) {
case 0: // Command
switch (intArr.get(0).getTokenSubtype().value()) {
case 0: // show
if (!intArr.get(1).getTokenType().equals(TokenType.Unit))
throw new IllegalArgumentException(2);
else {
result.add(intArr.get(0));
result.add(intArr.get(1));
}
break;
case 1:
case 3:
case 7: // help, unitlist, Undefined
throw new IllegalArgumentException(2);
case 2: // calc
if (intArr.get(1).getTokenType().equals(TokenType.Unit)) {
result.add(intArr.get(0));
result.add(new TokenObject("1.0"));
result.add(intArr.get(1));
result.add(new TokenObject("KRW"));
} else if (intArr.get(1).getTokenType()
.equals(TokenType.Number)) {
result.add(intArr.get(0));
result.add(intArr.get(1));
result.add(new TokenObject("USD"));
result.add(new TokenObject("KRW"));
} else
throw new IllegalArgumentException(2);
}
break;
case 1: // Unit
if (!intArr.get(1).getTokenType().equals(TokenType.Unit))
throw new IllegalArgumentException(2);
else {
result.add(new TokenObject("calc"));
result.add(new TokenObject("1.0"));
result.add(intArr.get(0));
result.add(intArr.get(1));
}
break;
case 2: // Number
if (!intArr.get(1).getTokenType().equals(TokenType.Unit))
throw new IllegalArgumentException(2);
else {
result.add(new TokenObject("calc"));
result.add(intArr.get(0));
result.add(intArr.get(1));
result.add(new TokenObject("KRW"));
}
break;
case 3:
throw new IllegalArgumentException(2);
}
break;
case 3:
switch (intArr.get(0).getTokenType().value()) {
case 0: // command
switch (intArr.get(0).getTokenSubtype().value()) {
case 0:
case 1:
case 3:
case 7:
// show, help, unitlist, unknown
throw new IllegalArgumentException(1);
case 2: // calc
if (!intArr.get(1).getTokenType().equals(TokenType.Number)
&& !intArr.get(1).getTokenType()
.equals(TokenType.Unit))
throw new IllegalArgumentException(2);
if (!intArr.get(2).getTokenType().equals(TokenType.Unit))
throw new IllegalArgumentException(3);
result.add(intArr.get(0));
if (intArr.get(1).getTokenType().equals(TokenType.Number)) {
result.add(intArr.get(1));
result.add(intArr.get(2));
result.add(new TokenObject("KRW"));
} else if (intArr.get(1).getTokenType()
.equals(TokenType.Unit)) {
result.add(new TokenObject("1.0"));
result.add(intArr.get(1));
result.add(intArr.get(2));
}
break;
}
break;
case 1:
case 3: // unit, undefined
throw new IllegalArgumentException(3);
case 2: // number
if (!intArr.get(1).getTokenType().equals(TokenType.Unit))
throw new IllegalArgumentException(2);
if (!intArr.get(2).getTokenType().equals(TokenType.Unit))
throw new IllegalArgumentException(3);
result.add(new TokenObject("calc"));
result.add(intArr.get(0));
result.add(intArr.get(1));
result.add(intArr.get(2));
break;
}
break;
}
return result;
}
}