hyperlane_techempower 0.1.19

A lightweight, high-performance, and cross-platform Rust HTTP server library built on Tokio. It simplifies modern web service development by providing built-in support for middleware, WebSocket, Server-Sent Events (SSE), and raw TCP communication. With a unified and ergonomic API across Windows, Linux, and MacOS, it enables developers to build robust, scalable, and event-driven network applications with minimal overhead and maximum flexibility.
use super::*;

impl ServerHook for JsonRoute {
    async fn new(_ctx: &mut Context) -> Self {
        Self
    }

    async fn handle(self, ctx: &mut Context) {
        let json: Value = json!({
            KEY_MESSAGE: RESPONSEDATA_STR
        });
        ctx.get_mut_response()
            .set_body(serde_json::to_vec(&json).unwrap_or_default());
        if ctx.try_send().await.is_err() {
            ctx.set_closed(true);
            return;
        }
        while ctx.http_from_stream().await.is_ok() {
            ctx.get_mut_response()
                .set_body(serde_json::to_vec(&json).unwrap_or_default());
            if ctx.try_send().await.is_err() {
                ctx.set_closed(true);
                return;
            }
        }
    }
}

impl ServerHook for PlaintextRoute {
    async fn new(_ctx: &mut Context) -> Self {
        Self
    }

    async fn handle(self, ctx: &mut Context) {
        ctx.get_mut_response()
            .set_header(CONTENT_TYPE, TEXT_PLAIN)
            .set_body(RESPONSEDATA_BIN);
        if ctx.try_send().await.is_err() {
            ctx.set_closed(true);
            return;
        }
        while ctx.http_from_stream().await.is_ok() {
            if ctx.try_send().await.is_err() {
                ctx.set_closed(true);
                break;
            }
        }
        ctx.set_closed(true);
    }
}

impl ServerHook for DbRoute {
    async fn new(_ctx: &mut Context) -> Self {
        Self
    }

    async fn handle(self, ctx: &mut Context) {
        let db_connection: &DbPoolConnection = get_db_connection();
        let query_row: QueryRow = random_world_row(db_connection).await;
        ctx.get_mut_response()
            .set_body(serde_json::to_vec(&query_row).unwrap_or_default());
        if ctx.try_send().await.is_err() {
            ctx.set_closed(true);
            return;
        }
        while ctx.http_from_stream().await.is_ok() {
            let query_row: QueryRow = random_world_row(db_connection).await;
            ctx.get_mut_response()
                .set_body(serde_json::to_vec(&query_row).unwrap_or_default());
            if ctx.try_send().await.is_err() {
                ctx.set_closed(true);
                break;
            }
        }
        ctx.set_closed(true);
    }
}

impl ServerHook for QueryRoute {
    async fn new(_ctx: &mut Context) -> Self {
        Self
    }

    async fn handle(self, ctx: &mut Context) {
        let queries: Queries = ctx
            .get_request()
            .try_get_query(QUERY_DB_QUERY_KEY)
            .and_then(|queries| queries.parse::<Queries>().ok())
            .unwrap_or_default()
            .min(ROW_LIMIT as Queries)
            .max(1);
        let db_pool: &DbPoolConnection = get_db_connection();
        let data: Vec<QueryRow> = get_some_row_id(queries, db_pool).await;
        ctx.get_mut_response()
            .set_body(serde_json::to_vec(&data).unwrap_or_default());
        if ctx.try_send().await.is_err() {
            ctx.set_closed(true);
            return;
        }
        while ctx.http_from_stream().await.is_ok() {
            let queries: Queries = ctx
                .get_request()
                .try_get_query(QUERY_DB_QUERY_KEY)
                .and_then(|queries| queries.parse::<Queries>().ok())
                .unwrap_or_default()
                .min(ROW_LIMIT as Queries)
                .max(1);
            let data: Vec<QueryRow> = get_some_row_id(queries, db_pool).await;
            ctx.get_mut_response()
                .set_body(serde_json::to_vec(&data).unwrap_or_default());
            if ctx.try_send().await.is_err() {
                ctx.set_closed(true);
                break;
            }
        }
        ctx.set_closed(true);
    }
}

impl ServerHook for FortunesRoute {
    async fn new(_ctx: &mut Context) -> Self {
        Self
    }

    async fn handle(self, ctx: &mut Context) {
        ctx.get_mut_response().set_header(
            CONTENT_TYPE,
            ContentType::format_content_type_with_charset(TEXT_HTML, UTF8),
        );
        let all_rows: Vec<PgRow> = all_world_row().await;
        let mut fortunes_list: Vec<Fortunes> = all_rows
            .iter()
            .map(|row| {
                let id: i32 = row.get(KEY_ID);
                Fortunes::new(id, row.get(KEY_MESSAGE))
            })
            .collect();
        fortunes_list.push(Fortunes::new(
            0,
            "Additional fortune added at request time.".to_owned(),
        ));
        fortunes_list.sort_by(|it, next| it.message.cmp(&next.message));
        let res: String = FortunesTemplate::new(fortunes_list).to_string();
        ctx.get_mut_response().set_body(&res);
        if ctx.try_send().await.is_err() {
            ctx.set_closed(true);
            return;
        }
        while ctx.http_from_stream().await.is_ok() {
            let all_rows: Vec<PgRow> = all_world_row().await;
            let mut fortunes_list: Vec<Fortunes> = all_rows
                .iter()
                .map(|row| {
                    let id: i32 = row.get(KEY_ID);
                    Fortunes::new(id, row.get(KEY_MESSAGE))
                })
                .collect();
            fortunes_list.push(Fortunes::new(
                0,
                "Additional fortune added at request time.".to_owned(),
            ));
            fortunes_list.sort_by(|it, next| it.message.cmp(&next.message));
            let res: String = FortunesTemplate::new(fortunes_list).to_string();
            ctx.get_mut_response().set_body(&res);
            if ctx.try_send().await.is_err() {
                ctx.set_closed(true);
                break;
            }
        }
        ctx.set_closed(true);
    }
}

impl ServerHook for UpdateRoute {
    async fn new(_ctx: &mut Context) -> Self {
        Self
    }

    async fn handle(self, ctx: &mut Context) {
        let queries: Queries = ctx
            .get_request()
            .try_get_query(UPDATE_DB_QUERY_KEY)
            .and_then(|queries| queries.parse::<Queries>().ok())
            .unwrap_or_default()
            .min(ROW_LIMIT as Queries)
            .max(1);
        let res: Vec<QueryRow> = update_world_rows(queries).await;
        ctx.get_mut_response()
            .set_body(serde_json::to_vec(&res).unwrap_or_default());
        if ctx.try_send().await.is_err() {
            ctx.set_closed(true);
            return;
        }
        while ctx.http_from_stream().await.is_ok() {
            let queries: Queries = ctx
                .get_request()
                .try_get_query(UPDATE_DB_QUERY_KEY)
                .and_then(|queries| queries.parse::<Queries>().ok())
                .unwrap_or_default()
                .min(ROW_LIMIT as Queries)
                .max(1);
            let res: Vec<QueryRow> = update_world_rows(queries).await;
            ctx.get_mut_response()
                .set_body(serde_json::to_vec(&res).unwrap_or_default());
            if ctx.try_send().await.is_err() {
                ctx.set_closed(true);
                break;
            }
        }
        ctx.set_closed(true);
    }
}

impl ServerHook for CachedQueryRoute {
    async fn new(_ctx: &mut Context) -> Self {
        Self
    }

    async fn handle(self, ctx: &mut Context) {
        let count: Queries = ctx
            .get_request()
            .try_get_query(CACHE_QUERY_KEY)
            .and_then(|queries| queries.parse::<Queries>().ok())
            .unwrap_or_default()
            .min(ROW_LIMIT as Queries)
            .max(1);
        let res: Vec<&QueryRow> = CACHE.iter().take(count as usize).collect();
        ctx.get_mut_response()
            .set_body(serde_json::to_vec(&res).unwrap_or_default());
        if ctx.try_send().await.is_err() {
            ctx.set_closed(true);
            return;
        }
        while ctx.http_from_stream().await.is_ok() {
            let count: Queries = ctx
                .get_request()
                .try_get_query(CACHE_QUERY_KEY)
                .and_then(|queries| queries.parse::<Queries>().ok())
                .unwrap_or_default()
                .min(ROW_LIMIT as Queries)
                .max(1);
            let res: Vec<&QueryRow> = CACHE.iter().take(count as usize).collect();
            ctx.get_mut_response()
                .set_body(serde_json::to_vec(&res).unwrap_or_default());
            if ctx.try_send().await.is_err() {
                ctx.set_closed(true);
                break;
            }
        }
        ctx.set_closed(true);
    }
}