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
use anyhow::Result;
use pancake_engine_common::fs_utils::{self, EngineType};
use pancake_engine_serial::DB;
use pancake_server::{
    common::server,
    engine_serial::{
        route_handlers::{self, AppState},
        wasm::WasmEngine,
    },
};
use std::env;
use std::path::PathBuf;
use std::sync::Arc;
use tokio::sync::RwLock;

#[tokio::main(flavor = "multi_thread")]
async fn main() -> Result<()> {
    let engine_type = EngineType::SERIAL;

    let root_dir = env::var(server::ENV_VAR_ROOT_DIR).map_or_else(
        |_| fs_utils::default_db_root_dir(engine_type),
        PathBuf::from,
    );

    let db = DB::load_or_new(root_dir)?;
    let db = Arc::new(RwLock::new(db));

    let wasm_engine = WasmEngine::new(Arc::clone(&db))?;

    let state = AppState::new(db, wasm_engine);
    let state = Arc::new(state);

    let router = route_handlers::create_router(state);

    let bind_addr = env::var(server::ENV_VAR_BIND_ADDR)
        .unwrap_or_else(|_| server::default_bind_addr(engine_type).to_string());
    let listener = tokio::net::TcpListener::bind(bind_addr).await?;
    println!("Listening on {}", listener.local_addr()?);
    axum::serve(listener, router).await?;

    Ok(())
}