| # Copyright 2026 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. |
| |
| """Host tool and library for converting legacy JSON traces into FXT format.""" |
| |
| import argparse |
| import json |
| import os |
| from typing import Any |
| |
| from trace_writing import fxt |
| |
| |
| class FxtConverter: |
| """Encapsulates JSON trace file conversion to Fuchsia's binary FXT format.""" |
| |
| def __init__(self) -> None: |
| """Initialize a new FxtConverter instance.""" |
| self._builder = fxt.Builder() |
| |
| @staticmethod |
| def _align(size: int) -> int: |
| return fxt.Builder._align(size) |
| |
| @staticmethod |
| def _pad_bytes(b: bytes) -> bytes: |
| return fxt.Builder._pad_bytes(b) |
| |
| @staticmethod |
| def _make_string_ref(s: str) -> int: |
| return fxt.Builder._make_string_ref(s) |
| |
| @staticmethod |
| def _pack_word(val: int) -> bytes: |
| return fxt.Builder._pack_word(val) |
| |
| @staticmethod |
| def _pack_argument(name: str, val: Any) -> bytes: |
| return fxt.Builder._pack_argument(name, val) |
| |
| @staticmethod |
| def _write_word(val: int) -> bytes: |
| return fxt.Builder._pack_word(val) |
| |
| @staticmethod |
| def _write_argument(name: str, val: Any) -> bytes: |
| return fxt.Builder._pack_argument(name, val) |
| |
| def convert( |
| self, |
| json_file: str | os.PathLike[Any], |
| fxt_file: str | os.PathLike[Any], |
| ) -> None: |
| """Convert a JSON trace file to FXT format. |
| |
| Args: |
| json_file: Path to the input Chrome JSON trace file. |
| fxt_file: Path where the output binary FXT file will be written. |
| |
| Raises: |
| OSError: If reading input or writing output fails. |
| json.JSONDecodeError: If json_file contains invalid JSON. |
| """ |
| with open(json_file, "r", encoding="utf-8") as f: |
| data = json.load(f) |
| builder = fxt.Builder.from_json_dict(data) |
| builder.write_to_file(fxt_file) |
| |
| |
| def main() -> None: |
| """CLI entry point for converting JSON trace files to FXT format.""" |
| parser = argparse.ArgumentParser(description="Convert JSON trace to FXT") |
| parser.add_argument("json_file", help="Path to input JSON file") |
| parser.add_argument("fxt_file", help="Path to output FXT file") |
| args = parser.parse_args() |
| |
| converter = FxtConverter() |
| converter.convert(args.json_file, args.fxt_file) |
| print(f"Successfully converted {args.json_file} to {args.fxt_file}") |
| |
| |
| if __name__ == "__main__": |
| main() |