regorus 0.9.1

A fast, lightweight Rego (OPA policy language) interpreter
Documentation
name: bindings/csharp

on:
  workflow_dispatch:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
  schedule:
    # Run at 8:00 AM every day
    - cron: "0 8 * * *"

env:
  VersionSuffix: ${{ github.event_name == 'workflow_dispatch' && 'manualtrigger' || null }}

jobs:  
  build-ffi:
    name: 'Build Regorus FFI: (${{ matrix.runtime.target }})'
    runs-on: ${{ matrix.runtime.os }}
    strategy:
      # let us get failures from other jobs even if one fails
      fail-fast: false
      matrix:
        runtime:
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            libpath: |
              **/release/regorus_ffi.dll
              **/release/regorus_ffi.pdb
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            libpath: |
              **/release/libregorus_ffi.so
          - os: macos-latest
            target: aarch64-apple-darwin
            libpath: |
              **/release/libregorus_ffi.dylib
    steps:
      - name: Checkout repository
        uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
        with:
          fetch-depth: 0
      - uses: ./.github/actions/toolchains/rust
        with:
          targets: ${{ matrix.runtime.target }}
      - name: Cache cargo
        uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
        with:
          shared-key: ${{ runner.os }}-regorus
      - name: Fetch dependencies
        run: cargo fetch --locked

      - name: Fetch FFI crate dependencies
        run: cargo fetch --locked --manifest-path bindings/ffi/Cargo.toml --target ${{ matrix.runtime.target }}

      - name: Build Regorus FFI via xtask
        run: cargo xtask build-ffi --release --target ${{ matrix.runtime.target }}
        
      - name: Upload regorus ffi shared library
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        with:
          name: regorus-ffi-artifacts-${{ matrix.runtime.target }}
          # Note: The full path of each artifact relative to . is preserved.
          path: ${{ matrix.runtime.libpath }}
          if-no-files-found: error
          retention-days: 1

  build-csharp:
    name: 'Build Regorus nuget'
    runs-on: ubuntu-latest
    needs: build-ffi
    steps:
      - name: Checkout repository
        uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
        with:
          fetch-depth: 0  
      - uses: ./.github/actions/toolchains/rust
      - uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25 # v4.1.0
        with:
          global-json-file: ./bindings/csharp/global.json

      - run: echo '${{ steps.stepid.outputs.dotnet-version }}'

      - name: Cache cargo
        uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
        with:
          shared-key: ${{ runner.os }}-regorus

      - name: Fetch dependencies
        run: cargo fetch --locked

      - name: Download regorus ffi shared libraries
        uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
        with:
          pattern: regorus-ffi-artifacts-*
          merge-multiple: true
          path: ./bindings/csharp/Regorus/tmp

      - name: Display regorus ffi artifacts
        run: ls -R ./bindings/csharp/Regorus/tmp

      - name: Build Regorus nuget via xtask
        run: cargo xtask build-csharp --release --clean --artifacts-dir ./bindings/csharp/Regorus/tmp/bindings/ffi/target --enforce-artifacts --repository-commit ${{ github.sha }} --include-symbols

      - name: Upload Regorus nuget
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        with:
          name: regorus-nuget
          path: |
            bindings/csharp/Regorus/bin/Release/Regorus*.nupkg
            bindings/csharp/Regorus/bin/Release/Regorus*.snupkg
          if-no-files-found: error
          retention-days: 1

  test-nuget:
    name: 'Test Regorus Nuget: (${{ matrix.runtime.target }})'
    needs: build-csharp
    runs-on: ${{ matrix.runtime.os }}
    strategy:
      # let us get failures from other jobs even if one fails
      fail-fast: false
      matrix:
        runtime:
          - os: windows-latest
            target: x86_64-pc-windows-msvc
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
          - os: macos-latest
            target: aarch64-apple-darwin
    steps:
      - name: Checkout repository
        uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
        with:
          fetch-depth: 0

      - uses: ./.github/actions/toolchains/rust

      - uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25 # v4.1.0
        with:
          global-json-file: ./bindings/csharp/global.json

      - run: echo '${{ steps.stepid.outputs.dotnet-version }}'

      - name: Cache cargo
        uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
        with:
          shared-key: ${{ runner.os }}-regorus

      - name: Fetch dependencies
        run: cargo fetch --locked

      - name: Download regorus nuget
        uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
        with:
          name: regorus-nuget
          path: ./bindings/csharp/Regorus/bin/Release

      - name: Display regorus nuget
        run: ls -R ./bindings/csharp/Regorus/bin/Release

      - name: Run C# tests via xtask
        run: cargo xtask test-csharp --release --clean --nuget-dir bindings/csharp/Regorus/bin/Release