private OAuthTokenResponse tokens(Object body) {
    @SuppressWarnings("unchecked")
    Map<String, String> request = (Map<String, String>) castRequest(Map.class, body);
    String grantType = request.get(GRANT_TYPE);
    switch (grantType) {
      case CLIENT_CREDENTIALS:
        return OAuthTokenResponse.builder()
            .withToken("client-credentials-token:sub=" + request.get(CLIENT_ID))
            .withIssuedTokenType(URN_OAUTH_ACCESS_TOKEN)
            .withTokenType(BEARER)
            .build();

      case URN_OAUTH_TOKEN_EXCHANGE:
        String actor = request.get(ACTOR_TOKEN);
        String token =
            String.format(
                "token-exchange-token:sub=%s%s",
                request.get(SUBJECT_TOKEN), actor != null ? ",act=" + actor : "");
        return OAuthTokenResponse.builder()
            .withToken(token)
            .withIssuedTokenType(URN_OAUTH_ACCESS_TOKEN)
            .withTokenType(BEARER)
            .build();

      default:
        throw new UnsupportedOperationException("Unsupported grant_type: " + grantType);
    }
  }
@param apis an optional list of known api call names
@return the list of metric names for the HMSCatalog class
standalone-metastore/metastore-rest-catalog/src/main/java/org/apache/iceberg/rest/HMSCatalogAdapter.java