001package gudusoft.gsqlparser.catalog.runtime;
002
003import gudusoft.gsqlparser.catalog.diagnostic.CatalogDiagnostic;
004
005import java.util.ArrayList;
006import java.util.Collections;
007import java.util.List;
008import java.util.Optional;
009
010/**
011 * Outcome of a {@link CatalogResolver#resolve} call.
012 *
013 * <p>Plan ยง7.2. {@link #miss(List)} carries diagnostics describing why; {@link #ok(CatalogBinding)}
014 * carries the resolved binding.</p>
015 */
016public final class CatalogResolutionResult {
017
018    private final CatalogBinding binding;
019    private final List<CatalogDiagnostic> diagnostics;
020
021    private CatalogResolutionResult(CatalogBinding binding, List<CatalogDiagnostic> diagnostics) {
022        this.binding = binding;
023        this.diagnostics = diagnostics == null
024            ? Collections.<CatalogDiagnostic>emptyList()
025            : Collections.unmodifiableList(new ArrayList<CatalogDiagnostic>(diagnostics));
026    }
027
028    public boolean resolved() {
029        return binding != null;
030    }
031
032    public Optional<CatalogBinding> binding() {
033        return Optional.ofNullable(binding);
034    }
035
036    public Optional<CatalogObjectKind> kind() {
037        return binding == null ? Optional.<CatalogObjectKind>empty() : Optional.of(binding.kind());
038    }
039
040    public List<CatalogDiagnostic> diagnostics() {
041        return diagnostics;
042    }
043
044    public static CatalogResolutionResult miss(List<CatalogDiagnostic> diagnostics) {
045        return new CatalogResolutionResult(null, diagnostics);
046    }
047
048    public static CatalogResolutionResult ok(CatalogBinding binding) {
049        if (binding == null) {
050            throw new IllegalArgumentException("CatalogResolutionResult.ok: binding is required");
051        }
052        return new CatalogResolutionResult(binding, null);
053    }
054
055    public static CatalogResolutionResult ok(CatalogBinding binding, List<CatalogDiagnostic> diagnostics) {
056        if (binding == null) {
057            throw new IllegalArgumentException("CatalogResolutionResult.ok: binding is required");
058        }
059        return new CatalogResolutionResult(binding, diagnostics);
060    }
061}