Overgram/generator/src/main/java/io/github/lonamiwebs/overgram/parser/TLObject.java

89 lines
2.5 KiB
Java

package io.github.lonamiwebs.overgram.parser;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TLObject {
public final String fullname;
public final String namespace;
public final String name;
public final int code;
public final List<TLArg> args;
public final String type;
private final Map<String, TLArg> genericDefinitions;
private TLObject(final String fullname, final int code, final List<TLArg> args, final String type,
final Map<String, TLArg> genericDefinitions) {
this.fullname = fullname;
this.code = code;
this.args = args;
this.type = type;
this.genericDefinitions = genericDefinitions;
final String[] nsName = fullname.split("\\.");
if (nsName.length == 1) {
namespace = "";
name = nsName[0];
} else {
namespace = nsName[0];
name = nsName[1];
}
}
public static TLObject fromString(String string) {
String[] tmp;
String name;
String code;
String type;
tmp = string.split("\\s+=\\s+");
string = tmp[0];
type = tmp[1];
tmp = string.split(" ", 2);
name = tmp[0];
string = tmp.length == 1 ? "" : tmp[1];
tmp = name.split("#");
name = tmp[0];
code = tmp.length == 1 ? "0" : tmp[1];
final List<TLArg> args = new ArrayList<>();
final Map<String, TLArg> genericDefinitions = new HashMap<>(1);
if (!string.isEmpty()) {
for (final String part : string.split(" ")) {
final TLArg arg = TLArg.fromString(part, genericDefinitions);
if (arg.genericDefinition) {
genericDefinitions.put(arg.name, arg);
}
args.add(arg);
}
}
return new TLObject(name, Integer.parseUnsignedInt(code, 16), args, type, genericDefinitions);
}
public TLArg typeAsArg() {
return TLArg.fromUnnamedString(type, genericDefinitions);
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append(fullname);
builder.append('#');
builder.append(Integer.toString(code, 16));
for (final TLArg arg : args) {
builder.append(' ');
builder.append(arg.toString());
}
builder.append(" = ");
builder.append(type);
return builder.toString();
}
}