sqlite-hashes 0.7.0

Hashing functions for SQLite with aggregation support: MD5, SHA1, SHA256, SHA512, FNV-1a, xxHash
Documentation
#!/usr/bin/env just --justfile

sqlite3 := 'sqlite3'

@_default:
    just --list --unsorted

# Clean all build artifacts
clean:
    cargo clean

build: build-lib build-ext

build-lib:
    cargo build --workspace --all-targets --bins --tests --lib --benches

build-ext *ARGS:
    # Window is not supported because it requires bundling the SQLite library
    # See https://github.com/rusqlite/rusqlite/discussions/1423
    cargo build --example sqlite_hashes --no-default-features --features default_loadable_extension {{ ARGS }}

cross-build-ext *ARGS:
    # Window is not supported because it requires bundling the SQLite library
    # See https://github.com/rusqlite/rusqlite/discussions/1423
    cross build --example sqlite_hashes --no-default-features --features default_loadable_extension {{ ARGS }}

cross-build-ext-aarch64: (cross-build-ext "--target=aarch64-unknown-linux-gnu" "--release")

# Run cargo fmt and cargo clippy
lint: fmt clippy

# Run cargo fmt
fmt:
    cargo +nightly fmt -- --config imports_granularity=Module,group_imports=StdExternalCrate

# Run cargo clippy
clippy:
    cargo clippy -- -D warnings
    cargo clippy --workspace --all-targets --bins --tests --lib --benches --examples -- -D warnings
    cargo clippy --features aggregate -- -D warnings
    cargo clippy --features window -- -D warnings

# Build and open code documentation
docs:
    cargo doc --no-deps --open

# Run benchmarks
bench:
    cargo bench
    open target/criterion/report/index.html

# Test documentation
test-doc:
    cargo test --doc
    RUSTDOCFLAGS="-D warnings" cargo doc --no-deps

# Run all tests
test:
    rustc --version
    cargo --version
    cargo fmt --all -- --check
    RUSTFLAGS='-D warnings' cargo build
    {{ just_executable() }} test-lib
    @echo "### DOCS #######################################################################################################################"
    {{ just_executable() }} test-doc
    @echo "### CLIPPY #####################################################################################################################"
    {{ just_executable() }} clippy
    @echo "### BUILD EXTENSION ############################################################################################################"
    {{ just_executable() }} build-ext
    @echo "### TEST EXTENSION #############################################################################################################"
    {{ just_executable() }} test-ext

# Test the library
test-lib *ARGS: \
    ( test-one-lib "--no-default-features" "--features" "trace,hex,window,md5"      ) \
    ( test-one-lib "--no-default-features" "--features" "trace,hex,window,sha1"     ) \
    ( test-one-lib "--no-default-features" "--features" "trace,hex,window,sha224"   ) \
    ( test-one-lib "--no-default-features" "--features" "trace,hex,window,sha256"   ) \
    ( test-one-lib "--no-default-features" "--features" "trace,hex,window,sha384"   ) \
    ( test-one-lib "--no-default-features" "--features" "trace,hex,window,sha512"   ) \
    ( test-one-lib "--no-default-features" "--features" "trace,hex,window,fnv"   ) \
    ( test-one-lib "--no-default-features" "--features" "trace,hex,window,xxhash"   ) \
    \
    ( test-one-lib "--no-default-features" "--features" "md5,sha1,sha224,sha256,sha384,sha512,fnv,xxhash"                      ) \
    ( test-one-lib "--no-default-features" "--features" "md5,sha1,sha224,sha256,sha384,sha512,fnv,xxhash,aggregate"            ) \
    ( test-one-lib "--no-default-features" "--features" "md5,sha1,sha224,sha256,sha384,sha512,fnv,xxhash,window"               ) \
    \
    ( test-one-lib "--no-default-features" "--features" "md5,sha1,sha224,sha256,sha384,sha512,fnv,xxhash,hex"                  ) \
    ( test-one-lib "--no-default-features" "--features" "md5,sha1,sha224,sha256,sha384,sha512,fnv,xxhash,hex,aggregate"        ) \
    ( test-one-lib "--no-default-features" "--features" "md5,sha1,sha224,sha256,sha384,sha512,fnv,xxhash,hex,window"           ) \
    \
    ( test-one-lib "--no-default-features" "--features" "md5,sha1,sha224,sha256,sha384,sha512,fnv,xxhash,trace"                ) \
    ( test-one-lib "--no-default-features" "--features" "md5,sha1,sha224,sha256,sha384,sha512,fnv,xxhash,trace,aggregate"      ) \
    ( test-one-lib "--no-default-features" "--features" "md5,sha1,sha224,sha256,sha384,sha512,fnv,xxhash,trace,window"         ) \
    \
    ( test-one-lib "--no-default-features" "--features" "md5,sha1,sha224,sha256,sha384,sha512,fnv,xxhash,hex,trace"            ) \
    ( test-one-lib "--no-default-features" "--features" "md5,sha1,sha224,sha256,sha384,sha512,fnv,xxhash,hex,trace,aggregate"  ) \
    ( test-one-lib "--no-default-features" "--features" "md5,sha1,sha224,sha256,sha384,sha512,fnv,xxhash,hex,trace,window"     ) \

test-ext:
    ./tests/test-ext.sh

cross-test-ext-aarch64:
    docker run \
            --rm \
            -v "$(pwd):/workspace" \
            -w /workspace \
            --entrypoint sh \
            -e EXTENSION_FILE=target/aarch64-unknown-linux-gnu/release/examples/libsqlite_hashes \
            --platform linux/arm64 \
            arm64v8/ubuntu \
            -c 'apt-get update && apt-get install -y sqlite3 && tests/test-ext.sh'

[private]
test-one-lib *ARGS:
    @echo "### TEST {{ ARGS }} #######################################################################################################################"
    cargo test {{ ARGS }}

[private]
is-sqlite3-available:
    #!/usr/bin/env sh
    set -eu
    if ! command -v {{ sqlite3 }} &> /dev/null; then
        echo "{{ sqlite3 }} executable could not be found"
        exit 1
    fi
    echo "Found {{ sqlite3 }} executable:"
    {{ sqlite3 }} --version

# Run integration tests and save its output as the new expected output
bless *ARGS: (cargo-install "insta" "cargo-insta")
    cargo insta test --accept --unreferenced=auto {{ ARGS }}

# Check if a certain Cargo command is installed, and install it if needed
[private]
cargo-install $COMMAND $INSTALL_CMD="" *ARGS="":
    #!/usr/bin/env sh
    set -eu
    if ! command -v $COMMAND > /dev/null; then
        if ! command -v cargo-binstall > /dev/null; then
            echo "$COMMAND could not be found. Installing it with    cargo install ${INSTALL_CMD:-$COMMAND} {{ ARGS }}"
            cargo install ${INSTALL_CMD:-$COMMAND} {{ ARGS }}
        else
            echo "$COMMAND could not be found. Installing it with    cargo binstall ${INSTALL_CMD:-$COMMAND} {{ ARGS }}"
            cargo binstall ${INSTALL_CMD:-$COMMAND} {{ ARGS }}
        fi
    fi