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
43
44
use heck::ToSnekCase;

use crate::utils::Collection;

pub fn template(collections: &Vec<Collection>) -> String {
    let collection_imports: Vec<String> = collections
        .iter()
        .map(|collection| {
            format!(
                "use {}::collection_router as {}_collection_router;",
                collection.name.to_snek_case(), collection.name.to_snek_case()
            )
        })
        .collect();

    let collection_routes: Vec<String> = collections
        .iter()
        .map(|collection| format!(".merge({}_collection_router())", collection.name.to_snek_case()))
        .collect();

    let collection_router = format!("let router = Router::new(){};", collection_routes.join(""));

    format!(
        r#"use axum::Router;
use tokio::net::TcpListener;
{}

#[tokio::main]
async fn main() -> Result<(), axum::Error> {{
    let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap();
    {}

    println!("->> LISTENING on {{:?}}\n", listener.local_addr());
    axum::serve(listener, router.into_make_service())
        .await
        .unwrap();

    Ok(())
}}
"#,
        collection_imports.join("\n"),
        collection_router
    )
}