package com.christianwilkie.rdailyprogrammer.c187p1.easy; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by chris on 11/8/2014. */ public class CommandLineArgumentParser { private Map shortFormDefinitionMap; private boolean errorFlag = false; private static String errorOutputString = "Internal error in argument parsing."; public CommandLineArgumentParser() { shortFormDefinitionMap = new HashMap<>(); } public List parseCommandLineArguments(List rawShortFormDefinitions, String rawArgumentLine) { List output; //parse all short form definitions rawShortFormDefinitions.forEach(this::parseShortFormDefinition); //parse the argument lines and form the output output = parseRawArgumentLine(rawArgumentLine); //if there was an error at some point, return bad output info if (errorFlag == true) { List badOutput = new ArrayList<>(1); badOutput.add(errorOutputString); return badOutput; } //no errors, return good info return output; } private void parseShortFormDefinition(String shortFormDefinition) { String[] splitShortFormDefinition = shortFormDefinition.split(":"); if(splitShortFormDefinition.length != 2) { errorFlag = true; } else { shortFormDefinitionMap.put(splitShortFormDefinition[0],splitShortFormDefinition[1]); } } private List parseRawArgumentLine(String rawArgumentLine) { List output = new ArrayList<>(); String[] splitArguments = rawArgumentLine.split(" "); for(String rawArgument: splitArguments) { //add each parsed argument to the output parseCommandLineArgument(rawArgument).forEach(output::add); } return output; } private List parseCommandLineArgument(String rawArgument) { List parsedArguments = new ArrayList<>(); if(rawArgument.startsWith("--")) { //full argument parsedArguments.add("flag: " + rawArgument); } else if (rawArgument.startsWith("-")) { //condensed argument //split up into chars in case there is more than 1 argument, also skip the '-' char[] argumentChars = rawArgument.substring(1).toCharArray(); for(char argument: argumentChars) { //check for definition String fullDefinition = shortFormDefinitionMap.get(String.valueOf(argument)); if (fullDefinition == null) { errorFlag = true; parsedArguments.add(""); } else { parsedArguments.add("flag: " + fullDefinition); } } } else { //parameter parsedArguments.add("parameter: " + rawArgument); } return parsedArguments; } }