1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use crate::endpoint::Endpoint;
use crate::router::Router;
use crate::{Body, Response, StatusCode};
use futures::future::BoxFuture;
use http::Method;
use hyper::service::Service;
use std::task::{Context, Poll};

pub struct App {
  pub router: Router<Method, Endpoint>,
}

impl App {
  pub async fn serve(&self) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
    let addr = ([127, 0, 0, 1], 3000).into();
    hyper::Server::bind(&addr).serve(MakeApp()).await?;
    Ok(())
  }
}

impl Service<http::Request<Body>> for App {
  type Response = Response<Body>;
  type Error = hyper::Error;
  type Future = BoxFuture<'static, Result<Self::Response, Self::Error>>;

  fn poll_ready(&mut self, _: &mut Context) -> Poll<Result<(), Self::Error>> {
    Poll::Ready(Ok(()))
  }

  fn call(&mut self, _: http::Request<Body>) -> Self::Future {
    let fut = async move {
      Ok(
        Response::builder()
          .status(StatusCode::IM_USED)
          .body(Body::from("HEY!!!"))
          .unwrap(),
      )
    };
    Box::pin(fut)
  }
}

struct MakeApp();

impl<T> Service<T> for MakeApp {
  type Response = App;
  type Error = hyper::Error;
  type Future = BoxFuture<'static, Result<Self::Response, Self::Error>>;

  fn poll_ready(&mut self, _: &mut Context) -> Poll<Result<(), Self::Error>> {
    Poll::Ready(Ok(()))
  }

  fn call(&mut self, _: T) -> Self::Future {
    let fut = async move {
      Ok(App {
        router: Router::default(),
      })
    };
    Box::pin(fut)
  }
}

// use crate::endpoint::Endpoint;
// use crate::router::Router;
// use crate::{Body, Request, Response, StatusCode};
// use futures::future::BoxFuture;
// use http::Method;
// use hyper::service::Service;
// use std::task::{Context, Poll};

// pub struct App {
//   pub router: Router<Method, Endpoint>,
// }

// impl App {
//   pub async fn serve(&self) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
//     let addr = ([127, 0, 0, 1], 3000).into();
//     hyper::Server::bind(&addr).serve(MakeApp()).await?;
//     Ok(())
//   }
// }

// impl Service<http::Request<Body>> for App {
//   type Response = Response<Body>;
//   type Error = hyper::Error;
//   type Future = BoxFuture<'static, Result<Self::Response, Self::Error>>;

//   fn poll_ready(&mut self, _: &mut Context) -> Poll<Result<(), Self::Error>> {
//     Poll::Ready(Ok(()))
//   }

//   fn call(&mut self, _: http::Request<Body>) -> Self::Future {
//     let fut = async move {
//       Ok(
//         Response::builder()
//           .status(StatusCode::IM_USED)
//           .body(Body::from("HEY!!!"))
//           .unwrap(),
//       )
//     };
//     Box::pin(fut)
//   }
// }

// struct MakeApp();

// impl<T> Service<T> for MakeApp {
//   type Response = App;
//   type Error = hyper::Error;
//   type Future = BoxFuture<'static, Result<Self::Response, Self::Error>>;

//   fn poll_ready(&mut self, _: &mut Context) -> Poll<Result<(), Self::Error>> {
//     Poll::Ready(Ok(()))
//   }

//   fn call(&mut self, _: T) -> Self::Future {
//     let fut = async move {
//       Ok(App {
//         router: Router::default(),
//       })
//     };
//     Box::pin(fut)
//   }
// }