summaryrefslogtreecommitdiff
path: root/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/SyntaxHelpTopic.java
blob: 7c0bc9de2611b81ebbf71ae33947420a3bdb5d36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package io.dico.dicore.command.chat.help.defaults;

import io.dico.dicore.command.Command;
import io.dico.dicore.command.EMessageType;
import io.dico.dicore.command.ExecutionContext;
import io.dico.dicore.command.ICommandAddress;
import io.dico.dicore.command.chat.Formatting;
import io.dico.dicore.command.chat.help.IHelpComponent;
import io.dico.dicore.command.chat.help.IHelpTopic;
import io.dico.dicore.command.chat.help.SimpleHelpComponent;
import io.dico.dicore.command.parameter.Parameter;
import io.dico.dicore.command.parameter.ParameterList;
import org.bukkit.permissions.Permissible;

import java.util.Collections;
import java.util.List;
import java.util.Map;

public class SyntaxHelpTopic implements IHelpTopic {

    @Override
    public List<IHelpComponent> getComponents(ICommandAddress target, Permissible viewer, ExecutionContext context) {
        if (!target.hasCommand()) {
            return Collections.emptyList();
        }

        String line = context.getFormat(EMessageType.SYNTAX) + "Syntax: "
                + context.getFormat(EMessageType.INSTRUCTION) + target.getAddress()
                + ' ' + getShortSyntax(target, context);

        return Collections.singletonList(new SimpleHelpComponent(line));
    }

    private static String getShortSyntax(ICommandAddress target, ExecutionContext ctx) {
        StringBuilder syntax = new StringBuilder();
        if (target.hasCommand()) {
            Formatting syntaxColor = ctx.getFormat(EMessageType.SYNTAX);
            Formatting highlight = ctx.getFormat(EMessageType.HIGHLIGHT);
            syntax.append(syntaxColor);

            Command command = target.getCommand();
            ParameterList list = command.getParameterList();
            Parameter<?, ?> repeated = list.getRepeatedParameter();

            int requiredCount = list.getRequiredCount();
            List<Parameter<?, ?>> indexedParameters = list.getIndexedParameters();
            for (int i = 0, n = indexedParameters.size(); i < n; i++) {
                syntax.append(i < requiredCount ? " <" : " [");
                Parameter<?, ?> param = indexedParameters.get(i);
                syntax.append(param.getName());
                if (param == repeated) {
                    syntax.append(highlight).append("...").append(syntaxColor);
                }
                syntax.append(i < requiredCount ? '>' : ']');
            }

            Map<String, Parameter<?, ?>> parametersByName = list.getParametersByName();
            for (Parameter<?, ?> param : parametersByName.values()) {
                if (param.isFlag()) {
                    syntax.append(" [").append(param.getName());
                    if (param.expectsInput()) {
                        syntax.append(" <").append(param.getName()).append(">");
                    }
                    syntax.append(']');
                }
            }

        } else {
            syntax.append(' ');
        }
        return syntax.toString();
    }

}