/*
 * Copyright 2016 Open Networking Laboratory
 *
 * 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.onosproject.yangutils.linker;

import java.util.Map;
import org.onosproject.yangutils.datamodel.HasResolutionInfo;

/**
 * Abstraction of entity which provides linking service of YANG files.
 */
public interface YangLinker {

    /**
     * Resolve the import and include dependencies for a given resolution
     * information.
     *
     * @param fileMapEntry map entry for which resolution is to be done
     * @param yangFilesMap map of dependent file and resolution information*/
    void resolveDependencies(Map.Entry<String, HasResolutionInfo> fileMapEntry, Map<String,
            HasResolutionInfo> yangFilesMap);
}
