mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
Project import generated by Copybara. GitOrigin-RevId: 92ea93d1b47a82667044bd0af05f7fdb34d2c2c2
44 lines
1.0 KiB
Python
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
|