pack/unpack class
This commit is contained in:
62
compiler/NubLib.cs
Normal file
62
compiler/NubLib.cs
Normal file
@@ -0,0 +1,62 @@
|
||||
using System.IO.Compression;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace Compiler;
|
||||
|
||||
public class NubLib
|
||||
{
|
||||
private static readonly JsonSerializerOptions JsonOptions = new()
|
||||
{
|
||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||
WriteIndented = true,
|
||||
};
|
||||
|
||||
public static void Pack(string outputPath, string archivePath, Manifest manifest)
|
||||
{
|
||||
using var fs = new FileStream(outputPath, FileMode.Create);
|
||||
using var zip = new ZipArchive(fs, ZipArchiveMode.Create);
|
||||
|
||||
var manifestEntry = zip.CreateEntry("manifest.json");
|
||||
using (var writer = new StreamWriter(manifestEntry.Open()))
|
||||
{
|
||||
var serialized = JsonSerializer.Serialize(manifest, JsonOptions);
|
||||
|
||||
writer.Write(serialized);
|
||||
}
|
||||
|
||||
var archiveEntry = zip.CreateEntry("lib.a");
|
||||
|
||||
using var entryStream = archiveEntry.Open();
|
||||
using var fileStream = File.OpenRead(archivePath);
|
||||
|
||||
fileStream.CopyTo(entryStream);
|
||||
}
|
||||
|
||||
public static NublibLoadResult Unpack(string nublibPath)
|
||||
{
|
||||
using var fs = new FileStream(nublibPath, FileMode.Open, FileAccess.Read);
|
||||
using var zip = new ZipArchive(fs, ZipArchiveMode.Read);
|
||||
|
||||
var manifestEntry = zip.GetEntry("manifest.json") ?? throw new FileNotFoundException("Manifest not found in nublib", "manifest.json");
|
||||
|
||||
Manifest manifest;
|
||||
using (var reader = new StreamReader(manifestEntry.Open()))
|
||||
{
|
||||
var json = reader.ReadToEnd();
|
||||
manifest = JsonSerializer.Deserialize<Manifest>(json, JsonOptions) ?? throw new InvalidDataException("Failed to deserialize manifest.json");
|
||||
}
|
||||
|
||||
var archiveEntry = zip.Entries.FirstOrDefault(e => e.Name.EndsWith(".a")) ?? throw new FileNotFoundException("Archive not found in nublib", "*.a");
|
||||
|
||||
string tempArchivePath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N") + ".a");
|
||||
using (var entryStream = archiveEntry.Open())
|
||||
using (var tempFile = File.Create(tempArchivePath))
|
||||
{
|
||||
entryStream.CopyTo(tempFile);
|
||||
}
|
||||
|
||||
return new NublibLoadResult(manifest, tempArchivePath);
|
||||
}
|
||||
|
||||
public record NublibLoadResult(Manifest Manifest, string ArchivePath);
|
||||
}
|
||||
Reference in New Issue
Block a user