openapi-nexus 0.2.3

OpenAPI 3.x multi-language code generator
Documentation
name: CI

on:
  push:
    branches: [main]
  pull_request:

permissions:
  contents: read

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
  cancel-in-progress: true

env:
  RUSTFLAGS: -Dwarnings
  RUST_BACKTRACE: 1
  rust_min: "1.90.0"

defaults:
  run:
    shell: bash

jobs:
  fmt:
    name: Format
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt
      - uses: taiki-e/install-action@just
      - run: just fmt-check

  clippy:
    name: Clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@just
      - run: just clippy

  doc:
    name: Documentation
    runs-on: ubuntu-latest
    env:
      RUSTDOCFLAGS: -Dwarnings
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@just
      - run: just doc-check

  mdbook:
    name: mdbook
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
      - uses: taiki-e/install-action@mdbook
      - uses: taiki-e/install-action@just
      - run: cargo install mdbook-mermaid-mmdr
      - run: just book

  basics:
    name: Basics
    runs-on: ubuntu-latest
    needs: [fmt, clippy, doc]
    steps:
      - run: exit 0

  test:
    name: Test
    runs-on: ubuntu-latest
    needs: [basics]
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@nextest
      - uses: taiki-e/install-action@just
      - run: just test-all

  coverage:
    name: Coverage
    runs-on: ubuntu-latest
    needs: [basics]
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: llvm-tools-preview
      - uses: Swatinem/rust-cache@v2
        with:
          prefix-key: coverage
      - uses: taiki-e/install-action@cargo-llvm-cov
      - uses: taiki-e/install-action@nextest
      - uses: taiki-e/install-action@just
      - run: just coverage-lcov
      - uses: codecov/codecov-action@v6
        with:
          files: coverage/lcov.info
          fail_ci_if_error: false
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  msrv:
    name: MSRV
    runs-on: ubuntu-latest
    needs: [basics]
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.rust_min }}
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@just
      - run: just msrv

  golden-build:
    name: Golden Build (${{ matrix.generator }})
    runs-on: ubuntu-latest
    needs: [basics]
    strategy:
      fail-fast: false
      matrix:
        include:
          - generator: typescript-fetch-tsc
            cmd: just golden-typescript::build-tsc
          - generator: typescript-fetch-vp
            cmd: just golden-typescript::build-vp
          - generator: go-http
            cmd: just golden-go::build
          - generator: rust-reqwest
            cmd: just golden-rust::build-reqwest
          - generator: rust-ureq
            cmd: just golden-rust::build-ureq
          - generator: rust-aioduct
            cmd: just golden-rust::build-aioduct
          - generator: python-httpx
            cmd: just golden-python::build-httpx
          - generator: python-requests
            cmd: just golden-python::build-requests
          - generator: java-okhttp
            cmd: just golden-java::build
          - generator: kotlin-okhttp
            cmd: just golden-kotlin::build
    steps:
      - uses: actions/checkout@v6
      - uses: taiki-e/install-action@just
      - uses: dtolnay/rust-toolchain@stable
        if: contains(matrix.generator, 'rust-')
      - uses: Swatinem/rust-cache@v2
        if: contains(matrix.generator, 'rust-')
      - uses: actions/setup-node@v6
        if: contains(matrix.generator, 'typescript-fetch')
        with:
          node-version: 'lts/*'
      - if: contains(matrix.generator, 'typescript-fetch')
        run: npm install -g typescript vite-plus
      - uses: actions/setup-go@v6
        if: matrix.generator == 'go-http'
        with:
          go-version: 'stable'
      - uses: actions/setup-python@v6
        if: contains(matrix.generator, 'python-')
        with:
          python-version: '3.12'
      - uses: actions/setup-node@v6
        if: contains(matrix.generator, 'python-')
        with:
          node-version: '20'
      - uses: actions/setup-java@v5
        if: contains(matrix.generator, 'java-') || contains(matrix.generator, 'kotlin-')
        with:
          distribution: 'temurin'
          java-version: '17'
      - uses: gradle/actions/setup-gradle@v6
        if: contains(matrix.generator, 'java-') || contains(matrix.generator, 'kotlin-')
      - run: ${{ matrix.cmd }}

  release:
    name: Release ${{ matrix.target }}
    runs-on: ${{ matrix.os }}
    needs: [basics]
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            artifact_name: openapi-nexus-linux-x86_64-gnu
          - os: ubuntu-latest
            target: aarch64-unknown-linux-gnu
            artifact_name: openapi-nexus-linux-aarch64-gnu
          - os: ubuntu-latest
            target: x86_64-unknown-linux-musl
            artifact_name: openapi-nexus-linux-x86_64-musl
          - os: ubuntu-latest
            target: aarch64-unknown-linux-musl
            artifact_name: openapi-nexus-linux-aarch64-musl
          - os: macos-latest
            target: aarch64-apple-darwin
            artifact_name: openapi-nexus-macos-aarch64
    steps:
      - uses: actions/checkout@v6

      - name: Build release binary
        uses: houseabsolute/actions-rust-cross@v1
        with:
          command: build
          target: ${{ matrix.target }}
          toolchain: "1.90"
          args: "--release --bin openapi-nexus"

      - name: Prepare artifact
        run: |
          if [[ "${{ runner.os }}" == "Linux" ]]; then
            chmod +x target/${{ matrix.target }}/release/openapi-nexus
          fi
          mkdir -p artifacts
          cp target/${{ matrix.target }}/release/openapi-nexus artifacts/${{ matrix.artifact_name }}

      - uses: actions/upload-artifact@v7
        with:
          name: ${{ matrix.artifact_name }}
          path: artifacts/${{ matrix.artifact_name }}
          retention-days: 3