1. import json
  2. from typing import Any, Callable, Dict, List, Optional, Union
  3. def serialize_cli_args(args: Dict[str, Any], schema: Dict[str, str]) -> str:
  4. """Serializes CLI arguments to JSON with schema validation and defensive checks.
  5. Args:
  6. args: Dictionary of CLI arguments (e.g., {"--name": "John", "--age": 30}).
  7. schema: Dictionary defining the expected type of each argument.
  8. (e.g., {"--name": "string", "--age": "integer"})
  9. Returns:
  10. JSON string representation of the validated arguments.
  11. Raises ValueError if validation fails.
  12. """
  13. validated_args: Dict[str, Any] = {}
  14. for arg_name, arg_type in schema.items():
  15. if arg_name in args:
  16. value = args[arg_name]
  17. if arg_type == "string":
  18. if not isinstance(value, str):
  19. raise ValueError(f"Argument '{arg_name}' must be a string, got {type(value)}")
  20. validated_args[arg_name] = value
  21. elif arg_type == "integer":
  22. if not isinstance(value, int):
  23. try:
  24. validated_args[arg_name] = int(value) #attempt conversion
  25. except (ValueError, TypeError):
  26. raise ValueError(f"Argument '{arg_name}' must be an integer, got {type(value)}")
  27. else:
  28. validated_args[arg_name] = value
  29. elif arg_type == "float":
  30. if not isinstance(value, (int, float)):
  31. try:
  32. validated_args[arg_name] = float(value) #attempt conversion
  33. except (ValueError, TypeError):
  34. raise ValueError(f"Argument '{arg_name}' must be a float, got {type(value)}")
  35. else:
  36. validated_args[arg_name] = value
  37. elif arg_type == "boolean":
  38. if not isinstance(value, bool):
  39. if isinstance(value, str):
  40. value = value.lower()
  41. if value in ("true", "1", "yes"):
  42. validated_args[arg_name] = True
  43. elif value in ("false", "0", "no"):
  44. validated_args[arg_name] = False
  45. else:
  46. raise ValueError(f"Argument '{arg_name}' must be a boolean, got {type(value)}")
  47. else:
  48. raise ValueError(f"Argument '{arg_name}' must be a boolean, got {type(value)}")
  49. else:
  50. validated_args[arg_name] = value
  51. elif arg_type == "list":
  52. if not isinstance(value, list):
  53. raise ValueError(f"Argument '{arg_name}' must be a list, got {type(value)}")
  54. validated_args[arg_name] = value
  55. else:
  56. raise ValueError(f"Unsupported argument type: {arg_type} for argument '{arg_name}'")
  57. elif arg_name in schema:
  58. raise ValueError(f"Missing required argument: '{arg_name}'")
  59. return json.dumps(validated_args, indent=2)

Add your comment