/*
 * Copyright 2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder;

public interface PendingDependenciesHandler {
    PendingDependenciesHandler IGNORE = new IgnorePendingDependenciesHandler();

    Visitor start(boolean isOptionalConfiguration);

    interface Visitor {
        boolean maybeAddAsPendingDependency(NodeState node, DependencyState dependencyState);

        void complete();
    }

    class IgnorePendingDependenciesHandler implements PendingDependenciesHandler {
        @Override
        public Visitor start(boolean isOptionalConfiguration) {
            return new IgnorePendingDependenciesVisitor(isOptionalConfiguration);
        }

        static class IgnorePendingDependenciesVisitor implements PendingDependenciesHandler.Visitor {
            private final boolean isOptionalConfiguration;

            IgnorePendingDependenciesVisitor(boolean isOptionalConfiguration) {
                this.isOptionalConfiguration = isOptionalConfiguration;
            }

            @Override
            public boolean maybeAddAsPendingDependency(NodeState node, DependencyState dependencyState) {
                return !isOptionalConfiguration && dependencyState.getDependencyMetadata().isPending();
            }

            @Override
            public void complete() {
            }
        }
   }

}
