package com.codepoetics.octarine.records;
import com.codepoetics.octarine.functional.extractors.Extractor;
import java.util.LinkedList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
@FunctionalInterface
public interface Schema<T> extends BiConsumer<Record, Consumer<String>>, Extractor.FromPredicate<Record, Valid<T>> {
@Override
default boolean test(Record record) {
return validate(record).isValid();
}
@Override
default Valid<T> extract(Record record) {
return validate(record).get();
}
default Validation<T> validate(Value... values) {
return validate(Record.of(values));
}
default Validation<T> validate(Record record) {
List<String> validationErrors = new LinkedList<>();
accept(record, validationErrors::add);
if (validationErrors.isEmpty()) {
return Validation.valid(new ValidRecord<>(record, this));
}
return Validation.invalid(validationErrors);
}
}