| """Utilities for the json_fixes package.""" |
| import json |
| import re |
|
|
| from jsonschema import Draft7Validator |
|
|
| from autogpt.config import Config |
| from autogpt.logs import logger |
|
|
| CFG = Config() |
|
|
|
|
| def extract_char_position(error_message: str) -> int: |
| """Extract the character position from the JSONDecodeError message. |
| |
| Args: |
| error_message (str): The error message from the JSONDecodeError |
| exception. |
| |
| Returns: |
| int: The character position. |
| """ |
|
|
| char_pattern = re.compile(r"\(char (\d+)\)") |
| if match := char_pattern.search(error_message): |
| return int(match[1]) |
| else: |
| raise ValueError("Character position not found in the error message.") |
|
|
|
|
| def validate_json(json_object: object, schema_name: object) -> object: |
| """ |
| :type schema_name: object |
| :param schema_name: |
| :type json_object: object |
| """ |
| with open(f"autogpt/json_utils/{schema_name}.json", "r") as f: |
| schema = json.load(f) |
| validator = Draft7Validator(schema) |
|
|
| if errors := sorted(validator.iter_errors(json_object), key=lambda e: e.path): |
| logger.error("The JSON object is invalid.") |
| if CFG.debug_mode: |
| logger.error( |
| json.dumps(json_object, indent=4) |
| ) |
| logger.error("The following issues were found:") |
|
|
| for error in errors: |
| logger.error(f"Error: {error.message}") |
| elif CFG.debug_mode: |
| print("The JSON object is valid.") |
|
|
| return json_object |
|
|