Public/Add-SlideDiagram.ps1

function Add-SlideDiagramNode {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)][string]$Id,
        [Parameter(Mandatory)][string]$Label
    )
    $context = Get-TerminalSlidesBuildContext -Kind Diagram
    if ($null -eq $context) { throw 'Add-SlideDiagramNode can only be used inside Add-SlideDiagram.' }
    $context.Nodes.Add([TerminalSlides.Schema.V1.DiagramNode]::new($Id, $Label))
}

function Add-SlideDiagramEdge {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)][string]$From,
        [Parameter(Mandatory)][string]$To,
        [string]$Label
    )
    $context = Get-TerminalSlidesBuildContext -Kind Diagram
    if ($null -eq $context) { throw 'Add-SlideDiagramEdge can only be used inside Add-SlideDiagram.' }
    $context.Edges.Add([TerminalSlides.Schema.V1.DiagramEdge]::new($From, $To, $Label))
}

function Add-SlideDiagram {
    [CmdletBinding(DefaultParameterSetName='Dsl')]
    param(
        [Parameter(Mandatory, ParameterSetName='Dsl')][scriptblock]$Content,
        [Parameter(Mandatory, ParameterSetName='Object')][hashtable]$Diagram,
        [string]$Region = 'Content',
        [int]$RevealStep = 0,
        [switch]$SafeMode
    )
    $diagramData = if ($PSCmdlet.ParameterSetName -eq 'Object') {
            $Diagram
        }
        else {
            $context = Push-TerminalSlidesBuildContext -Kind Diagram
            try {
                Invoke-SafeScriptBlock -ScriptBlock $Content -SafeMode:$SafeMode -Scope Local
                @{
                    Nodes = @($context.Nodes)
                    Edges = @($context.Edges)
                }
            }
            finally {
                Pop-TerminalSlidesBuildContext -Context $context
            }
    }
    $nodes = @($diagramData.Nodes | ForEach-Object {
        if ($_ -is [TerminalSlides.Schema.V1.DiagramNode]) { $_ }
        else { [TerminalSlides.Schema.V1.DiagramNode]::new([string](Get-TerminalSemanticProperty $_ Id), [string](Get-TerminalSemanticProperty $_ Label)) }
    })
    $edges = @($diagramData.Edges | ForEach-Object {
        if ($_ -is [TerminalSlides.Schema.V1.DiagramEdge]) { $_ }
        else { [TerminalSlides.Schema.V1.DiagramEdge]::new([string](Get-TerminalSemanticProperty $_ From), [string](Get-TerminalSemanticProperty $_ To), [string](Get-TerminalSemanticProperty $_ Label)) }
    })
    Assert-TerminalDiagramNodeIdentity -Nodes ([TerminalSlides.Schema.V1.DiagramNode[]]$nodes)
    $payload = [TerminalSlides.Schema.V1.DiagramPayload]::new(
        [TerminalSlides.Schema.V1.DiagramNode[]]$nodes,
        [TerminalSlides.Schema.V1.DiagramEdge[]]$edges
    )
    Add-CurrentSlideElement -Element (New-InternalSlideElement -Kind Diagram -Payload $payload -Region $Region -RevealStep $RevealStep)
}