libunftp 0.23.0

Extensible, async, cloud orientated FTP(S) server library.
Documentation
name: build

env:
  CARGO_TERM_COLOR: always
  RUST_VERSION: 1.92.0

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs:

  format:
    runs-on: ubuntu-latest
    if: ${{ github.ref != 'refs/heads/master' }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ env.RUST_VERSION }}
          override: true
          default: true
          components: rustfmt
      - name: Check formatting
        uses: actions-rs/cargo@v1
        with:
          command: fmt
          args: --all -- --check

  clippy:
    runs-on: ubuntu-latest
    if: ${{ github.ref != 'refs/heads/master' }}
    steps:
      - name: Checkout sources
        uses: actions/checkout@v3
        with:
          persist-credentials: false
      - name: Install rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ env.RUST_VERSION }}
          override: true
          default: true
          components: clippy
      - uses: actions-rs/cargo@v1
        with:
          command: clippy
          args: --all-features --workspace -- -D warnings

  test:
    runs-on: ubuntu-latest
    env:
      RUSTFLAGS: -Dwarnings
    steps:
      - name: Checkout sources
        uses: actions/checkout@v3
      - name: Install rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ env.RUST_VERSION }}
          override: true
          default: true
          target: x86_64-unknown-linux-gnu
          components: rust-docs
      - name: Install build dependencies
        run: sudo apt-get update && sudo apt-get install -y libpam-dev
      - name: Run tests
        run: >
          cargo test
          --verbose --workspace --exclude 'unftp-sbe-gcs*'
      - name: Doc tests
        run: cargo test --doc --workspace
      - name: Build Examples
        run: cargo build --examples --workspace
      - name: Build Code
        run: cargo build  --workspace
      - name: Check compilation without default features (workspace)
        run: cargo check --workspace --no-default-features --features aws_lc_rs
      - name: Check compilation without default features (libunftp only)
        run: cargo check --no-default-features --features aws_lc_rs
      - name: Check compilation with all features (workspace)
        run: cargo check --workspace --no-default-features --features all
      - name: Check compilation with all features (libunftp only)
        run: cargo check --no-default-features --features all
      - name: Check compilation with 'prometheus' feature only
        run: cargo check --no-default-features --features aws_lc_rs,prometheus
      - name: Check compilation with 'proxy_protocol' feature only
        run: cargo check --no-default-features --features aws_lc_rs,proxy_protocol
      - name: Build Docs
        run: cargo doc --workspace --no-deps

  build-linux-gnu:
    runs-on: ubuntu-latest
    if: ${{ github.ref != 'refs/heads/master' }}
    name: Build on Linux (GNU)
    env:
      target: x86_64-unknown-linux-gnu
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0  # Otherwise the code that retrieves the git version doesn't work
      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ env.RUST_VERSION }}
          override: true
          default: true
          target: ${{ env.target }}
      - name: Install build dependencies
        run: sudo apt-get update && sudo apt-get install -y libpam-dev
      - name: Build for Linux (GNU)
        run: cargo build --target=${{ env.target }}

  build-linux-musl:
    runs-on: ubuntu-latest
    if: ${{ github.ref != 'refs/heads/master' }}
    name: Build on Linux (MUSL)
    env:
      target: x86_64-unknown-linux-musl
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0  # Otherwise the code that retrieves the git version doesn't work
      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ env.RUST_VERSION }}
          override: true
          default: true
          target: ${{ env.target }}
      - name: Install build dependencies
        run: sudo apt-get update && sudo apt-get install -y musl-tools
      - name: Build for Linux (MUSL)
        run: RUSTFLAGS="-C target-feature=+crt-static" cargo build --target=${{ env.target }}

  build-windows:
    runs-on: windows-latest
    if: ${{ github.ref != 'refs/heads/master' }}
    name: Build on Windows
    env:
      trget: x86_64-pc-windows-msvc
    steps:
      - uses: ilammy/setup-nasm@v1
      - name: Checkout code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0  # Otherwise the code that retrieves the git version doesn't work
      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ env.RUST_VERSION }}
          override: true
          default: true
          target: ${{ env.trget }}
      - name: Build for Windows
        run: cargo build --target=${{ env.trget }}

  build-macos-intel:
    runs-on: macos-latest
    if: ${{ github.ref != 'refs/heads/master' }}
    name: Build on macOS (Intel)
    env:
      target: x86_64-apple-darwin
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0  # Otherwise the code that retrieves the git version doesn't work
      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ env.RUST_VERSION }}
          override: true
          default: true
          target: ${{ env.target }}
      - name: Build for macOS (Intel)
        run: cargo build --target=${{ env.target }}

  build-macos-arm:
    runs-on: macos-latest
    if: ${{ github.ref != 'refs/heads/master' }}
    name: Build on macOS (ARM)
    env:
      target: aarch64-apple-darwin
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0  # Otherwise the code that retrieves the git version doesn't work
      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ env.RUST_VERSION }}
          override: true
          default: true
          target: ${{ env.target }}
      - name: Install Rosetta
        if: runner.os == 'macOS' && runner.arch == 'arm64'
        run: softwareupdate --install-rosetta --agree-to-license
      - name: Build
        run: cargo build --target=${{ env.target }}