From 213cb8de1a41a6100346bcd1a00c7a3b4931335e Mon Sep 17 00:00:00 2001
From: jawang94 <wang.jason.010@gmail.com>
Date: Fri, 3 May 2024 22:17:12 -0700
Subject: [PATCH] Refactor code to remove async move closure which may result
 in double boxing.

---
 juniper/src/types/async_await.rs | 40 +++++++++++++++-----------------
 1 file changed, 19 insertions(+), 21 deletions(-)

diff --git a/juniper/src/types/async_await.rs b/juniper/src/types/async_await.rs
index d86ed01b..cc5fe772 100644
--- a/juniper/src/types/async_await.rs
+++ b/juniper/src/types/async_await.rs
@@ -258,31 +258,29 @@ where
                 let is_non_null = meta_field.field_type.is_non_null();
 
                 let response_name = response_name.to_string();
-                async_values.push_back(AsyncValueFuture::Field(async move {
-                    // TODO: implement custom future type instead of
-                    //       two-level boxing.
-                    let res = instance
-                        .resolve_field_async(info, f.name.item, &args, &sub_exec)
-                        .await;
+                let res = instance
+                    .resolve_field_async(info, f.name.item, &args, &sub_exec)
+                    .await;
 
-                    let value = match res {
-                        Ok(Value::Null) if is_non_null => None,
-                        Ok(v) => Some(v),
-                        Err(e) => {
-                            sub_exec.push_error_at(e, pos);
-
-                            if is_non_null {
-                                None
-                            } else {
-                                Some(Value::null())
-                            }
+                let value = match res {
+                    Ok(Value::Null) if is_non_null => None,
+                    Ok(v) => Some(v),
+                    Err(e) => {
+                        sub_exec.push_error_at(e, pos);
+                        if is_non_null {
+                            None
+                        } else {
+                            Some(Value::null())
                         }
-                    };
-                    AsyncValue::Field(AsyncField {
+                    }
+                };
+
+                async_values.push_back(AsyncValueFuture::Field(future::ready(AsyncValue::Field(
+                    AsyncField {
                         name: response_name,
                         value,
-                    })
-                }));
+                    },
+                ))));
             }
 
             Selection::FragmentSpread(Spanning {