#!/bin/bash

# Copyright 2024 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This script generates Rust bindings for fdf.
# Run `./bindgen.sh check` to validate that the bindings haven't changed.

# Determine paths for this script and its directory, and set $FUCHSIA_DIR.
readonly FULL_PATH="${BASH_SOURCE[0]}"
readonly SCRIPT_DIR="$(cd "$(dirname "${FULL_PATH}")" >/dev/null 2>&1 && pwd)"
source "${SCRIPT_DIR}/../../../../../tools/devshell/lib/vars.sh"

set -eu

cd "${SCRIPT_DIR}"

readonly RELPATH="${SCRIPT_DIR#${FUCHSIA_DIR}/}/bindgen.sh"
readonly BINDGEN="${PREBUILT_RUST_BINDGEN_DIR}/bindgen"

# Generate annotations for the top of the generated source file.
readonly RAW_LINES="// Copyright 2024 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Generated by ${RELPATH} using $("${BINDGEN}" --version)

#![allow(dead_code)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]

pub use zx_types::*;
"

readonly FUCHSIA_API_LEVEL_HEAD=4292870144
readonly RUST_FILE="fdf_sys/src/bindings.rs"
readonly ASYNC_INCLUDES_PATH="${FUCHSIA_DIR}"/sdk/lib/async/include
readonly DRIVER_RUNTIME_INCLUDES_PATH="${FUCHSIA_DIR}"/sdk/lib/driver/runtime/include

# Output to a tempfile in check mode, or the actual file when generating.
if [[ -v 1 && "$1" = "check" ]] ; then
  readonly OUTPUT="$(mktemp -p "${PWD}" --suffix=.rs)"
  trap "rm -f ${OUTPUT}" EXIT
else
  readonly OUTPUT="${RUST_FILE}"
fi

readonly tmp="$(mktemp --suffix=.h)"
function filter_headers() {
  for f in "$@" ; do
    # TODO(https://github.com/rust-lang/rust-bindgen/issues/316): Remove this sed
    # invocation when bindgen supports macros containing type casts.
    cat "${f}" >> "${tmp}" #| sed -E 's/(#define \w+) \(\(\w+_t\)(\w+)\)/\1 \(\2\)/g' >> "${tmp}"
  done
}
filter_headers \
  "${ASYNC_INCLUDES_PATH}"/lib/async/{dispatcher,paged_vmo,receiver,sequence_id,task,time,trap,wait}.h \
  "${DRIVER_RUNTIME_INCLUDES_PATH}"/lib/fdf/{arena,channel,channel_read,dispatcher,env,handle,testing,token,types}.h \
  "${FUCHSIA_DIR}"/sdk/lib/driver/symbols/symbols.h

"${BINDGEN}" \
    "${tmp}" \
    --disable-header-comment \
    --raw-line "${RAW_LINES}" \
    --with-derive-default \
    --impl-debug \
    --use-core \
    --output "${OUTPUT}" \
    --allowlist-item 'fdf_.+|async_.+|Driver.+|FDF_.+|DRIVER_.+' \
    --blocklist-type 'zx_.+' \
    -- \
    -D "__Fuchsia_API_level__=${FUCHSIA_API_LEVEL_HEAD}" \
    -I "${FUCHSIA_DIR}"/zircon/system/public \
    -I "${DRIVER_RUNTIME_INCLUDES_PATH}" \
    -I "${ASYNC_INCLUDES_PATH}"

# Use rustfmt directly instead of `fx format-code` because that requires the
# file to be within FUCHSIA_DIR, and in check mode we'll be running it on a
# temp file in TEMPDIR.
"${PREBUILT_RUST_DIR}"/bin/rustfmt \
    "${OUTPUT}" \
    --config-path "${FUCHSIA_DIR}"/rustfmt.toml \
    --unstable-features \
    --skip-children

if [[ -v 1 && "$1" = "check" ]] && ! diff "${OUTPUT}" "${RUST_FILE}" ; then
  echo "The Driver Runtime C++ headers have changed without updating the rust bindings."
  echo "Please run './bindgen.sh' in ${PWD}."
  exit 1
fi
