Skip to content

Commit

Permalink
Merge pull request #6 from Etherna/feature/UF-10-to-local-ufile
Browse files Browse the repository at this point in the history
add ToLocalUFile feature
  • Loading branch information
tmm360 authored Aug 4, 2024
2 parents 39e1efd + 5626e94 commit d6cb5d1
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/UniversalFiles/IUFileProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,18 @@
// You should have received a copy of the GNU Lesser General Public License along with UniversalFiles.
// If not, see <https://www.gnu.org/licenses/>.

using System.Threading.Tasks;

namespace Etherna.UniversalFiles
{
public interface IUFileProvider
{
UFile BuildNewUFile(UUri uuri);

Task<BasicUFile> ToLocalUFileAsync(
UFile inputUFile,
UUriKind allowedUriKinds = UUriKind.All,
string? baseDirectory = null,
BasicUUri? outputUUri = null);
}
}
33 changes: 33 additions & 0 deletions src/UniversalFiles/UFileProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

namespace Etherna.UniversalFiles
{
Expand All @@ -39,5 +41,36 @@ public UFile BuildNewUFile(UUri uuri)

public void RegisterUUriType<TUUri>(Func<TUUri, UFile> builder) where TUUri : UUri =>
uFileBuilders[typeof(TUUri)] = uuri => builder((TUUri)uuri);

public async Task<BasicUFile> ToLocalUFileAsync(
UFile inputUFile,
UUriKind allowedUriKinds = UUriKind.All,
string? baseDirectory = null,
BasicUUri? outputUUri = null)
{
ArgumentNullException.ThrowIfNull(inputUFile, nameof(inputUFile));

// If it's already a local file, skip file retrieve.
if (inputUFile is BasicUFile basicUFile &&
(basicUFile.FileUri.UriKind & allowedUriKinds & UUriKind.Local) != 0)
return basicUFile;

if (outputUUri != null && outputUUri.UriKind != UUriKind.LocalAbsolute)
throw new InvalidOperationException("If provided, output uuri must be local and absolute");

if (outputUUri is null)
{
var fileName = await inputUFile.TryGetFileNameAsync().ConfigureAwait(false);
outputUUri = fileName is null ?
new BasicUUri(Path.GetTempFileName()) :
new BasicUUri(Path.Join(Path.GetTempPath(), fileName));
}

using var inputFileStream = (await inputUFile.ReadToStreamAsync(allowedUriKinds, baseDirectory).ConfigureAwait(false)).Stream;
using var outputFileStream = new FileStream(outputUUri.ToAbsoluteUri().Item1, FileMode.Create);
await inputFileStream.CopyToAsync(outputFileStream).ConfigureAwait(false);

return (BasicUFile)BuildNewUFile(outputUUri);
}
}
}

0 comments on commit d6cb5d1

Please sign in to comment.