rust_decimal 1.42.0

Decimal number implementation written in pure Rust suitable for financial and fixed-precision calculations.
Documentation
on:
  pull_request:
    types: [opened, synchronize, reopened]
  push:
    branches:
      - master
      - "[1-9].x"

name: CI

jobs:
  ci:
    runs-on: ubuntu-latest
    # Keep this the same as this is what Github looks for to determine if the build passed
    name: "Pass"
    needs:
      - check_style
      - minimum_rust_version
      - docs
      - test
    steps:
      - run: exit 0

  check_style:
    name: Check file formatting and style
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

      - uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 # master
        with:
          toolchain: stable
          components: clippy, rustfmt

      - name: Cache cargo registry
        uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: clippy-cargo-${{ hashFiles('**/Cargo.toml') }}

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get -y install libpq-dev

      - name: Check file formatting
        run: cargo fmt --all -- --check

      - name: Run clippy
        run: cargo clippy --workspace --all-features

  minimum_rust_version:
    name: Check minimum rust version
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

      - uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 # master
        with:
          toolchain: 1.67.1

      - name: Cache cargo registry
        uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: minimal_rust_version-cargo-${{ hashFiles('**/Cargo.toml') }}

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get -y install libpq-dev

      - name: Use minimal dependencies
        run: |
          RUSTC_BOOTSTRAP=1 cargo update -Z minimal-versions

      - name: Check build
        run: cargo check --workspace

  docs:
    name: "Check documentation"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

      - uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 # master
        with:
          toolchain: nightly

      - name: Cache cargo registry
        uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: docs-cargo-${{ hashFiles('**/Cargo.toml') }}

      - name: Check documentation
        env:
          RUSTDOCFLAGS: --cfg docsrs
        run: cargo doc --no-deps --all-features

  test:
    name: "Test"
    runs-on: ubuntu-latest
    needs:
      - standard_tests
      - dependency_tests
      - database_tests
      - wasm_tests
      - fuzz_tests
    steps:
      - run: exit 0

  standard_tests:
    name: "Standard Tests"
    runs-on: ubuntu-latest
    strategy:
      # There doesn't seem to be a way to share the matrix between jobs
      matrix:
        name:
          - stable
          - beta
        include:
          - name: stable
            rust: stable
          - name: beta
            rust: beta
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

      - uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 # master
        with:
          toolchain: ${{ matrix.rust }}
          targets: ${{ matrix.target }}

      - name: Cache cargo registry
        uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: tests-std-${{ matrix.rust }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.toml') }}

      - uses: davidB/rust-cargo-make@291dc18d931d07d4960a5c40e9b6afcea9287f5b # v1.15.0

      - name: Run no_std tests
        run: cargo make test-no-std

      - name: Run default tests
        run: cargo make test-default

      - name: Run legacy operation tests
        run: cargo make test-legacy-ops

      - name: Run mathematical function tests
        run: cargo make test-maths

      - name: Run macro tests
        run: cargo make test-macros

  dependency_tests:
    name: "Dependency Tests"
    runs-on: ubuntu-latest
    strategy:
      # There doesn't seem to be a way to share the matrix between jobs
      matrix:
        name:
          - stable
          - beta
        include:
          - name: stable
            rust: stable
          - name: beta
            rust: beta
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

      - uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 # master
        with:
          toolchain: ${{ matrix.rust }}
          targets: ${{ matrix.target }}

      - name: Cache cargo registry
        uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: tests-dep-${{ matrix.rust }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.toml') }}

      - uses: davidB/rust-cargo-make@291dc18d931d07d4960a5c40e9b6afcea9287f5b # v1.15.0

      - name: Run serde tests
        run: cargo make test-serde

      - name: Run miscellaneous dependency tests
        run: cargo make test-misc

  database_tests:
    name: "Database Tests"
    runs-on: ubuntu-latest
    needs:
      - postgres_tests
      - mysql_tests
    steps:
      - run: exit 0

  postgres_tests:
    name: "Database Tests - PostgreSQL"
    runs-on: ubuntu-latest
    strategy:
      # There doesn't seem to be a way to share the matrix between jobs
      matrix:
        name:
          - stable
          - beta
        include:
          # This allows us to define targets in the future (e.g. wasm32-unknown-unknown)
          - name: stable
            rust: stable
          - name: beta
            rust: beta
    services:
      postgres:
        image: postgres:11.6
        env:
          POSTGRES_PASSWORD: ""
        ports:
          - 5432:5432
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

      - uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 # master
        with:
          toolchain: ${{ matrix.rust }}
          targets: ${{ matrix.target }}

      - name: Cache cargo registry
        uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: tests-pgsql-${{ matrix.rust }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.toml') }}

      - uses: davidB/rust-cargo-make@291dc18d931d07d4960a5c40e9b6afcea9287f5b # v1.15.0

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get -y install libpq-dev

      - name: Run database tests
        run: cargo make test-db-postgres-all

  mysql_tests:
    name: "Database Tests - MySQL"
    runs-on: ubuntu-latest
    strategy:
      # There doesn't seem to be a way to share the matrix between jobs
      matrix:
        name:
          - stable
          - beta
        include:
          # This allows us to define targets in the future (e.g. wasm32-unknown-unknown)
          - name: stable
            rust: stable
          - name: beta
            rust: beta
    services:
      mysql:
        image: mysql:8
        env:
          MYSQL_ROOT_PASSWORD: ""
          MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
        ports:
          - 3306:3306
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

      - uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 # master
        with:
          toolchain: ${{ matrix.rust }}
          targets: ${{ matrix.target }}

      - name: Cache cargo registry
        uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: tests-mysql-${{ matrix.rust }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.toml') }}

      - uses: davidB/rust-cargo-make@291dc18d931d07d4960a5c40e9b6afcea9287f5b # v1.15.0

      - name: Run database tests
        run: cargo make test-db-mysql-all

  wasm_tests:
    name: "WASM Tests"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: stable
          targets: wasm32-unknown-unknown
          components: clippy

      - name: Cache cargo registry
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: tests-wasm-stable-cargo-${{ hashFiles('**/Cargo.toml') }}
          restore-keys: |
            tests-wasm-stable-cargo-

      - name: Install wasm-pack
        run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh

      - name: Check wasm build
        run: cargo check --target wasm32-unknown-unknown --features wasm

      - name: Run clippy for wasm
        run: cargo clippy --target wasm32-unknown-unknown --features wasm

      - name: Run wasm tests
        run: wasm-pack test --node --features wasm

  fuzz_tests:
    name: Fuzz Tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 # master
        with:
          toolchain: nightly

      - name: Cache cargo registry
        uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: tests-fuzz-${{ matrix.rust }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.toml') }}

      - name: Install Cargo Fuzz
        run: cargo install cargo-fuzz

      - uses: davidB/rust-cargo-make@291dc18d931d07d4960a5c40e9b6afcea9287f5b # v1.15.0

      - name: Run fuzz tests
        run: cargo make fuzz