diff --git a/fgpyo/util/metric.py b/fgpyo/util/metric.py index e9b91eee..823622d9 100644 --- a/fgpyo/util/metric.py +++ b/fgpyo/util/metric.py @@ -116,6 +116,7 @@ """ +import dataclasses from abc import ABC from enum import Enum from pathlib import Path @@ -127,6 +128,8 @@ from typing import List from typing import TypeVar +import attr + from fgpyo import io from fgpyo.util import inspect @@ -334,3 +337,14 @@ def fast_concat(*inputs: Path, output: Path) -> None: io.write_lines( path=output, lines_to_write=list(io.read_lines(input_path))[1:], append=True ) + + +def asdict(metric: Metric) -> dict[str, Any]: + """Convert a Metric instance to a dictionary.""" + + if dataclasses.is_dataclass(metric): + return dataclasses.asdict(metric) + elif attr.has(metric): + return attr.asdict(metric) + else: + assert False, "Unreachable"