package com.codebyte.api.common.validation;

import jakarta.validation.valueextraction.ExtractedValue;
import jakarta.validation.valueextraction.ValueExtractor;
import org.openapitools.jackson.nullable.JsonNullable;

/**
 * Jakarta-native value extractor that lets Bean Validation reach the value inside a {@link
 * JsonNullable}. The library ships a {@code javax}-based extractor that is incompatible with
 * Hibernate Validator 8 (Jakarta), so we register this one via {@code META-INF/services} instead.
 *
 * <p>Only a present value is extracted, so an absent (undefined) field is never validated, while a
 * present value — including an explicit {@code null} — is.
 */
public class JsonNullableValueExtractor implements ValueExtractor<JsonNullable<@ExtractedValue ?>> {

    @Override
    public void extractValues(JsonNullable<?> originalValue, ValueReceiver receiver) {
        if (originalValue.isPresent()) {
            receiver.value(null, originalValue.get());
        }
    }
}
