protected InputFile[] GetInputFiles(BuiltTask task)
        {
            task.Message = "Resolving input files.";
            var sourceFiles = Args.InputFiles
                              .SelectMany(a => _fileSystem.GetFileNames(a, Args.RecursiveInputFiles));

            if (Args.FilesAreZipArchives)
            {
                return(GetArchivedFiles(sourceFiles));
            }

            return(sourceFiles
                   .Select(sf =>
            {
                var info = new FileInfo(sf);

                if (info.Exists)
                {
                    return new InputFile(
                        sf,
                        () => _fileSystem.OpenRead(sf),
                        f => _fileSystem.OpenRead(Path.Combine(Path.GetDirectoryName(sf), f)),
                        s => s.Dispose())
                    {
                        Length = info.Length
                    };
                }
                else
                {
                    throw new RhythmCodexException($"File doesn't exist: {sf}");
                }
            })
                   .ToArray());
        }
        protected ITask Build(string name, Func <BuiltTask, bool> task)
        {
            BuiltTask result = null;

            result = new BuiltTask(name, () => task(result));
            result.MessageUpdated += (sender, message) => Logger.Info(message);
            return(result);
        }
 protected byte[] GetFile(BuiltTask task, InputFile inputFile)
 {
     task.Message = $"Reading {inputFile}";
     using (var stream = inputFile.Open())
     {
         var reader = new BinaryReader(stream);
         return(reader.ReadBytes((int)stream.Length));
     }
 }
        protected void ParallelProgress <T>(BuiltTask task, ICollection <T> items, Action <T> action)
        {
            var progressIncrement = 1 / (float)items.Count;

            foreach (var item in items.AsParallel())
            {
                action(item);
                task.Progress += progressIncrement;
            }
        }
        protected Stream OpenWriteSingle(BuiltTask task, InputFile inputFile, Func <string, string> generateName)
        {
            if (_fileSystem == null)
            {
                throw new RhythmCodexException("Filesystem is not defined.");
            }
            var path         = GetOutputFolder(inputFile.Name);
            var newName      = generateName(Path.GetFileNameWithoutExtension(inputFile.Name));
            var newPath      = Path.Combine(path, newName);
            var newDirectory = Path.GetDirectoryName(newPath);

            task.Message = $"Writing {newPath}";
            _fileSystem.CreateDirectory(newDirectory);
            return(_fileSystem.OpenWrite(newPath));
        }
 protected Stream OpenRead(BuiltTask task, InputFile inputFile)
 {
     task.Message = $"Opening {inputFile.Name}";
     return(inputFile.Open());
 }