/*
 * Copyright The OpenTelemetry Authors
 * SPDX-License-Identifier: Apache-2.0
 */

package io.opentelemetry.instrumentation.api.semconv.http;

/**
 * Represents the source that provided the {@code http.route} attribute.
 *
 * @since 2.0.0
 */
public enum HttpServerRouteSource {
  /**
   * Represents a "filter" that may execute before the actual server handler. E.g. the Servlet API
   * {@code Filter} interface. Since multiple filters may match the same request, the one with the
   * longest (most detailed) route will be chosen.
   */
  SERVER_FILTER(1, /* useFirst= */ false),
  /** Represents the actual server handler. E.g. the Servlet API {@code Servlet} interface. */
  SERVER(2),
  /**
   * Represents the controller, usually defined as part of some MVC framework. E.g. a Spring Web MVC
   * controller method, or a JAX-RS annotated resource method.
   */
  CONTROLLER(3),
  /**
   * Represents a nested controller, usually defined as part of some MVC framework. E.g. a JAX-RS
   * annotated sub-resource method. Since multiple nested controllers may match the same request,
   * the one with the longest (most detailed) route will be chosen.
   */
  NESTED_CONTROLLER(4, /* useFirst= */ false);

  final int order;
  final boolean useFirst;

  HttpServerRouteSource(int order) {
    this(order, /* useFirst= */ true);
  }

  HttpServerRouteSource(int order, boolean useFirst) {
    this.order = order;
    this.useFirst = useFirst;
  }
}
