using System; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Threading.Tasks; using Avalonia.Platform; using StabilityMatrix.Core.Helper; using StabilityMatrix.Core.Models.FileInterfaces; namespace StabilityMatrix.Avalonia.Models; [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] public readonly record struct AvaloniaResource( Uri UriPath, UnixFileMode WriteUnixFileMode = UnixFileMode.None) { /// /// File name component of the Uri path. /// public string FileName => Path.GetFileName(UriPath.ToString()); /// /// File path relative to the 'Assets' folder. /// public Uri RelativeAssetPath => new Uri("avares://StabilityMatrix.Avalonia/Assets/").MakeRelativeUri(UriPath); public AvaloniaResource(string uriPath, UnixFileMode writeUnixFileMode = UnixFileMode.None) : this(new Uri(uriPath), writeUnixFileMode) { } /// /// Opens a stream to this resource. /// public Stream Open() => AssetLoader.Open(UriPath); /// /// Extracts this resource to a target file path. /// public async Task ExtractTo(FilePath outputPath, bool overwrite = true) { if (outputPath.Exists) { // Skip if not overwriting if (!overwrite) return; // Otherwise delete the file outputPath.Delete(); } var stream = AssetLoader.Open(UriPath); await using var fileStream = File.Create(outputPath); await stream.CopyToAsync(fileStream); // Write permissions if (!Compat.IsWindows && Compat.IsUnix && WriteUnixFileMode != UnixFileMode.None) { File.SetUnixFileMode(outputPath, WriteUnixFileMode); } } /// /// Extracts this resource to the output directory. /// public Task ExtractToDir(DirectoryPath outputDir, bool overwrite = true) { return ExtractTo(outputDir.JoinFile(FileName), overwrite); } }