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

package io.opentelemetry.instrumentation.api.instrumenter.url;

import javax.annotation.Nullable;

/**
 * An interface for getting URL attributes.
 *
 * <p>Instrumentation authors will create implementations of this interface for their specific
 * library/framework. It will be used by the {@link UrlAttributesExtractor} (or other convention
 * specific extractors) to obtain the various URL attributes in a type-generic way.
 */
public interface UrlAttributesGetter<REQUEST> {

  /**
   * Returns the <a href="https://www.rfc-editor.org/rfc/rfc3986#section-3.1">URI scheme</a>
   * component identifying the used protocol.
   *
   * <p>Examples: {@code https}, {@code ftp}, {@code telnet}
   */
  @Nullable
  default String getUrlScheme(REQUEST request) {
    return null;
  }

  /**
   * Returns the <a href="https://www.rfc-editor.org/rfc/rfc3986#section-3.3">URI path</a>
   * component.
   *
   * <p>Examples: {@code /search}
   */
  @Nullable
  default String getUrlPath(REQUEST request) {
    return null;
  }

  /**
   * Returns the <a href="https://www.rfc-editor.org/rfc/rfc3986#section-3.4">URI query</a>
   * component.
   *
   * <p>Examples: {@code q=OpenTelemetry}
   */
  @Nullable
  default String getUrlQuery(REQUEST request) {
    return null;
  }
}
