package net.minecraft.command.construction;
import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.collections4.trie.PatriciaTrie;
import net.minecraft.command.collections.Completers;
import net.minecraft.command.completion.ITabCompletion;
import net.minecraft.command.completion.TabCompletion;
import net.minecraft.command.type.IComplete;
import net.minecraft.command.type.IExParse;
import net.minecraft.command.type.custom.json.JsonDescriptor;
import net.minecraft.command.type.custom.json.JsonDescriptor.AllDescriptor;
import net.minecraft.command.type.custom.json.JsonDescriptor.DefaultElement;
import net.minecraft.command.type.custom.json.JsonDescriptor.Element;
import net.minecraft.command.type.custom.json.JsonDescriptor.TypedImplementation;
import net.minecraft.command.type.custom.json.ParserJsonArray;
import net.minecraft.command.type.custom.json.ParserJsonElement;
import net.minecraft.command.type.custom.json.ParserJsonObject;
import net.minecraft.command.type.custom.json.ParserJsonObject.JsonObjectData;
import net.minecraft.command.type.custom.json.TypeJsonPair;
public final class JsonConstructor extends TypedImplementation implements JsonDescriptor.Object, Element
{
private final Set<ITabCompletion> keyCompletions = new HashSet<>();
private final PatriciaTrie<JsonDescriptor.Element> subDescriptors = new PatriciaTrie<>();
private final ParserJsonElement elementParser = new ParserJsonElement(this, Completers.braceCompleter);
private final ParserJsonObject objectParser = new ParserJsonObject(this);
private final IExParse<Void, JsonObjectData> pair = new TypeJsonPair(this);
public JsonConstructor(final Type... type)
{
super(type);
}
@Override
public Set<ITabCompletion> getKeyCompletions()
{
return this.keyCompletions;
}
@Override
public IExParse<Void, JsonObjectData> getPair()
{
return this.pair;
}
@Override
public Element getSubDescriptor(final String key)
{
final Element subDescriptor = this.subDescriptors.get(key);
if (subDescriptor == null)
return JsonDescriptor.defaultElement;
return subDescriptor;
}
public JsonConstructor key(final String key, final Element subDescriptor)
{
this.subDescriptors.put(key, subDescriptor);
final String s = key + ":";
this.keyCompletions.add(new TabCompletion(s, s, key));
return this;
}
public JsonConstructor key(final String key, final IComplete completer)
{
this.subDescriptors.put(key, new DefaultElement(completer));
final String s = key + ":";
this.keyCompletions.add(new TabCompletion(s, s, key));
return this;
}
public JsonConstructor key(final String... keys)
{
for (final String key : keys)
{
this.subDescriptors.put(key, JsonDescriptor.defaultElement);
final String s = key + ":";
this.keyCompletions.add(new TabCompletion(s, s, key));
}
return this;
}
@Override
public ParserJsonElement getElementParser()
{
return this.elementParser;
}
@Override
public ParserJsonArray getArrayParser()
{
return JsonDescriptor.defaultArray.getArrayParser();
}
@Override
public ParserJsonObject getObjectParser()
{
return this.objectParser;
}
public static class ConstructionHelper
{
protected static final Element defElement = JsonDescriptor.defaultElement;
protected static final Element defObject = JsonDescriptor.defaultObject;
protected static final Element defArray = JsonDescriptor.defaultArray;
protected ConstructionHelper()
{
}
protected static final JsonConstructor object(final Type... type)
{
return new JsonConstructor(type);
}
protected static final JsonConstructorArray array()
{
return new JsonConstructorArray();
}
protected static final JsonConstructorArray array(final Type... type)
{
return new JsonConstructorArray(type);
}
protected static final JsonConstructorArray array(final String... completions)
{
return new JsonConstructorArray(completions);
}
protected static final JsonConstructorArray array(final IComplete completer, final Type... type)
{
return new JsonConstructorArray(completer, type);
}
protected static final JsonConstructorArray array(final Element itemDescriptor, final Type... type)
{
return new JsonConstructorArray(itemDescriptor, type);
}
protected static final JsonConstructorArray array(final String[] completions, final Type... type)
{
return new JsonConstructorArray(completions, type);
}
protected static final AllDescriptor merge(final JsonConstructor object, final JsonConstructorArray array)
{
final Set<Type> mergedTypes = new HashSet<>();
if (object.type() != null)
mergedTypes.addAll(object.type());
if (array.type() != null)
mergedTypes.addAll(array.type());
return new AllDescriptor()
{
ParserJsonElement elementParser = new ParserJsonElement(this, Completers.braceBracketCompleter);
@Override
public Set<Type> type()
{
return mergedTypes;
}
@Override
public ParserJsonElement getElementParser()
{
return this.elementParser;
}
@Override
public ParserJsonArray getArrayParser()
{
return array.getArrayParser();
}
@Override
public ParserJsonObject getObjectParser()
{
return object.getObjectParser();
}
@Override
public IExParse<Void, JsonObjectData> getPair()
{
return object.getPair();
}
@Override
public Set<ITabCompletion> getKeyCompletions()
{
return object.getKeyCompletions();
}
@Override
public Element getSubDescriptor(final String key)
{
return object.getSubDescriptor(key);
}
@Override
public Element getElementDescriptor(final int index)
{
return array.getElementDescriptor(index);
}
};
}
@SafeVarargs
protected static final <T> T[] c(final T... elements)
{
return elements;
}
}
}