1
use axum::response::{IntoResponse, Response};
2
use serde::Serialize;
3

            
4
use crate::http::{Json, Query};
5

            
6
/// Query parameters for `GET /version`
7
#[derive(serde::Deserialize)]
8
pub struct GetVersionQuery {
9
    pub q: Option<String>,
10
}
11

            
12
#[derive(Serialize)]
13
struct GetVersionRes<'a> {
14
    data: GetVersionResData<'a>,
15
}
16

            
17
#[derive(Serialize)]
18
struct GetVersionResData<'a> {
19
    name: &'a str,
20
    version: &'a str,
21
}
22

            
23
/// Creates an axum handler for `GET /version`.
24
///
25
/// Returns a handler that responds with the service name and version. Supports the optional
26
/// query parameter `q`:
27
/// - `q=name`: returns the service name as plain text
28
/// - `q=version`: returns the service version as plain text
29
/// - otherwise: returns `{"data":{"name":"...","version":"..."}}` as JSON
30
2
pub fn gen_get_version(
31
2
    name: &'static str,
32
2
    version: &'static str,
33
2
) -> impl Fn(Query<GetVersionQuery>) -> std::future::Ready<Response> + Clone + Send + 'static {
34
8
    move |Query(query): Query<GetVersionQuery>| {
35
8
        let resp = if let Some(q) = query.q.as_ref() {
36
6
            match q.as_str() {
37
6
                "name" => name.into_response(),
38
4
                "version" => version.into_response(),
39
2
                _ => Json(GetVersionRes {
40
2
                    data: GetVersionResData { name, version },
41
2
                })
42
2
                .into_response(),
43
            }
44
        } else {
45
2
            Json(GetVersionRes {
46
2
                data: GetVersionResData { name, version },
47
2
            })
48
2
            .into_response()
49
        };
50
8
        std::future::ready(resp)
51
8
    }
52
2
}