# Since cargo 1.31, install only uses $CARGO_HOME/config, ignoring $PWD.
#   https://github.com/rust-lang/cargo/issues/6397
# But we can set CARGO_HOME locally, which is a good idea anyway to make sure
# it never writes to ~/.cargo during rpmbuild.
# We also need RUSTC_BOOTSTRAP since we use -Z avoid-dev-deps
# until it gets stabilized: https://github.com/rust-lang/cargo/issues/5133
%__cargo %{_bindir}/env CARGO_HOME=.cargo RUSTC_BOOTSTRAP=1 %{_bindir}/cargo
%__cargo_common_opts %{?_smp_mflags} -Z avoid-dev-deps
%__cargo_inspector env LANG=C.UTF-8 %{_bindir}/cargo-inspector

%cargo_registry %{_datadir}/cargo/registry

%__cargo_is_lib() %__cargo_inspector --target-kinds Cargo.toml | grep -q -F -x "$(printf 'lib\\\nrlib\\\nproc-macro')"
%__cargo_is_bin() %__cargo_inspector --target-kinds Cargo.toml | grep -q -F -x bin

%cargo_prep (\
set -eu \
%{__mkdir} -p .cargo \
cat > .cargo/config << EOF \
[build]\
rustc = "%{__rustc}"\
rustdoc = "%{__rustdoc}"\
rustflags = %{__global_rustflags_toml}\
\
[install]\
root = "%{buildroot}%{_prefix}"\
\
[term]\
verbose = true\
\
[source]\
\
[source.local-registry]\
directory = "%{cargo_registry}"\
\
[source.crates-io]\
registry = "https://crates.io"\
replace-with = "local-registry"\
EOF\
%{__rm} -f Cargo.lock \
)

%__cargo_parse_opts(naf:) %{shrink:\
%{-f:%{-a:%{error:Can't specify both -f(%{-f*}) and -a}}} \
  %{-n:--no-default-features}                             \
  %{-a:--all-features}                                    \
  %{-f:--features %{-f*}}                                 \
  %{nil}
}

%cargo_generate_buildrequires(af:) \
%if ! 0%{?__cargo_skip_build} \
  %{__cargo_inspector} -BR %{__cargo_parse_opts %{-a} %{-f:-f%{-f*}}} Cargo.toml \
  %if %{with check} \
    %{__cargo_inspector} -TR Cargo.toml \
  %endif \
%endif

%cargo_build(naf:) \
%if ! 0%{?__cargo_skip_build} \
  %{shrink:\
    %{__cargo} build                                   \
      %{__cargo_common_opts}                           \
      --release                                        \
      %{__cargo_parse_opts %{-n} %{-a} %{-f:-f%{-f*}}} \
      %*                                               \
  } \
%endif

%cargo_test(naf:) \
%if ! 0%{?__cargo_skip_build} \
  %{shrink:\
    %{__cargo} test                                    \
      %{__cargo_common_opts}                           \
      --release                                        \
      --no-fail-fast                                   \
      %{__cargo_parse_opts %{-n} %{-a} %{-f:-f%{-f*}}} \
      %*                                               \
  } \
%endif

%cargo_install(t:naf:) (\
set -eu                                                             \
if %__cargo_is_lib; then                                            \
  CRATE_NAME=$(%__cargo_inspector --name Cargo.toml)                \
  CRATE_VERSION=$(%__cargo_inspector --version Cargo.toml)          \
  REG_DIR=%{buildroot}%{cargo_registry}/$CRATE_NAME-$CRATE_VERSION  \
  %{__mkdir} -p $REG_DIR                                            \
# Drop all dependency/features information                          \
# so that cargo doesn't fail resolving dependencies:                \
# https://github.com/rust-lang/cargo/pull/6729                      \
  %{__awk} -i inplace -v INPLACE_SUFFIX=.deps '/^\\\[((.+\\\.)?((dev|build)-)?dependencies|features)/{f=1;next} /^\\\[/{f=0}; !f' Cargo.toml \
  %{__cargo} package -l | grep -w -E -v 'Cargo.(lock|toml.orig)' | xargs -d '\\\n' %{__cp} --parents -a -t $REG_DIR \
  %{__mv} Cargo.toml{.deps,}                                        \
  %{__cp} -a Cargo.toml $REG_DIR/Cargo.toml                         \
  %{__rm} -f $REG_DIR/Cargo.toml.deps                               \
  echo '{"files":{},"package":""}' > $REG_DIR/.cargo-checksum.json  \
fi \
%if ! %__cargo_skip_build \
  if %__cargo_is_bin; then                                          \
    %{shrink:\
      %{__cargo} install                                            \
        %{__cargo_common_opts}                                      \
        --no-track                                                  \
        --path .                                                    \
        %{__cargo_parse_opts %{-n} %{-a} %{-f:-f%{-f*}}}            \
        %*                                                          \
    } \
  fi \
%endif \
)

%__cargo_feature_from_name(n:) %{lua:
local name = rpm.expand("%{-n*}")
local feature = string.match(name, "^.+%+(.+)-devel$")
if feature == nil then
  print()
else
  print(feature)
end
}