All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.airlift.command.ParseState Maven / Gradle / Ivy

Go to download

Airline is a Java annotation-based framework for parsing Git like command line structures.

The newest version!
package io.airlift.command;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ListMultimap;
import io.airlift.command.model.CommandGroupMetadata;
import io.airlift.command.model.CommandMetadata;
import io.airlift.command.model.OptionMetadata;

import java.util.List;

public class ParseState
{
    private final List locationStack;
    private final CommandGroupMetadata group;
    private final CommandMetadata command;
    private final ListMultimap parsedOptions;
    private final List parsedArguments;
    private final OptionMetadata currentOption;
    private final List unparsedInput; 

    ParseState(CommandGroupMetadata group,
            CommandMetadata command,
            ListMultimap parsedOptions,
            List locationStack,
            List parsedArguments,
            OptionMetadata currentOption,
            List unparsedInput)
    {
        this.group = group;
        this.command = command;
        this.parsedOptions = parsedOptions;
        this.locationStack = locationStack;
        this.parsedArguments = parsedArguments;
        this.currentOption = currentOption;
        this.unparsedInput = unparsedInput;
    }

    public static ParseState newInstance()
    {
        return new ParseState(null, null, ArrayListMultimap.create(), ImmutableList.of(), ImmutableList.of(), null, ImmutableList.of());
    }

    public ParseState pushContext(Context location)
    {
        ImmutableList locationStack = ImmutableList.builder()
                .addAll(this.locationStack)
                .add(location)
                .build();

        return new ParseState(group, command, parsedOptions, locationStack, parsedArguments, currentOption, unparsedInput);
    }

    public ParseState popContext()
    {
        ImmutableList locationStack = ImmutableList.copyOf(this.locationStack.subList(0, this.locationStack.size() - 1));
        return new ParseState(group, command, parsedOptions, locationStack, parsedArguments, currentOption, unparsedInput);
    }

    public ParseState withOptionValue(OptionMetadata option, Object value)
    {
        ImmutableListMultimap newOptions = ImmutableListMultimap.builder()
                .putAll(parsedOptions)
                .put(option, value)
                .build();

        return new ParseState(group, command, newOptions, locationStack, parsedArguments, currentOption, unparsedInput);
    }

    public ParseState withGroup(CommandGroupMetadata group)
    {
        return new ParseState(group, command, parsedOptions, locationStack, parsedArguments, currentOption, unparsedInput);
    }

    public ParseState withCommand(CommandMetadata command)
    {
        return new ParseState(group, command, parsedOptions, locationStack, parsedArguments, currentOption, unparsedInput);
    }

    public ParseState withOption(OptionMetadata option)
    {
        return new ParseState(group, command, parsedOptions, locationStack, parsedArguments, option, unparsedInput);
    }

    public ParseState withArgument(Object argument)
    {
        ImmutableList newArguments = ImmutableList.builder()
                .addAll(parsedArguments)
                .add(argument)
                .build();

        return new ParseState(group, command, parsedOptions, locationStack, newArguments, currentOption, unparsedInput);
    }


    public ParseState withUnparsedInput(String input)
    {
        ImmutableList newUnparsedInput = ImmutableList.builder()
                .addAll(unparsedInput)
                .add(input)
                .build();

        return new ParseState(group, command, parsedOptions, locationStack, parsedArguments, currentOption, newUnparsedInput);
    }

    @Override
    public String toString()
    {
        return "ParseState{" +
                "locationStack=" + locationStack +
                ", group=" + group +
                ", command=" + command +
                ", parsedOptions=" + parsedOptions +
                ", parsedArguments=" + parsedArguments +
                ", currentOption=" + currentOption +
                ", unparsedInput=" + unparsedInput +
                '}';
    }

    public Context getLocation()
    {
        return locationStack.get(locationStack.size() - 1);
    }

    public CommandGroupMetadata getGroup()
    {
        return group;
    }

    public CommandMetadata getCommand()
    {
        return command;
    }

    public OptionMetadata getCurrentOption()
    {
        return currentOption;
    }

    public ListMultimap getParsedOptions()
    {
        return parsedOptions;
    }

    public List getParsedArguments()
    {
        return parsedArguments;
    }

    public List getUnparsedInput()
    {
        return unparsedInput;
    }
}