Skip to main content

standalone/
standalone.rs

1//! Minimal embedding: mount bastion under `/term` on a tiny host app.
2//!
3//! Run: `cargo run --example standalone` then open
4//! <http://127.0.0.1:7681/term/>.
5
6use axum::{response::Html, routing::get, Router};
7
8#[tokio::main]
9async fn main() -> std::io::Result<()> {
10    let mgr = bastion::Manager::new().with_shell(|title, body| {
11        format!(
12            r#"<!DOCTYPE html><html><head><meta charset="utf-8">
13<title>{title} — demo</title>
14<style>html,body{{height:100%;margin:0;background:#1e1e2e;color:#cdd6f4;
15font-family:ui-monospace,monospace;display:flex;flex-direction:column}}
16header{{padding:10px 16px;border-bottom:1px solid #313244;
17background:#181825;color:#89b4fa;font-weight:600;font-size:13px}}
18.fullpage{{flex:1;min-height:0;display:flex}}</style></head>
19<body><header>{title} — embedded demo</header>
20<div class="fullpage">{body}</div></body></html>"#,
21        )
22    });
23
24    let app: Router = Router::new()
25        .route("/", get(|| async { Html("<a href=\"/term/\">/term/</a>") }))
26        .nest("/term", bastion::router(mgr));
27
28    let listener = tokio::net::TcpListener::bind("127.0.0.1:7681").await?;
29    eprintln!("standalone demo: http://127.0.0.1:7681/term/");
30    axum::serve(listener, app)
31        .await
32        .map_err(|e| std::io::Error::other(format!("{e}")))
33}