// @generated by protobuf-ts 2.8.2 with parameter long_type_string
// @generated from protobuf file "pb/api/v1/data.proto" (package "testgrid.api.v1", syntax proto3)
// tslint:disable
import type { RpcTransport } from '@protobuf-ts/runtime-rpc';
import type { ServiceInfo } from '@protobuf-ts/runtime-rpc';
import { TestGridData } from './data';
import type { ListRowsResponse } from './data';
import type { ListRowsRequest } from './data';
import type { ListHeadersResponse } from './data';
import type { ListHeadersRequest } from './data';
import type { GetDashboardGroupResponse } from './data';
import type { GetDashboardGroupRequest } from './data';
import type { GetDashboardResponse } from './data';
import type { GetDashboardRequest } from './data';
import type { ListDashboardTabsResponse } from './data';
import type { ListDashboardTabsRequest } from './data';
import type { ListDashboardGroupResponse } from './data';
import type { ListDashboardGroupRequest } from './data';
import { stackIntercept } from '@protobuf-ts/runtime-rpc';
import type { ListDashboardResponse } from './data';
import type { ListDashboardRequest } from './data';
import type { UnaryCall } from '@protobuf-ts/runtime-rpc';
import type { RpcOptions } from '@protobuf-ts/runtime-rpc';
/**
 * @generated from protobuf service testgrid.api.v1.TestGridData
 */
export interface ITestGridDataClient {
  /**
   * GET /dashboards
   * Lists dashboard names
   *
   * @generated from protobuf rpc: ListDashboard(testgrid.api.v1.ListDashboardRequest) returns (testgrid.api.v1.ListDashboardResponse);
   */
  listDashboard(
    input: ListDashboardRequest,
    options?: RpcOptions
  ): UnaryCall<ListDashboardRequest, ListDashboardResponse>;
  /**
   * GET /dashboard-groups
   * Lists the dashboard group names
   *
   * @generated from protobuf rpc: ListDashboardGroup(testgrid.api.v1.ListDashboardGroupRequest) returns (testgrid.api.v1.ListDashboardGroupResponse);
   */
  listDashboardGroup(
    input: ListDashboardGroupRequest,
    options?: RpcOptions
  ): UnaryCall<ListDashboardGroupRequest, ListDashboardGroupResponse>;
  /**
   * GET /dashboards/{dashboard}/tabs
   * Lists the dashboard tab names
   *
   * @generated from protobuf rpc: ListDashboardTabs(testgrid.api.v1.ListDashboardTabsRequest) returns (testgrid.api.v1.ListDashboardTabsResponse);
   */
  listDashboardTabs(
    input: ListDashboardTabsRequest,
    options?: RpcOptions
  ): UnaryCall<ListDashboardTabsRequest, ListDashboardTabsResponse>;
  /**
   * GET /dashboards/{dashboard}
   * Returns a Dashboard config's metadata
   * Excludes subtabs, accessed through the /tabs list method instead
   *
   * @generated from protobuf rpc: GetDashboard(testgrid.api.v1.GetDashboardRequest) returns (testgrid.api.v1.GetDashboardResponse);
   */
  getDashboard(
    input: GetDashboardRequest,
    options?: RpcOptions
  ): UnaryCall<GetDashboardRequest, GetDashboardResponse>;
  /**
   * GET /dashboard-groups/{dashboard-group}
   * Lists the dashboard names in that group
   *
   * @generated from protobuf rpc: GetDashboardGroup(testgrid.api.v1.GetDashboardGroupRequest) returns (testgrid.api.v1.GetDashboardGroupResponse);
   */
  getDashboardGroup(
    input: GetDashboardGroupRequest,
    options?: RpcOptions
  ): UnaryCall<GetDashboardGroupRequest, GetDashboardGroupResponse>;
  // GET /dashboards/{dashboard}/tabs/{tab}
  // Returns a tab’s configuration, as stored
  // rpc GetDashboardTab(GetDashboardTabRequest) returns
  // (GetDashboardTabResponse) {}

  // GET /summary/{dashboard}
  // GET /dashboards/{dashboard}/summary
  // Returns a summary of this dashboard, as stored
  // rpc GetSummary(GetSummaryRequest) returns (GetSummaryResponse) {}

  /**
   * GET /dashboards/{dashboard}/tabs/{tab}/headers
   * Returns the headers for grid results
   *
   * @generated from protobuf rpc: ListHeaders(testgrid.api.v1.ListHeadersRequest) returns (testgrid.api.v1.ListHeadersResponse);
   */
  listHeaders(
    input: ListHeadersRequest,
    options?: RpcOptions
  ): UnaryCall<ListHeadersRequest, ListHeadersResponse>;
  /**
   * GET /dashboards/{dashboard}/tabs/{tab}/rows
   * Returns information on grid rows, and data within those rows
   *
   * @generated from protobuf rpc: ListRows(testgrid.api.v1.ListRowsRequest) returns (testgrid.api.v1.ListRowsResponse);
   */
  listRows(
    input: ListRowsRequest,
    options?: RpcOptions
  ): UnaryCall<ListRowsRequest, ListRowsResponse>;
}
/**
 * @generated from protobuf service testgrid.api.v1.TestGridData
 */
export class TestGridDataClient implements ITestGridDataClient, ServiceInfo {
  typeName = TestGridData.typeName;
  methods = TestGridData.methods;
  options = TestGridData.options;
  constructor(private readonly _transport: RpcTransport) {}
  /**
   * GET /dashboards
   * Lists dashboard names
   *
   * @generated from protobuf rpc: ListDashboard(testgrid.api.v1.ListDashboardRequest) returns (testgrid.api.v1.ListDashboardResponse);
   */
  listDashboard(
    input: ListDashboardRequest,
    options?: RpcOptions
  ): UnaryCall<ListDashboardRequest, ListDashboardResponse> {
    const method = this.methods[0],
      opt = this._transport.mergeOptions(options);
    return stackIntercept<ListDashboardRequest, ListDashboardResponse>(
      'unary',
      this._transport,
      method,
      opt,
      input
    );
  }
  /**
   * GET /dashboard-groups
   * Lists the dashboard group names
   *
   * @generated from protobuf rpc: ListDashboardGroup(testgrid.api.v1.ListDashboardGroupRequest) returns (testgrid.api.v1.ListDashboardGroupResponse);
   */
  listDashboardGroup(
    input: ListDashboardGroupRequest,
    options?: RpcOptions
  ): UnaryCall<ListDashboardGroupRequest, ListDashboardGroupResponse> {
    const method = this.methods[1],
      opt = this._transport.mergeOptions(options);
    return stackIntercept<
      ListDashboardGroupRequest,
      ListDashboardGroupResponse
    >('unary', this._transport, method, opt, input);
  }
  /**
   * GET /dashboards/{dashboard}/tabs
   * Lists the dashboard tab names
   *
   * @generated from protobuf rpc: ListDashboardTabs(testgrid.api.v1.ListDashboardTabsRequest) returns (testgrid.api.v1.ListDashboardTabsResponse);
   */
  listDashboardTabs(
    input: ListDashboardTabsRequest,
    options?: RpcOptions
  ): UnaryCall<ListDashboardTabsRequest, ListDashboardTabsResponse> {
    const method = this.methods[2],
      opt = this._transport.mergeOptions(options);
    return stackIntercept<ListDashboardTabsRequest, ListDashboardTabsResponse>(
      'unary',
      this._transport,
      method,
      opt,
      input
    );
  }
  /**
   * GET /dashboards/{dashboard}
   * Returns a Dashboard config's metadata
   * Excludes subtabs, accessed through the /tabs list method instead
   *
   * @generated from protobuf rpc: GetDashboard(testgrid.api.v1.GetDashboardRequest) returns (testgrid.api.v1.GetDashboardResponse);
   */
  getDashboard(
    input: GetDashboardRequest,
    options?: RpcOptions
  ): UnaryCall<GetDashboardRequest, GetDashboardResponse> {
    const method = this.methods[3],
      opt = this._transport.mergeOptions(options);
    return stackIntercept<GetDashboardRequest, GetDashboardResponse>(
      'unary',
      this._transport,
      method,
      opt,
      input
    );
  }
  /**
   * GET /dashboard-groups/{dashboard-group}
   * Lists the dashboard names in that group
   *
   * @generated from protobuf rpc: GetDashboardGroup(testgrid.api.v1.GetDashboardGroupRequest) returns (testgrid.api.v1.GetDashboardGroupResponse);
   */
  getDashboardGroup(
    input: GetDashboardGroupRequest,
    options?: RpcOptions
  ): UnaryCall<GetDashboardGroupRequest, GetDashboardGroupResponse> {
    const method = this.methods[4],
      opt = this._transport.mergeOptions(options);
    return stackIntercept<GetDashboardGroupRequest, GetDashboardGroupResponse>(
      'unary',
      this._transport,
      method,
      opt,
      input
    );
  }
  // GET /dashboards/{dashboard}/tabs/{tab}
  // Returns a tab’s configuration, as stored
  // rpc GetDashboardTab(GetDashboardTabRequest) returns
  // (GetDashboardTabResponse) {}

  // GET /summary/{dashboard}
  // GET /dashboards/{dashboard}/summary
  // Returns a summary of this dashboard, as stored
  // rpc GetSummary(GetSummaryRequest) returns (GetSummaryResponse) {}

  /**
   * GET /dashboards/{dashboard}/tabs/{tab}/headers
   * Returns the headers for grid results
   *
   * @generated from protobuf rpc: ListHeaders(testgrid.api.v1.ListHeadersRequest) returns (testgrid.api.v1.ListHeadersResponse);
   */
  listHeaders(
    input: ListHeadersRequest,
    options?: RpcOptions
  ): UnaryCall<ListHeadersRequest, ListHeadersResponse> {
    const method = this.methods[5],
      opt = this._transport.mergeOptions(options);
    return stackIntercept<ListHeadersRequest, ListHeadersResponse>(
      'unary',
      this._transport,
      method,
      opt,
      input
    );
  }
  /**
   * GET /dashboards/{dashboard}/tabs/{tab}/rows
   * Returns information on grid rows, and data within those rows
   *
   * @generated from protobuf rpc: ListRows(testgrid.api.v1.ListRowsRequest) returns (testgrid.api.v1.ListRowsResponse);
   */
  listRows(
    input: ListRowsRequest,
    options?: RpcOptions
  ): UnaryCall<ListRowsRequest, ListRowsResponse> {
    const method = this.methods[6],
      opt = this._transport.mergeOptions(options);
    return stackIntercept<ListRowsRequest, ListRowsResponse>(
      'unary',
      this._transport,
      method,
      opt,
      input
    );
  }
}
