BookFileProvider.cs
    
    
    
    
    
        Home
            /
src                    /
Calibre.Model.Database                    /
                    BookFileProvider.cs
    
    
            
            using System;
using System.IO;
using System.Threading.Tasks;
using Calibre.Model.Database.Entities;
namespace Calibre.Model.Database
{
    public class BookFileProvider
    {
        public async Task<string> BuildFilePathAsync(
            string bookDirectory,
            Book book,
            Func<Book, Task<Data>> fileSelectorActionAsync
            )
        {
            var file = await fileSelectorActionAsync(book);
            var filePath = Path.Combine(
                bookDirectory,
                book.Path.Replace('/', '\\'),
                $"{file.Name}.{file.Format}"
                );
            return filePath;
        }
        public async Task ReadFileAsync(
            string bookDirectory,
            Book book,
            Func<Book, Task<Data>> fileSelectorActionAsync,
            Func<Stream, Task> readActionAsync
            )
        {
            var filePath = await BuildFilePathAsync(
                bookDirectory,
                book,
                fileSelectorActionAsync
                );
            using (var stream = new FileStream(filePath, FileMode.Open))
            {
                await readActionAsync(stream);
            }
        }
        public async Task<T> ReadFileAsync<T>(
            string bookDirectory,
            Book book,
            Func<Book, Task<Data>> fileSelectorActionAsync,
            Func<Stream, Task<T>> readActionAsync
            ) 
        {
            var filePath = await BuildFilePathAsync(
                bookDirectory, 
                book, 
                fileSelectorActionAsync
                );
            using (var stream = new FileStream(filePath, FileMode.Open))
            {
                var result = await readActionAsync(stream);
                return result;
            }
        }        
    }
}