package net.minecraft.command.type.custom.json; import java.lang.reflect.Type; import java.util.Collections; import java.util.Set; import net.minecraft.command.ParsingUtilities; import net.minecraft.command.collections.Completers; import net.minecraft.command.completion.ITabCompletion; import net.minecraft.command.type.IComplete; import net.minecraft.command.type.IExParse; import net.minecraft.command.type.custom.json.ParserJsonObject.JsonObjectData; public class JsonDescriptor { private JsonDescriptor() { } public static interface Typed { public Set<Type> type(); } public static class TypedImplementation implements Typed { private final Set<Type> type; public TypedImplementation(final Type... type) { this.type = ParsingUtilities.setOrNull(type); } @Override public Set<Type> type() { return this.type; } } public static interface Element extends Typed { public ParserJsonElement getElementParser(); public ParserJsonArray getArrayParser(); public ParserJsonObject getObjectParser(); } public static interface Object extends Typed { public IExParse<Void, JsonObjectData> getPair(); public Set<ITabCompletion> getKeyCompletions(); public Element getSubDescriptor(String key); } public static interface Array extends Typed { public Element getElementDescriptor(int index); } public static abstract class AllDescriptor implements Element, Object, Array { } private static final DefaultObject primitiveObject = new DefaultObject(); private static final DefaultArray primitiveArray = new DefaultArray(); public static final Element defaultElement = new DefaultElement(); public static final Element defaultArray = new DefaultElement(Completers.bracketCompleter); public static final Element defaultObject = new DefaultElement(Completers.braceCompleter); public static final class DefaultElement implements Element { private final ParserJsonElement elementParser; private final ParserJsonArray arrayParser = new ParserJsonArray(primitiveArray); private final ParserJsonObject objectParser = new ParserJsonObject(primitiveObject); private final Set<Type> type; private DefaultElement() { this.type = null; this.elementParser = new ParserJsonElement(this); } public DefaultElement(final IComplete completer) { this.type = null; this.elementParser = new ParserJsonElement(this, completer); } public DefaultElement(final IComplete completer, final Type... type) { this.type = ParsingUtilities.setOrNull(type); this.elementParser = new ParserJsonElement(this, completer); } @Override public ParserJsonElement getElementParser() { return this.elementParser; } @Override public ParserJsonArray getArrayParser() { return this.arrayParser; } @Override public ParserJsonObject getObjectParser() { return this.objectParser; } @Override public Set<Type> type() { return this.type; } }; private static class DefaultObject extends TypedImplementation implements JsonDescriptor.Object { private final TypeJsonPair pair = new TypeJsonPair(this); @Override public Element getSubDescriptor(final String key) { return defaultElement; } @Override public IExParse<Void, JsonObjectData> getPair() { return this.pair; } @Override public Set<ITabCompletion> getKeyCompletions() { return Collections.emptySet(); } }; private static class DefaultArray extends TypedImplementation implements Array { @Override public Element getElementDescriptor(final int index) { return defaultElement; } }; }