/*
* Copyright (c) 2023 Vaughn Nugent
*
* Library: VNLib
* Package: VNLib.Plugins.Extensions.Data
* File: FsExtensions.cs
*
* FsExtensions.cs is part of VNLib.Plugins.Extensions.Data which is part
* of the larger VNLib collection of libraries and utilities.
*
* VNLib.Plugins.Extensions.Data is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* VNLib.Plugins.Extensions.Data is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see https://www.gnu.org/licenses/.
*/
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace VNLib.Plugins.Extensions.Data.Storage
{
///
/// Contains filesystem extension methods
///
public static class FsExtensions
{
///
/// Creates a new scope for the given filesystem. All operations will be offset by the given path
/// within the parent filesystem.
///
///
/// The base path to prepend to all requests
/// A new with a new filesystem directory scope
public static ISimpleFilesystem CreateNewScope(this ISimpleFilesystem fs, string offsetPath) => new FsScope(fs, offsetPath);
private sealed record class FsScope(ISimpleFilesystem Parent, string OffsetPath) : ISimpleFilesystem
{
public Task DeleteFileAsync(string filePath, CancellationToken cancellation)
{
string path = Path.Combine(OffsetPath, filePath);
return Parent.DeleteFileAsync(path, cancellation);
}
public string GetExternalFilePath(string filePath)
{
string path = Path.Combine(OffsetPath, filePath);
return Parent.GetExternalFilePath(path);
}
public Task ReadFileAsync(string filePath, Stream output, CancellationToken cancellation)
{
string path = Path.Combine(OffsetPath, filePath);
return Parent.ReadFileAsync(path, output, cancellation);
}
public Task SetFileAsync(string filePath, Stream data, string contentType, CancellationToken cancellation)
{
string path = Path.Combine(OffsetPath, filePath);
return Parent.SetFileAsync(path, data, contentType, cancellation);
}
}
}
}