|
"""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 |
|
|