use std::convert::Infallible;
use gotcha::prelude::*;
#[state]
#[derive(Clone, Default)]
struct AppState {}
#[derive(Clone, Default, Serialize, Deserialize)]
struct AppConfig {}
#[derive(Deserialize)]
struct Login {
user: String,
}
async fn sign_in(Form(login): Form<Login>) -> impl Responder {
login.user
}
async fn upload(mut parts: Multipart) -> impl Responder {
let mut names = Vec::new();
while let Ok(Some(field)) = parts.next_field().await {
names.push(field.name().unwrap_or_default().to_string());
}
names.join(",")
}
async fn events() -> Sse<impl futures_core::Stream<Item = Result<Event, Infallible>>> {
let stream = futures_util::stream::once(async { Ok(Event::default().data("tick")) });
Sse::new(stream).keep_alive(KeepAlive::default())
}
async fn socket(upgrade: WebSocketUpgrade) -> impl Responder {
upgrade.on_upgrade(|mut socket: WebSocket| async move {
if let Some(Ok(frame)) = socket.recv().await {
let _ = socket.send(frame).await;
}
})
}
async fn introspect(matched: MatchedPath, OriginalUri(uri): OriginalUri) -> impl Responder {
format!("{} {}", matched.as_str(), uri)
}
fn main() {
let _app = Gotcha::with_types::<AppState, AppConfig>()
.post("/sign-in", sign_in)
.post("/upload", upload)
.get("/events", events)
.get("/socket", socket)
.get("/introspect/{id}", introspect)
.layer(middleware::from_fn(|req: gotcha::axum::extract::Request, next: middleware::Next| async move {
next.run(req).await
}))
.routes(|router| {
router.fallback_service(tower::service_fn(|_: gotcha::axum::extract::Request| async {
Ok::<_, Infallible>(gotcha::axum::response::Response::new(gotcha::axum::body::Body::from("not found")))
}))
});
}