package uulm.teamname.marvelous.gamelibrary.json; import jakarta.validation.ConstraintViolation; import jakarta.validation.Validator; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; public class Validation { private Validation() {} private static final Validator validator; static { var factory = jakarta.validation.Validation.buildDefaultValidatorFactory(); validator = factory.getValidator(); } public static Set<ConstraintViolation<Object>> validate(Object object) { return validator.validate(object); } /** * Validates the given object by using a {@link Validator}, and generates * a {@link String} from the violations. If there aren't any violations, and the object perfectly * conforms to the shape it should be in, an empty optional is returned. * @param object is the object to validate * @return an {@link Optional}<{@link String}> describing the violations the object commits, * or an empty {@link Optional} if there aren't any */ public static Optional<String> validateAndGetString(Object object) { var violations = validator.validate(object); if (violations.isEmpty()) return Optional.empty(); else { return Optional.of(violations.stream() .map(violation -> violation.getPropertyPath() + ": " + violation.getMessage()) .collect(Collectors.joining(", "))); } } }