#!/bin/bash
set -e

action="$1"
shift

output_dir=""
repo_dir=""
lockfile=""

while [ $# -gt 0 ]; do
    case "$1" in
        --output-dir)
            output_dir="$2"
            shift 2
            ;;
        --repository-dir)
            repo_dir="$2"
            shift 2
            ;;
        --lockfile)
            lockfile="$2"
            shift 2
            ;;
        *)
            shift
            ;;
    esac
done

if [ "$action" = "splice" ]; then
    if [ -n "$output_dir" ]; then
        mkdir -p "$output_dir"
        touch "$output_dir/Cargo.lock"
        echo "{}" > "$output_dir/metadata.json"
    fi
    exit 0
fi

if [ "$action" = "generate" ]; then
    if [ -n "$repo_dir" ]; then
        mkdir -p "$repo_dir/crates"
        cat << 'EOF' > "$repo_dir/crates/BUILD.bazel"
load("@rules_rust//rust:defs.bzl", "rust_library")

package(default_visibility = ["//visibility:public"])

rust_library(
    name = "anyhow",
    srcs = [":anyhow.rs"],
    edition = "2021",
)

rust_library(
    name = "uuid",
    srcs = [":uuid.rs"],
    edition = "2021",
)

genrule(
    name = "gen_anyhow",
    outs = ["anyhow.rs"],
    cmd = 'echo "pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;" > $@',
)

genrule(
    name = "gen_uuid",
    outs = ["uuid.rs"],
    cmd = 'echo "pub struct Uuid; impl Uuid { pub fn new_v4() -> &\'static str { \\"00000000-0000-4000-8000-000000000000\\" } }" > $@',
)
EOF

        cat << 'EOF' > "$repo_dir/crates/defs.bzl"
# Empty
EOF
    fi

    if [ -n "$lockfile" ]; then
        mkdir -p "$(dirname "$lockfile")"
        echo '{"crates": {}}' > "$lockfile"
    fi
    exit 0
fi

exit 0
