Пример #1
0
        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);
        }