summaryrefslogtreecommitdiff
path: root/vendor/hyper-util/src/common/exec.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/hyper-util/src/common/exec.rs')
-rw-r--r--vendor/hyper-util/src/common/exec.rs53
1 files changed, 53 insertions, 0 deletions
diff --git a/vendor/hyper-util/src/common/exec.rs b/vendor/hyper-util/src/common/exec.rs
new file mode 100644
index 00000000..40860ee1
--- /dev/null
+++ b/vendor/hyper-util/src/common/exec.rs
@@ -0,0 +1,53 @@
+#![allow(dead_code)]
+
+use hyper::rt::Executor;
+use std::fmt;
+use std::future::Future;
+use std::pin::Pin;
+use std::sync::Arc;
+
+pub(crate) type BoxSendFuture = Pin<Box<dyn Future<Output = ()> + Send>>;
+
+// Either the user provides an executor for background tasks, or we use
+// `tokio::spawn`.
+#[derive(Clone)]
+pub(crate) enum Exec {
+ Executor(Arc<dyn Executor<BoxSendFuture> + Send + Sync>),
+}
+
+// ===== impl Exec =====
+
+impl Exec {
+ pub(crate) fn new<E>(inner: E) -> Self
+ where
+ E: Executor<BoxSendFuture> + Send + Sync + 'static,
+ {
+ Exec::Executor(Arc::new(inner))
+ }
+
+ pub(crate) fn execute<F>(&self, fut: F)
+ where
+ F: Future<Output = ()> + Send + 'static,
+ {
+ match *self {
+ Exec::Executor(ref e) => {
+ e.execute(Box::pin(fut));
+ }
+ }
+ }
+}
+
+impl fmt::Debug for Exec {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.debug_struct("Exec").finish()
+ }
+}
+
+impl<F> hyper::rt::Executor<F> for Exec
+where
+ F: Future<Output = ()> + Send + 'static,
+{
+ fn execute(&self, fut: F) {
+ Exec::execute(self, fut);
+ }
+}