#!/usr/bin/env python3
# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# To check for violations:
# $ ./tools/clippy
#
# To fix violations where possible:
# $ ./tools/clippy --fix

from typing import Optional
from impl.common import CROSVM_ROOT, run_main, cmd, chdir, Triple, SHORTHANDS
from impl.test_config import DO_NOT_BUILD_RISCV64

clippy = cmd("cargo clippy").with_color_flag()


def main(
    fix: bool = False,
    json: bool = False,
    locked: bool = False,
    platform: Optional[str] = None,
):
    try:
        triple: Triple = Triple.from_shorthand(platform) if platform else Triple.host_default()
    except Exception as e:
        raise type(e)(str(e) + f"\nValid platforms are {', '.join(SHORTHANDS.keys())}")

    chdir(CROSVM_ROOT)

    # Note: Clippy checks are configured in .cargo/config.toml
    args = [
        "--message-format=json" if json else None,
        "--locked" if locked else None,
        "--all-targets",
        "--",
        "-Dwarnings",
    ]
    if fix:
        args = [
            "--fix",
            "--allow-no-vcs",
            "--allow-dirty",
            "--allow-staged",
            *args,
        ]
    # For experimental builds, don't clippy the whole workspace, just what's enabled by features.
    if triple in (Triple.from_shorthand("riscv64"), Triple.from_shorthand("android")):
        args = ["--no-default-features", *args]
    else:
        args = ["--workspace", *args]

    print("Clippy crosvm workspace")
    clippy(
        f"--features={triple.feature_flag}",
        *args,
    ).with_envs(triple.get_cargo_env()).fg()


if __name__ == "__main__":
    run_main(main)
