use actix_web::{web, App, HttpServer};
use gluer::{generate, metadata};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[metadata]
async fn fetch_root(test: web::Query<HashMap<String, String>>, p: web::Path<usize>) -> String {
test.get(&p.to_string()).unwrap().clone()
}
#[metadata]
#[derive(Deserialize)]
struct QueryOptions {
id: usize,
query: String,
}
#[metadata]
async fn fetch_other(test: web::Query<QueryOptions>) -> String {
format!("{}: {}", test.id, test.query)
}
#[metadata]
#[derive(Serialize, Deserialize, Default)]
pub struct Hello<T: Serialize, S> {
name: S,
vec: Vec<T>,
}
#[metadata]
#[derive(Serialize, Deserialize, Default)]
struct Age {
#[meta(optional)]
age: AgeInner,
}
#[metadata]
#[derive(Serialize, Deserialize, Default)]
struct AgeInner {
age: u128,
}
#[metadata]
#[derive(Serialize, Deserialize, Default)]
struct Huh<T> {
huh: T,
}
#[metadata(custom = [Result])]
async fn add_root(
_: web::Path<usize>,
hello: web::Json<Result<Hello<Hello<Huh<Huh<Hello<Age, String>>>, String>, String>>>,
) -> web::Json<Result<String>> {
web::Json(Ok(hello.into_inner().unwrap().name.to_string()))
}
#[metadata]
#[derive(Serialize, Deserialize)]
enum Alphabet {
A,
B,
C,
}
#[metadata]
async fn get_alphabet(r: web::Path<(Alphabet, S)>) -> web::Json<(Alphabet, S)> {
web::Json(r.into_inner())
}
#[metadata]
#[derive(Serialize, Deserialize, Debug)]
enum Error {
NotFound,
InternalServerError,
}
#[metadata]
type Result<T> = std::result::Result<T, Error>;
#[metadata]
type S = String;
#[actix_web::test]
async fn main_test() {
let _server = HttpServer::new(|| {
let scope = generate! {
routes = { "/{p}" = get(fetch_root).post(add_root),
"/char/{path}/metadata/{path}" = get(get_alphabet),
"/other" = get(fetch_other),
},
files = "tests", output = "tests/api_actix.ts", };
App::new().service(scope)
})
.bind(("127.0.0.1", 0))
.unwrap();
}