address 0.20.0

Network address types with strict validation, owned & borrowed variants, and standard library conversions.
Documentation
on:
  pull_request:
    branches: [ "master" ]
permissions:
  contents: read
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
env:
  CARGO_TERM_COLOR: always
jobs:
  fmt:
    name: Format
    runs-on: ubuntu-latest
    steps:
      - name: Git Checkout
        uses: actions/checkout@v7
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt
      - name: Format
        run: cargo fmt --all -- --check
  test:
    name: Test (${{ matrix.name }})
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        include:
          - { name: none, features: "" }
          - { name: idna, features: "--features idna" }
          - { name: serde, features: "--features serde" }
          - { name: all, features: "--all-features" }
    steps:
      - name: Git Checkout
        uses: actions/checkout@v7
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
      - name: Cache
        uses: Swatinem/rust-cache@v2
        with:
          key: ${{ matrix.name }}
      - name: Test
        run: cargo test --locked ${{ matrix.features }} --verbose
      - name: Lint
        run: cargo clippy --locked --all-targets ${{ matrix.features }} -- -D warnings
      - name: Docs
        run: cargo doc --locked ${{ matrix.features }} --no-deps
        env:
          RUSTDOCFLAGS: -D warnings
  package:
    name: Package
    runs-on: ubuntu-latest
    steps:
      - name: Git Checkout
        uses: actions/checkout@v7
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - name: Cache
        uses: Swatinem/rust-cache@v2
        with:
          key: package
      - name: Package
        run: cargo package --locked --all-features
  docs_rs:
    name: Docs.rs
    runs-on: ubuntu-latest
    # Reproduces the docs.rs build, which is the only configuration that sets `--cfg docsrs` & needs nightly.
    # Advisory: nightly can break for unrelated reasons, so this is not part of the `build` gate.
    continue-on-error: true
    steps:
      - name: Git Checkout
        uses: actions/checkout@v7
      - name: Install Rust
        uses: dtolnay/rust-toolchain@nightly
      - name: Cache
        uses: Swatinem/rust-cache@v2
        with:
          key: docs_rs
      - name: Docs
        run: cargo doc --locked --all-features --no-deps
        env:
          RUSTDOCFLAGS: --cfg docsrs -D warnings
  latest_deps:
    name: Latest Dependencies
    runs-on: ubuntu-latest
    # Tests the versions consumers actually resolve: a library's `Cargo.lock` is ignored by its dependents, so the
    # `--locked` jobs never exercise a dependency release. `cargo update` is required; dropping `--locked` alone
    # still reuses the committed lock file.
    # Advisory: a dependency release can break this for unrelated reasons, so this is not part of the `build` gate.
    continue-on-error: true
    steps:
      - name: Git Checkout
        uses: actions/checkout@v7
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - name: Cache
        uses: Swatinem/rust-cache@v2
        with:
          key: latest_deps
      - name: Update
        run: cargo update
      - name: Test
        run: cargo test --all-features --verbose
  build:
    name: Build
    runs-on: ubuntu-latest
    needs: [ fmt, test, package ]
    if: always()
    steps:
      - name: Check Results
        run: |
          test "${{ needs.fmt.result }}" = "success"
          test "${{ needs.test.result }}" = "success"
          test "${{ needs.package.result }}" = "success"