001package gudusoft.gsqlparser.catalog.input;
002
003import gudusoft.gsqlparser.catalog.diagnostic.CatalogDiagnostic;
004import gudusoft.gsqlparser.catalog.diagnostic.CatalogDiagnosticSeverity;
005
006import java.util.ArrayList;
007import java.util.Collections;
008import java.util.List;
009import java.util.Objects;
010
011/**
012 * Outcome of {@link CatalogModelValidator#validate}: pass/fail plus collected diagnostics.
013 *
014 * <p>Plan ยง7.1. {@link #ok()} returns {@code true} when no {@link CatalogDiagnosticSeverity#ERROR}
015 * diagnostics were emitted; WARN/INFO diagnostics do not fail validation.</p>
016 */
017public final class CatalogValidationResult {
018
019    private static final CatalogValidationResult EMPTY_OK =
020        new CatalogValidationResult(Collections.<CatalogDiagnostic>emptyList());
021
022    private final List<CatalogDiagnostic> diagnostics;
023    private final boolean ok;
024
025    private CatalogValidationResult(List<CatalogDiagnostic> diagnostics) {
026        this.diagnostics = Collections.unmodifiableList(new ArrayList<CatalogDiagnostic>(diagnostics));
027        boolean anyError = false;
028        for (CatalogDiagnostic d : this.diagnostics) {
029            if (d.severity() == CatalogDiagnosticSeverity.ERROR) {
030                anyError = true;
031                break;
032            }
033        }
034        this.ok = !anyError;
035    }
036
037    public static CatalogValidationResult of(List<CatalogDiagnostic> diagnostics) {
038        if (diagnostics == null || diagnostics.isEmpty()) {
039            return EMPTY_OK;
040        }
041        return new CatalogValidationResult(diagnostics);
042    }
043
044    public static CatalogValidationResult empty() {
045        return EMPTY_OK;
046    }
047
048    public boolean ok() {
049        return ok;
050    }
051
052    public List<CatalogDiagnostic> diagnostics() {
053        return diagnostics;
054    }
055
056    @Override
057    public boolean equals(Object o) {
058        if (this == o) return true;
059        if (!(o instanceof CatalogValidationResult)) return false;
060        CatalogValidationResult that = (CatalogValidationResult) o;
061        return ok == that.ok && diagnostics.equals(that.diagnostics);
062    }
063
064    @Override
065    public int hashCode() {
066        return Objects.hash(ok, diagnostics);
067    }
068
069    @Override
070    public String toString() {
071        return "CatalogValidationResult{ok=" + ok + ", diagnostics=" + diagnostics.size() + '}';
072    }
073}