private static OptionSet ParseOptions(string[] args, out bool shouldShowHelp) { var showHelp = false; var basicOptions = new OptionSet { { "i|instanceName=", "The instance name [REQUIRED].", i => _instanceName = i }, { "rp|receivePort=", "The service receive from port [REQUIRED].", rp => _serviceReceiveFromPort = int.Parse(rp) }, { "sp|sendPort=", "The service send to port. [REQUIRED]", sp => _serviceSendToPort = int.Parse(sp) }, { "l|log=", "The service log path.", l => _serviceLogPath = l }, }; var helpOption = new OptionSet { { "h|help", "show this message and exit", h => showHelp = h != null }, }; var registerInstanceOptionSet = basicOptions.AddMany(new OptionSet { { "cs|createService=", $"[{string.Join(" | ", GetModesDescriptions().Select(md => $"{md.Item1} - {md.Item2}"))}].", cs => _recoveryMode = (AmbrosiaRecoveryModes)Enum.Parse(typeof(AmbrosiaRecoveryModes), cs, true) }, { "ps|pauseAtStart", "Is pause at start enabled.", ps => _isPauseAtStart = true }, { "npl|noPersistLogs", "Is persistent logging disabled.", ps => _isPersistLogs = false }, { "lts|logTriggerSize=", "Log trigger size (in MBs).", lts => _logTriggerSizeMB = long.Parse(lts) }, { "aa|activeActive", "Is active-active enabled.", aa => _isActiveActive = true }, { "cv|currentVersion=", "The current version #.", cv => _currentVersion = int.Parse(cv) }, { "uv|upgradeVersion=", "The upgrade version #.", uv => _upgradeVersion = int.Parse(uv) }, }); var addReplicaOptionSet = new OptionSet { { "r|replicaNum=", "The replica # [REQUIRED].", r => _replicaNumber = int.Parse(r) }, }.AddMany(registerInstanceOptionSet); var debugInstanceOptionSet = basicOptions.AddMany(new OptionSet { { "c|checkpoint=", "The checkpoint # to load.", c => _checkpointToLoad = long.Parse(c) }, { "cv|currentVersion=", "The version # to debug.", cv => _currentVersion = int.Parse(cv) }, { "tu|testingUpgrade", "Is testing upgrade.", u => _isTestingUpgrade = true }, }); registerInstanceOptionSet = registerInstanceOptionSet.AddMany(helpOption); addReplicaOptionSet = addReplicaOptionSet.AddMany(helpOption); debugInstanceOptionSet = debugInstanceOptionSet.AddMany(helpOption); var runtimeModeToOptionSet = new Dictionary <LocalAmbrosiaRuntimeModes, OptionSet> { { LocalAmbrosiaRuntimeModes.RegisterInstance, registerInstanceOptionSet }, { LocalAmbrosiaRuntimeModes.AddReplica, addReplicaOptionSet }, { LocalAmbrosiaRuntimeModes.DebugInstance, debugInstanceOptionSet }, }; _runtimeMode = default(LocalAmbrosiaRuntimeModes); if (args.Length < 1 || !Enum.TryParse(args[0], true, out _runtimeMode)) { Console.WriteLine("Missing or illegal runtime mode."); ShowHelp(runtimeModeToOptionSet); Environment.Exit(1); } var options = runtimeModeToOptionSet[_runtimeMode]; try { options.Parse(args); } catch (OptionException e) { Console.WriteLine("Invalid arguments: " + e.Message); ShowHelp(options, _runtimeMode); Environment.Exit(1); } shouldShowHelp = showHelp; return(options); }