package com.framsticks.params.types;
import com.framsticks.params.Param;
import com.framsticks.util.lang.Strings;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Piotr Sniegowski
*/
public class ProcedureParam extends Param {
private Param resultType;
private List argumentsType = new ArrayList();
private static Pattern addressPattern = Pattern.compile("^([^\\(]+)?\\(([^\\)]*)\\)$");
protected static Param parseType(String type, String name) {
return Param.build().type(type).name(name).finish();
}
public void parseSignature(String signature) throws Exception {
if (!Strings.notEmpty(signature)) {
return;
}
Matcher matcher = addressPattern.matcher(signature);
if (!matcher.matches()) {
throw new Exception("invalid signature");
}
String result = Strings.collapse(matcher.group(1));
if (result != null) {
resultType = parseType(result, null);
}
String arguments = matcher.group(2);
if (!Strings.notEmpty(arguments)) {
return;
}
for (String a : arguments.split(",")) {
int space = a.indexOf(' ');
String type;
String name;
if (space == -1) {
type = a;
name = null;
} else {
type = a.substring(0, space);
name = a.substring(space + 1);
}
argumentsType.add(parseType(type, name));
}
}
@Override
public Class> getStorageType() {
return Void.class;
}
public Param getResultType() {
return resultType;
}
public List getArgumentsType() {
return argumentsType;
}
@Override
public String getFramsTypeName() {
return "p";
}
}