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; } var workflow = JsonSerializer.Deserialize(File.OpenRead(workflowViewFile), JsonSerializerOptions.Web)!; var edgesFile = Path.Combine("/sources", $"{workflow.Name}.Edges.cs"); var nodesFile = Path.Combine("/sources", $"{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);