keyvalues3 1.1.0

A Rust library and CLI tool for parsing, formatting, and converting Valve's KeyValues3 (KV3) text format.
Documentation
name: Rust

on:
  push:
    tags:
      - "v*.*.*"

env:
  CARGO_TERM_COLOR: always

jobs:
  build:
    name: build (${{ matrix.runs-on }})
    runs-on: ${{ matrix.runs-on }}
    strategy:
      fail-fast: false
      matrix:
        runs-on: [macos-latest, ubuntu-latest, windows-latest]
    steps:
      - uses: actions/checkout@v4

      - name: Cache cargo
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            ~/.rustup/toolchains
            target
          key: ${{ matrix.runs-on }}-rust-${{ hashFiles('**/Cargo.lock') }}

      - name: Run tests
        run: cargo test --test '*'

      - name: Build macOS
        if: matrix.runs-on == 'macos-latest'
        run: |
          rustup target add x86_64-apple-darwin aarch64-apple-darwin
          cargo build --release --features json,binary --target x86_64-apple-darwin --target aarch64-apple-darwin

      - name: Build linux
        if: matrix.runs-on == 'ubuntu-latest'
        run: |
          sudo apt-get install --yes --no-install-recommends musl-tools
          rustup target add x86_64-unknown-linux-musl aarch64-unknown-linux-musl
          cargo build --release --features json,binary --target x86_64-unknown-linux-musl # --target aarch64-unknown-linux-musl

      - name: Build Windows
        if: matrix.runs-on == 'windows-latest'
        run: |
          rustup target add x86_64-pc-windows-msvc aarch64-pc-windows-msvc
          cargo build --release --features json,binary --target x86_64-pc-windows-msvc --target aarch64-pc-windows-msvc

      - name: Upload macOS artifacts
        if: matrix.runs-on == 'macos-latest'
        uses: actions/upload-artifact@v4
        with:
          name: kv3-cli-macOS
          path: target
          if-no-files-found: error

      - name: Upload linux artifacts
        if: matrix.runs-on == 'ubuntu-latest'
        uses: actions/upload-artifact@v4
        with:
          name: kv3-cli-linux
          path: target
          if-no-files-found: error

      - name: Upload Windows artifacts
        if: matrix.runs-on == 'windows-latest'
        uses: actions/upload-artifact@v4
        with:
          name: kv3-cli-windows
          path: target
          if-no-files-found: error

  release:
    if: github.ref_type == 'tag'
    needs: build
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          path: artifacts

      - name: Compress release
        run: |
          mkdir release

          chmod +x artifacts/kv3-cli-macOS/x86_64-apple-darwin/release/kv3-cli
          chmod +x artifacts/kv3-cli-macOS/aarch64-apple-darwin/release/kv3-cli
          chmod +x artifacts/kv3-cli-linux/x86_64-unknown-linux-musl/release/kv3-cli
          chmod +x artifacts/kv3-cli-windows/x86_64-pc-windows-msvc/release/kv3-cli.exe
          chmod +x artifacts/kv3-cli-windows/aarch64-pc-windows-msvc/release/kv3-cli.exe

          zip -9j release/kv3-cli-macOS-x86_64.zip artifacts/kv3-cli-macOS/x86_64-apple-darwin/release/kv3-cli
          zip -9j release/kv3-cli-macOS-aarch64.zip artifacts/kv3-cli-macOS/aarch64-apple-darwin/release/kv3-cli
          zip -9j release/kv3-cli-linux-x86_64.zip artifacts/kv3-cli-linux/x86_64-unknown-linux-musl/release/kv3-cli
          zip -9j release/kv3-cli-windows-x86_64.zip artifacts/kv3-cli-windows/x86_64-pc-windows-msvc/release/kv3-cli.exe
          zip -9j release/kv3-cli-windows-aarch64.zip artifacts/kv3-cli-windows/aarch64-pc-windows-msvc/release/kv3-cli.exe

      - name: Upload release
        uses: softprops/action-gh-release@v2
        with:
          draft: true
          files: release/*.zip

  publish:
    if: github.ref_type == 'tag'
    needs: release
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Login into crates.io
        run: cargo login ${{ secrets.CARGO_REGISTRY_TOKEN }}

      - name: "Package for crates.io"
        run: cargo package

      - name: "Publish to crates.io"
        run: cargo publish