YAMLStar.psm1

$Source = @'
using System;
using System.Runtime.InteropServices;

public static class YAMLStarNative {
  [DllImport("libyamlstar")]
  public static extern int graal_create_isolate(
    IntPtr parameters,
    IntPtr isolate,
    ref IntPtr thread);

  [DllImport("libyamlstar")]
  public static extern int graal_tear_down_isolate(IntPtr thread);

  [DllImport("libyamlstar")]
  public static extern IntPtr yamlstar_load(IntPtr thread, string input);
}
'@


if (-not ('YAMLStarNative' -as [type])) {
  Add-Type -TypeDefinition $Source
}

function Invoke-YAMLStarJson {
  param(
    [Parameter(Mandatory, ValueFromPipeline)]
    [string] $InputObject
  )

  process {
    $thread = [IntPtr]::Zero
    $rc = [YAMLStarNative]::graal_create_isolate(
      [IntPtr]::Zero,
      [IntPtr]::Zero,
      [ref] $thread)
    if ($rc -ne 0 -or $thread -eq [IntPtr]::Zero) {
      throw 'Failed to create isolate'
    }

    $ptr = [YAMLStarNative]::yamlstar_load($thread, $InputObject)
    if ($ptr -eq [IntPtr]::Zero) {
      [void] [YAMLStarNative]::graal_tear_down_isolate($thread)
      throw 'Null response from libyamlstar'
    }

    $json = [Runtime.InteropServices.Marshal]::PtrToStringAnsi($ptr)
    $rc = [YAMLStarNative]::graal_tear_down_isolate($thread)
    if ($rc -ne 0) {
      throw 'Failed to tear down isolate'
    }
    $json
  }
}

function Invoke-YAMLStar {
  param(
    [Parameter(Mandatory, ValueFromPipeline)]
    [string] $InputObject
  )

  process {
    $response = Invoke-YAMLStarJson $InputObject | ConvertFrom-Json
    if ($null -ne $response.error) {
      throw $response.error.cause
    }
    $response.data
  }
}

Export-ModuleMember -Function Invoke-YAMLStar, Invoke-YAMLStarJson