89 lines
2.5 KiB
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();
|
|
}
|
|
}
|