# Copyright 2017 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 file lists the Rust crates hosted in the Fuchsia tree which have been
# published to crates.io. This ensures we use the local version and not the
# vendored version when compiling other crates.

import os

ROOT_PATH = os.path.abspath(__file__ + "/../../..")

RUST_CRATES = {
    # Local crates.
    # These are usually Fuchsia-owned crates with BUILD.gn files, but may
    # occasionally (and temporarily) contain third-party mirrors with changes
    # specific to Fuchsia. GN files for these mirrors will be hosted under
    # //build/secondary.
    "published": {
        "fuchsia-zircon": {
            "version": "0.3.0",
            "path": "garnet/public/rust/crates/fuchsia-zircon",
            "target": "//garnet/public/rust/crates/fuchsia-zircon",
        },
        "fuchsia-zircon-sys": {
            "version": "0.3.0",
            "path": "garnet/public/rust/crates/fuchsia-zircon/fuchsia-zircon-sys",
            "target": "//garnet/public/rust/crates/fuchsia-zircon/fuchsia-zircon-sys",
        },
        # TODO(pylaligand): move mio and tokio-core back to the mirrors group
        # once fuchsia-zircon is published.
        "mio": {
            "version": "0.6.10",
            "path": "third_party/rust-mirrors/mio",
            "target": "//third_party/rust-mirrors/mio",
        },
        "tokio-core": {
            "version": "0.1.10",
            "path": "third_party/rust-mirrors/tokio-core",
            "target": "//third_party/rust-mirrors/tokio-core",
        },
    },
    # Third-party crates whose sources are mirrored.
    # The GN target for these will be automatically generated under
    # //third_party/rust-crates.
    "mirrors": {
    },
}

def get_all_paths(relative=False):
    mapper = lambda (k, v): (v["path"] if relative
                             else os.path.join(ROOT_PATH, v["path"]))
    def extract_paths(crate_data): return map(mapper, crate_data.iteritems())
    return (extract_paths(RUST_CRATES["published"]) +
            extract_paths(RUST_CRATES["mirrors"]))

RUST_LAYERS = ["garnet", "peridot", "topaz", "third_party/rust-mirrors"]

# Find every crate path in the Fuchsia tree, regardless of build speciality
def get_really_all_paths():
    crate_dirs = []
    for layer in RUST_LAYERS:
        for root, dirs, files in os.walk(os.path.join(ROOT_PATH, layer)):
            for file in files:
                if file == "Cargo.toml":
                    crate_dirs.append(os.path.relpath(root, ROOT_PATH))
                    break
    return crate_dirs

if __name__ == "__main__":
    for path in get_really_all_paths():
        print(path)