blob: 7cffd8bf7174ed702e6d7289f8ff890c2d17f5ef [file] [log] [blame] [edit]
# 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("")