2026-01-02 03:24:33 +11:00
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
|
using Progrart.Core.JSExecution;
|
2026-01-04 21:14:17 +11:00
|
|
|
|
using Progrart.Core.Storage;
|
2026-01-02 03:24:33 +11:00
|
|
|
|
|
|
|
|
|
|
namespace Progrart.Core.ProjectSystem
|
|
|
|
|
|
{
|
|
|
|
|
|
public class Builder
|
|
|
|
|
|
{
|
|
|
|
|
|
public Project project;
|
2026-01-04 21:14:17 +11:00
|
|
|
|
public IStorageProvider provider;
|
2026-01-02 03:24:33 +11:00
|
|
|
|
public Action<int, int>? OnProgressUpdate;
|
|
|
|
|
|
public Action? OnCompleted;
|
2026-01-04 21:14:17 +11:00
|
|
|
|
public Builder(StreamReader reader, IStorageProvider provider)
|
2026-01-02 03:24:33 +11:00
|
|
|
|
{
|
|
|
|
|
|
var project = JsonConvert.DeserializeObject<Project>(reader.ReadToEnd());
|
|
|
|
|
|
if (project is null) throw new JsonSerializationException();
|
|
|
|
|
|
this.project = project;
|
2026-01-04 21:14:17 +11:00
|
|
|
|
this.provider = provider;
|
2026-01-02 03:24:33 +11:00
|
|
|
|
}
|
2026-01-04 21:14:17 +11:00
|
|
|
|
public Builder(Project project, IStorageProvider provider)
|
2026-01-02 03:24:33 +11:00
|
|
|
|
{
|
|
|
|
|
|
this.project = project;
|
2026-01-04 21:14:17 +11:00
|
|
|
|
this.provider = provider;
|
2026-01-02 03:24:33 +11:00
|
|
|
|
}
|
2026-01-04 21:14:17 +11:00
|
|
|
|
public async Task Execute(BuildConfiguration config, BuildItem item)
|
2026-01-02 03:24:33 +11:00
|
|
|
|
{
|
2026-01-04 21:14:17 +11:00
|
|
|
|
//FileInfo src = new FileInfo(Path.Combine(basePath, item.Source));
|
|
|
|
|
|
//FileInfo tgt = new FileInfo(Path.Combine(basePath, project.OutputDir, item.Target ?? item.Source + ".png"));
|
2026-01-02 03:24:33 +11:00
|
|
|
|
var args = project.Arguments.Clone();
|
|
|
|
|
|
args.MergeFrom(config.Arguments);
|
|
|
|
|
|
args.MergeFrom(item.Arguments);
|
2026-01-04 21:14:17 +11:00
|
|
|
|
ProgrartExecutor executor = new ProgrartExecutor(provider);
|
|
|
|
|
|
using var stream = await provider.TryOpenRead(item.Source);
|
|
|
|
|
|
if (stream is null)
|
|
|
|
|
|
return;
|
2026-01-02 03:24:33 +11:00
|
|
|
|
using var reader = new StreamReader(stream);
|
|
|
|
|
|
var img = executor.RenderImage(item.Size, reader.ReadToEnd(), args);
|
2026-01-04 21:14:17 +11:00
|
|
|
|
using var img_stream = await provider.TryOpenWrite(Path.Combine(project.OutputDir, item.Target ?? item.Source + ".png"));
|
|
|
|
|
|
if (img_stream is null)
|
|
|
|
|
|
return;
|
2026-01-02 03:24:33 +11:00
|
|
|
|
img.DrawingCore.ToData().SaveTo(img_stream);
|
|
|
|
|
|
img_stream.Flush();
|
|
|
|
|
|
}
|
2026-01-04 21:14:17 +11:00
|
|
|
|
public async Task Build(string targetConfig)
|
2026-01-02 03:24:33 +11:00
|
|
|
|
{
|
|
|
|
|
|
foreach (var config in project.Configurations)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (config.Name == targetConfig)
|
|
|
|
|
|
{
|
|
|
|
|
|
int index = 0;
|
|
|
|
|
|
foreach (var item in config.Items)
|
|
|
|
|
|
{
|
2026-01-04 21:14:17 +11:00
|
|
|
|
await Execute(config, item);
|
2026-01-02 03:24:33 +11:00
|
|
|
|
index++;
|
|
|
|
|
|
OnProgressUpdate?.Invoke(config.Items.Count, index);
|
|
|
|
|
|
}
|
|
|
|
|
|
OnCompleted?.Invoke();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|