From 6eaec4f96e14a9171b84b5760d87e62956d28f3d Mon Sep 17 00:00:00 2001
From: Craig Tiller <ctiller@google.com>
Date: Tue, 9 Jan 2024 12:09:07 -0800
Subject: [PATCH] [call-v3] Convert ServerConfigSelectorFilter (#35470)

Closes #35470

COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/35470 from ctiller:scsf 789b365616d67a95659a6e60b6364855311e0085
PiperOrigin-RevId: 597006442
---
 .../server_config_selector_filter.cc          | 38 ++++++++++++-------
 1 file changed, 25 insertions(+), 13 deletions(-)

diff --git a/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc b/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc
index 3d9a23fcc7c..b79090ddab9 100644
--- a/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc
+++ b/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc
@@ -47,7 +47,8 @@ namespace grpc_core {
 
 namespace {
 
-class ServerConfigSelectorFilter final : public ChannelFilter {
+class ServerConfigSelectorFilter final
+    : public ImplementChannelFilter<ServerConfigSelectorFilter> {
  public:
   ~ServerConfigSelectorFilter() override;
 
@@ -60,8 +61,16 @@ class ServerConfigSelectorFilter final : public ChannelFilter {
   static absl::StatusOr<ServerConfigSelectorFilter> Create(
       const ChannelArgs& args, ChannelFilter::Args);
 
-  ArenaPromise<ServerMetadataHandle> MakeCallPromise(
-      CallArgs call_args, NextPromiseFactory next_promise_factory) override;
+  class Call {
+   public:
+    absl::Status OnClientInitialMetadata(ClientMetadata& md,
+                                         ServerConfigSelectorFilter* filter);
+    static const NoInterceptor OnServerInitialMetadata;
+    static const NoInterceptor OnServerTrailingMetadata;
+    static const NoInterceptor OnClientToServerMessage;
+    static const NoInterceptor OnServerToClientMessage;
+    static const NoInterceptor OnFinalize;
+  };
 
   absl::StatusOr<RefCountedPtr<ServerConfigSelector>> config_selector() {
     MutexLock lock(&state_->mu);
@@ -130,25 +139,28 @@ ServerConfigSelectorFilter::~ServerConfigSelectorFilter() {
   }
 }
 
-ArenaPromise<ServerMetadataHandle> ServerConfigSelectorFilter::MakeCallPromise(
-    CallArgs call_args, NextPromiseFactory next_promise_factory) {
-  auto sel = config_selector();
-  if (!sel.ok()) return Immediate(ServerMetadataFromStatus(sel.status()));
-  auto call_config =
-      sel.value()->GetCallConfig(call_args.client_initial_metadata.get());
+absl::Status ServerConfigSelectorFilter::Call::OnClientInitialMetadata(
+    ClientMetadata& md, ServerConfigSelectorFilter* filter) {
+  auto sel = filter->config_selector();
+  if (!sel.ok()) return sel.status();
+  auto call_config = sel.value()->GetCallConfig(&md);
   if (!call_config.ok()) {
-    auto r = Immediate(ServerMetadataFromStatus(
-        absl::UnavailableError(StatusToString(call_config.status()))));
-    return std::move(r);
+    return absl::UnavailableError(StatusToString(call_config.status()));
   }
   auto* service_config_call_data =
       GetContext<Arena>()->New<ServiceConfigCallData>(
           GetContext<Arena>(), GetContext<grpc_call_context_element>());
   service_config_call_data->SetServiceConfig(
       std::move(call_config->service_config), call_config->method_configs);
-  return next_promise_factory(std::move(call_args));
+  return absl::OkStatus();
 }
 
+const NoInterceptor ServerConfigSelectorFilter::Call::OnServerInitialMetadata;
+const NoInterceptor ServerConfigSelectorFilter::Call::OnServerTrailingMetadata;
+const NoInterceptor ServerConfigSelectorFilter::Call::OnClientToServerMessage;
+const NoInterceptor ServerConfigSelectorFilter::Call::OnServerToClientMessage;
+const NoInterceptor ServerConfigSelectorFilter::Call::OnFinalize;
+
 }  // namespace
 
 const grpc_channel_filter kServerConfigSelectorFilter =