// ============================================================================= // Boko Example App — demonstrates the modern framework API // ============================================================================= module Main { import Std::Io::{PrintLine, Print}; import Std::String::{ String_Eq, String_Len, StringBuilder, StringBuilder_New, StringBuilder_Append, StringBuilder_Build, StringBuilder_Free }; import Boko::{ App, App_New, App_Run, Request, Response, Response_Html, Response_Json, Response_NotFound, Response_Redirect, Path_Match, HttpVerb }; // ============================================================================= // Boko_Router — user-defined dispatch (called by the framework) // ============================================================================= func Boko_Router(req: Request) -> Response { // --- GET / --- if String_Eq(req.path, "/") && req.method.tag == HttpVerb_GET { return Response_Html(PageHome()); } // --- GET /api/health --- if String_Eq(req.path, "/api/health") { return Response_Json("{\"status\":\"ok\",\"framework\":\"Boko\",\"version\":\"0.2.0\"}"); } // --- GET /api/info --- if String_Eq(req.path, "/api/info") { return Response_Json("{\"name\":\"Boko\",\"language\":\"Bux\",\"inspiration\":\"FastAPI\",\"features\":[\"routing\",\"path-params\",\"query-params\",\"json\"]}"); } // --- GET /hello?name=World --- if String_Eq(req.path, "/hello") { var name: String = req.GetQuery("name"); if String_Len(name) == 0 { name = "World"; } let html: String = f"

Hello, {name}!

"; return Response_Html(html); } // --- GET /users/{id} --- if Path_Match("/users/{id}", req.path, &req) { let id: String = req.GetPathParam("id"); let sb: StringBuilder = StringBuilder_New(); StringBuilder_Append(&sb, "{\"id\":"); StringBuilder_Append(&sb, id); StringBuilder_Append(&sb, ",\"name\":\"User "); StringBuilder_Append(&sb, id); StringBuilder_Append(&sb, "\"}"); let json: String = StringBuilder_Build(&sb); StringBuilder_Free(&sb); return Response_Json(json); } // --- GET /posts/{postId}/comments/{commentId} --- if Path_Match("/posts/{postId}/comments/{commentId}", req.path, &req) { let pid: String = req.GetPathParam("postId"); let cid: String = req.GetPathParam("commentId"); let sb: StringBuilder = StringBuilder_New(); StringBuilder_Append(&sb, "{\"postId\":"); StringBuilder_Append(&sb, pid); StringBuilder_Append(&sb, ",\"commentId\":"); StringBuilder_Append(&sb, cid); StringBuilder_Append(&sb, ",\"text\":\"Great post!\"}"); let json: String = StringBuilder_Build(&sb); StringBuilder_Free(&sb); return Response_Json(json); } // --- GET /redirect → 302 to / --- if String_Eq(req.path, "/redirect") { return Response_Redirect("/"); } // --- POST /api/echo --- if String_Eq(req.path, "/api/echo") && req.method.tag == HttpVerb_POST { let sb: StringBuilder = StringBuilder_New(); StringBuilder_Append(&sb, "{\"echo\":"); StringBuilder_Append(&sb, req.body); StringBuilder_Append(&sb, "}"); let json: String = StringBuilder_Build(&sb); StringBuilder_Free(&sb); return Response_Json(json); } // --- 404 --- return Response_NotFound(); } // ============================================================================= // HTML landing page (raw multi-line string via backticks) // ============================================================================= func PageHome() -> String { return ` Boko Framework

⚡ Boko

Async web framework for Bux — inspired by FastAPI

Try it

GET/hello?name=Buxquery param
GET/users/42path param
GET/posts/7/comments/3multi params
GET/redirect302 → /
GET/api/healthJSON
GET/api/infoJSON

Features

Path routing with {params}
Query parameter extraction
JSON / HTML / Text responses
Multi-threaded (configurable)
Redirects (302)
POST body access
`; } // ============================================================================= // Main — start the server // ============================================================================= func Main() -> int { let app: App = App_New(8080, 4); App_Run(&app); return 0; } } // module Main