Files
allwpilib/shared/bazel/rules/robotpy/hatchlib_native_port/validate.py
PJ Reiniger bd1dcc4358 [bazel][robotpy] Add mirror for robotpy's wpiuil and wpinet libraries (#8062)
Project import generated by Copybara.

GitOrigin-RevId: 92ea93d1b47a82667044bd0af05f7fdb34d2c2c2
2025-08-30 11:55:11 -07:00

44 lines
1.0 KiB
Python

import typing
import validobj.validation
from validobj import errors
T = typing.TypeVar("T")
class ValidationError(Exception):
pass
def _convert_validation_error(
fname, ve: errors.ValidationError, prefix: str
) -> ValidationError:
locs = []
msgs = []
e: typing.Optional[BaseException] = ve
while e is not None:
if isinstance(e, errors.WrongFieldError):
locs.append(f".{e.wrong_field}")
elif isinstance(e, errors.WrongListItemError):
locs.append(f"[{e.wrong_index}]")
else:
msgs.append(str(e))
e = e.__cause__
loc = "".join(locs)
if loc.startswith("."):
loc = loc[1:]
msg = "\n ".join(msgs)
vmsg = f"{fname}: {prefix}{loc}:\n {msg}"
return ValidationError(vmsg)
def parse_input(value: typing.Any, spec: typing.Type[T], fname, prefix: str) -> T:
try:
return validobj.validation.parse_input(value, spec)
except errors.ValidationError as ve:
raise _convert_validation_error(fname, ve, prefix) from None