public ParsingResult<IModeLauncher> Parse(string[] args, TextWriter standardWriter, TextWriter errorWriter)
{
if (args.Empty() || !_modeParsers.ContainsKey(args[0]))
{
return GetMissingModeResult(args, standardWriter, errorWriter);
}
var mode = _modeParsers[args[0]];
var options = new OptionCollection<IModeLauncher> { BaseOptionsParser, mode };
var result = options.Parse(args.Skip(1));
ParsingResult<IModeLauncher> failedResult;
if (!result.RemainingArgs.Any() && HandleBaseOptions(result.Get(BaseOptionsParser).Result, standardWriter, mode))
return ParsingResult<IModeLauncher>.SuccesfulResult(new NullModeLauncher());
if (!result.Validate(out failedResult))
{
errorWriter.WriteLine(failedResult.ErrorMessage);
errorWriter.WriteLine();
ShowHelp(errorWriter, mode);
return failedResult;
}
var runner = result.Get(mode).Result;
return ParsingResult<IModeLauncher>.SuccesfulResult(new ModeLauncher(runner, args, GetVersion(), mode.Name));
}