Source code for erc7730.convert.convert

from pathlib import Path

from rich import print

from erc7730.common.output import ConsoleOutputAdder, RaisingOutputAdder
from erc7730.common.pydantic import model_to_json_file
from erc7730.convert import ERC7730Converter, InputType, OutputType


[docs] def convert_to_file_and_print_errors( input_descriptor: InputType, output_file: Path, converter: ERC7730Converter[InputType, OutputType] ) -> bool: """ Convert an input descriptor to an output file using a converter, and print any errors encountered. :param input_descriptor: loaded, valid input descriptor :param output_file: output file path (overwritten if already exists) :param converter: converter to use :return: True if output file was written (if no errors, or only non-fatal errors encountered) """ if (output_descriptor := convert_and_print_errors(input_descriptor, converter)) is not None: if isinstance(output_descriptor, dict): for identifier, descriptor in output_descriptor.items(): descriptor_file = output_file.with_suffix(f".{identifier}{output_file.suffix}") model_to_json_file(descriptor_file, descriptor) print(f"[green]generated {descriptor_file} ✅[/green]") else: model_to_json_file(output_file, output_descriptor) print(f"[green]generated {output_file} ✅[/green]") return True print("[red]conversion failed ❌[/red]") return False
[docs] def convert_and_print_errors( input_descriptor: InputType, converter: ERC7730Converter[InputType, OutputType] ) -> OutputType | dict[str, OutputType] | None: """ Convert an input descriptor using a converter, print any errors encountered, and return the result model. :param input_descriptor: loaded, valid input descriptor :param converter: converter to use :return: output descriptor (if no errors, or only non-fatal errors encountered), None otherwise """ return _normalize_result(converter.convert(input_descriptor, ConsoleOutputAdder()))
[docs] def convert_and_raise_errors( input_descriptor: InputType, converter: ERC7730Converter[InputType, OutputType] ) -> OutputType | dict[str, OutputType] | None: """ Convert an input descriptor using a converter, raising any errors encountered, and return the result model. :param input_descriptor: loaded, valid input descriptor :param converter: converter to use :return: output descriptor (if no errors, or only non-fatal errors encountered), None otherwise """ return _normalize_result(converter.convert(input_descriptor, RaisingOutputAdder()))
def _normalize_result(result: OutputType | dict[str, OutputType] | None) -> OutputType | dict[str, OutputType] | None: if isinstance(result, dict): match len(result): case 0: return None case 1: return next(iter(result.values())) case _: return result return result