|  | # 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. | 
|  |  | 
|  | import argparse | 
|  | import asyncio | 
|  | import json | 
|  | import sys | 
|  | import typing | 
|  | from collections import OrderedDict | 
|  |  | 
|  | import collectors | 
|  | import data | 
|  |  | 
|  |  | 
|  | class Options(argparse.Namespace): | 
|  | def __init__(self) -> None: | 
|  | self.format: str | None = "text" | 
|  |  | 
|  |  | 
|  | def main(arg_override: typing.Sequence[str] | None = None) -> None: | 
|  | parser = argparse.ArgumentParser( | 
|  | description="Print status of your fx environment" | 
|  | ) | 
|  | parser.add_argument( | 
|  | "-f", | 
|  | "--format", | 
|  | choices=["text", "json"], | 
|  | help="Format of the output", | 
|  | ) | 
|  |  | 
|  | args = parser.parse_args(args=arg_override, namespace=Options()) | 
|  |  | 
|  | asyncio.run(async_main(args)) | 
|  |  | 
|  |  | 
|  | async def async_main(args: Options) -> None: | 
|  | output_data = data.Data() | 
|  |  | 
|  | futures = [ | 
|  | collectors.environment_collector(), | 
|  | collectors.git_collector(), | 
|  | collectors.jiri_collector(), | 
|  | collectors.args_gn_collector(), | 
|  | ] | 
|  |  | 
|  | # Wrap futures in tasks so they execute asynchronously. | 
|  | tasks = list(map(lambda x: asyncio.create_task(x), futures)) | 
|  |  | 
|  | # Iterate over tasks in order, waiting for each to end. | 
|  | for task in tasks: | 
|  | results = await task | 
|  | output_data.add_results(results) | 
|  |  | 
|  | if args.format == "text" or args.format is None: | 
|  | print_text(output_data) | 
|  | elif args.format == "json": | 
|  | print_json(output_data) | 
|  |  | 
|  |  | 
|  | def print_text(output_data: data.Data) -> None: | 
|  | for category, items in output_data.items.items(): | 
|  | print(f"{category.pretty_str()}:") | 
|  |  | 
|  | for item in items: | 
|  | if isinstance(item.value, list) and not item.value: | 
|  | # Skip empty lists | 
|  | continue | 
|  | notes = f" ({item.notes})" if item.notes else "" | 
|  | print(f"  {item.title}: {item.normalized_value()}{notes}") | 
|  |  | 
|  |  | 
|  | def print_json(output_data: data.Data) -> None: | 
|  | result = OrderedDict() | 
|  |  | 
|  | for key, items in output_data.items.items(): | 
|  | item_dict = OrderedDict() | 
|  | for item in items: | 
|  | if isinstance(item.value, list) and len(item.value) == 0: | 
|  | continue | 
|  | item_dict[item.key] = item.to_dict() | 
|  |  | 
|  | result[key] = OrderedDict(name=key.pretty_str(), items=item_dict) | 
|  |  | 
|  | json.dump(result, sys.stdout) | 
|  | print("") |