/**
 * Copyright: Copyright Jason White, 2016
 * License:   MIT
 * Authors:   Jason White
 */
module button.edgedata;

/**
 * The type of an edge.
 */
enum EdgeType
{
    /**
     * An explicit edge is one that was specified in the build description.
     *
     * The explicit specification of an edge from a task to a resource should be
     * considered a contract that must be fulfilled by the task. If the task
     * does not report that resource as an output, the task is marked as failed.
     */
    explicit = 1 << 0,

    /**
     * An implicit edge is one that is reported by a task.
     *
     * The set of implicit edges should always be a superset of the set of
     * explicit edges. If this is not the case, it implies one of two problems:
     *
     *  1. A superfluous dependency is specified in the build description.
     *  2. The task is not reporting all dependencies.
     *
     * Case (1) causes no harm except over-building. However, case (2) should be
     * considered an error because explicit edges are a contract that the task
     * must fulfill. It is not possible to differentiate between these two
     * cases. Thus, the more conservative approach is taken to always consider
     * it an error if the set of explicit edges is not a subset of the set of
     * implicit edges.
     */
    implicit = 1 << 1,

    /**
     * An edge is both explicit and implicit if it is in the build description
     * and reported by a task.
     */
    both = explicit | implicit,
}