Coverage for hdl_registers/parser/json.py: 86%

22 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-03-12 11:11 +0000

1# -------------------------------------------------------------------------------------------------- 

2# Copyright (c) Lukas Vik. All rights reserved. 

3# 

4# This file is part of the hdl-registers project, an HDL register generator fast enough to run 

5# in real time. 

6# https://hdl-registers.com 

7# https://github.com/hdl-registers/hdl-registers 

8# -------------------------------------------------------------------------------------------------- 

9 

10# ruff: noqa: A005 

11 

12from __future__ import annotations 

13 

14import json 

15from typing import TYPE_CHECKING, Any 

16 

17from tsfpga.system_utils import read_file 

18 

19from .parser import RegisterParser 

20 

21if TYPE_CHECKING: 

22 from pathlib import Path 

23 

24 from hdl_registers.register import Register 

25 from hdl_registers.register_list import RegisterList 

26 

27 

28def from_json( 

29 name: str, json_file: Path, default_registers: list[Register] | None = None 

30) -> RegisterList: 

31 """ 

32 Parse a JSON file with register data. 

33 

34 Arguments: 

35 name: The name of the register list. 

36 json_file: The JSON file path. 

37 default_registers: List of default registers. 

38 

39 Return: 

40 The resulting register list. 

41 """ 

42 parser = RegisterParser( 

43 name=name, source_definition_file=json_file, default_registers=default_registers 

44 ) 

45 json_data = _load_json_file(file_path=json_file) 

46 

47 return parser.parse(register_data=json_data) 

48 

49 

50def _load_json_file(file_path: Path) -> dict[str, Any]: 

51 """ 

52 Load and parse the JSON data into a dictionary. Raise exceptions if things dont work. 

53 """ 

54 if not file_path.exists(): 

55 raise FileNotFoundError(f"Requested JSON file does not exist: {file_path}") 

56 

57 raw_json = read_file(file_path) 

58 try: 

59 return json.loads(raw_json) 

60 except Exception as exception_info: 

61 message = f"Error while parsing JSON file {file_path}:\n{exception_info}" 

62 raise ValueError(message) from exception_info