Esempio n. 1
0
        private static IReadOnlyList <SourceFile> SearchSourceFiles(
            ArgumentOptionCollection optionCollection,
            IEnumerable <ArgumentToken> fileAndDirectoryToken,
            ILogger logger)
        {
            var sourceFiles = new List <SourceFile>();

            foreach (var token in fileAndDirectoryToken)
            {
                var path = token.Token;
                if (File.Exists(path))
                {
                    AddSourceFileToList(sourceFiles, path, logger);
                }
                else if (Directory.Exists(path))
                {
                    logger.WriteLog($"Searching directory {path}...", LogLevel.Debug);
                    var searchOption = optionCollection.EnableRecursiveDirectorySearch ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
                    foreach (var filePath in Directory.EnumerateFiles(path, "*", searchOption))
                    {
                        AddSourceFileToList(sourceFiles, filePath, logger);
                    }
                }
                else
                {
                    logger.WriteLog($"\"{path}\": No such file or directory.", LogLevel.Error);
                }
            }

            return(sourceFiles);
        }
Esempio n. 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="arguments"></param>
        /// <param name="logger"></param>
        /// <exception cref="ArgumentException"></exception>
        public ArgumentParse(string[] arguments, ILogger logger)
        {
            var tokens = ArgumentToken.ParseArgument(arguments);

            logger.WriteLog("Detecting options from arguments...", LogLevel.Debug);
            var(optionCollection, remainingTokens) = ArgumentOptionCollection.LoadArgumentOptionCollection(tokens, logger);

            logger.WriteLog("Searching source image files from arguments...", LogLevel.Debug);
            var sourceFiles = SearchSourceFiles(optionCollection, remainingTokens, logger);

            this.OptionCollection = optionCollection;
            this.SourceFiles      = sourceFiles;

            logger.WriteLog("Finished parsing arguments", LogLevel.Debug);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="argumentTokens"></param>
        /// <param name="logger"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public static (ArgumentOptionCollection argumentOptionCollection, IReadOnlyList <ArgumentToken> remainingTokens) LoadArgumentOptionCollection(IEnumerable <ArgumentToken> argumentTokens, ILogger logger)
        {
            var argumentOptionCollection = new ArgumentOptionCollection();
            var remainingTokens          = argumentTokens.ToList();

            while (remainingTokens.Any() && IsOptionDeclarationToken(remainingTokens[0]))
            {
                switch (remainingTokens[0].Token)
                {
                case "-w":
                case "--allow-overwrite":
                    argumentOptionCollection.AllowDestinationOverwrite = true;
                    remainingTokens.RemoveAt(0);
                    logger.WriteLog("Allow-overwrite option detected", LogLevel.Debug);
                    break;

                case "-r":
                case "--recursive":
                    argumentOptionCollection.EnableRecursiveDirectorySearch = true;
                    remainingTokens.RemoveAt(0);
                    logger.WriteLog("Search-directory-recursively option detected", LogLevel.Debug);
                    break;

                case "-t":
                case "--output-type":
                    if (remainingTokens.Count < 2)
                    {
                        logger.WriteLog("Output type must be specified after \"-t\" or \"--output-type\" option.", LogLevel.Error);
                        goto err;
                    }
                    try
                    {
                        argumentOptionCollection.DestinationImageFileKind = ImageFileKind.FromExtension(remainingTokens[1].Token);
                    }
                    catch (InvalidOperationException)
                    {
                        logger.WriteLog($"Invalid output type: {remainingTokens[1].Token}", LogLevel.Error);
                        goto err;
                    }
                    remainingTokens.RemoveRange(0, 2);
                    logger.WriteLog("Output-type option detected", LogLevel.Debug);
                    logger.WriteLog($"Output type: {argumentOptionCollection.DestinationImageFileKind}", LogLevel.Debug);
                    break;

                case "-p":
                case "--powerpoint-page-range":
                    if (remainingTokens.Count < 3)
                    {
                        logger.WriteLog("Start and end page num must be specified after \"-p\" or \"--powerpoint-page-range\" option.", LogLevel.Error);
                        goto err;
                    }
                    try
                    {
                        var startPageNum = uint.Parse(remainingTokens[1].Token);
                        var endPageNum   = uint.Parse(remainingTokens[2].Token);
                        var range        = new Range <uint>(startPageNum, endPageNum);
                        argumentOptionCollection.PowerpointPageRange = range;
                    }
                    catch (Exception)
                    {
                        logger.WriteLog($"Invalid page num specified: {remainingTokens[1].Token}, {remainingTokens[2].Token}", LogLevel.Error);
                        goto err;
                    }
                    remainingTokens.RemoveRange(0, 3);
                    logger.WriteLog("Powerpoint-page-range option detected", LogLevel.Debug);
                    logger.WriteLog($"Page range: {argumentOptionCollection.PowerpointPageRange.Start} to {argumentOptionCollection.PowerpointPageRange.End}", LogLevel.Debug);
                    break;

                case "-v":
                case "--version":
                    argumentOptionCollection.EnableVersionInfoDisplay = true;
                    remainingTokens.RemoveAt(0);
                    logger.WriteLog("Version-dislay option detected", LogLevel.Debug);
                    break;

                case "-L":
                case "--log-level":
                    if (remainingTokens.Count < 2)
                    {
                        logger.WriteLog("Logger level must be specified after \"-L\" or \"--show-log\" option.", LogLevel.Error);
                        goto err;
                    }
                    try
                    {
                        var logLevel = Enum.GetValues(typeof(LogLevel)).Cast <LogLevel>().Single(level => level.ToString().ToLower() == remainingTokens[1].Token);
                        logger.SetLogLevel(logLevel);
                    }
                    catch (InvalidOperationException)
                    {
                        logger.WriteLog($"Invalid output type: {remainingTokens[1].Token}", LogLevel.Error);
                        goto err;
                    }
                    remainingTokens.RemoveRange(0, 2);
                    logger.WriteLog("Log-level option detected", LogLevel.Debug);
                    break;

                default:
                    logger.WriteLog($"Unexpected option \"{remainingTokens[0].Token}\"", LogLevel.Error);
                    goto err;
                }
            }

            return(argumentOptionCollection, remainingTokens);

err:
            throw new ArgumentException("Incorrect option argument. See log in detail.");
        }