Files
Sharp8N.Compiler/Program.cs
Vitali Semianiaka 8c4410dc61
All checks were successful
Build and Test / build-image (push) Successful in 31s
updated compiler
2026-01-01 23:39:59 +03:00

65 lines
2.4 KiB
C#

using System.Reflection;
using System.Text.Json;
using s8n_runtime.ViewModels;
string workflowViewFile = Environment.GetEnvironmentVariable("WORKFLOW_FILE")!;
string projectDirectory = Environment.GetEnvironmentVariable("PROJECT_DIR") ?? $"/sources";
if (string.IsNullOrEmpty(workflowViewFile) || !Directory.Exists(projectDirectory))
{
AssemblyName a_name = Assembly.GetExecutingAssembly()!.GetName();
Console.WriteLine("S8N Compiler, version: {0}.\nSpecify environment variables: WORKFLOW_FILE, PROJECT_DIR.\nCLR: {1}", a_name.Version, Environment.Version);
return;
}
using var stream = File.OpenRead(workflowViewFile);
var workflow = JsonSerializer.Deserialize<S8nWorkflow>(stream, JsonSerializerOptions.Web)!;
var edgesFile = Path.Combine(projectDirectory, $"{workflow.Name}.Edges.cs");
var nodesFile = Path.Combine(projectDirectory, $"{workflow.Name}.Nodes.cs");
// Linking
const string templateEdges = """
// !Warning! Please, don't change this file. Code autogenerated
#pragma warning disable CS8622 // Nullability of reference types in type of parameter doesn't match the target delegate (possibly because of nullability attributes).
public partial class {0}
{{
public void Connect()
{{
// edges connect here >>>
{1}
}}
public void Disconnect()
{{
// edges disconnect here >>>
{2}
}}
}}
""";
const string templateNodes = """
// !Warning! Please, don't change this file. Code autogenerated
public partial class {0}
{{
// nodes here >>>
{1}
}}
""";
static string GetConnection(WorkflowEdge edge) =>
$"{edge.Source}{(string.IsNullOrEmpty(edge.SourceHandle) ? string.Empty : ".")}{edge.SourceHandle ?? string.Empty} {(
edge.IsEvent ? "+" : string.Empty
)}= {edge.Target}{(string.IsNullOrEmpty(edge.TargetHandle) ? string.Empty : ".")}{edge.TargetHandle ?? string.Empty}";
string edgesConnections = string.Join("\n", workflow.Edges.Select(e => $"// {e.Id}\n {GetConnection(e)};"));
var edges = string.Format(templateEdges, workflow.Name, edgesConnections, edgesConnections.Replace('+', '-'));
string nodesFields = string.Join("\n ", workflow.Nodes.Select(n => $"// {n.Data?.Label}\n public {n.Class} {n.Id};"));
var nodes = string.Format(templateNodes, workflow.Name, nodesFields);
await File.WriteAllTextAsync(edgesFile, edges);
await File.WriteAllTextAsync(nodesFile, nodes);