Skip to main content

rbp_server/analysis/
handlers.rs

1use super::API;
2use rbp_cards::*;
3use rbp_core::*;
4use rbp_gameplay::*;
5use actix_web::HttpResponse;
6use actix_web::Responder;
7use actix_web::web;
8
9pub async fn replace_obs(api: web::Data<API>, req: web::Json<ReplaceObs>) -> impl Responder {
10    match Observation::try_from(req.obs.as_str()) {
11        Err(_) => HttpResponse::BadRequest().body("invalid observation format"),
12        Ok(obs) => match api.replace_obs(obs).await {
13            Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
14            Ok(new) => HttpResponse::Ok().json(new.to_string()),
15        },
16    }
17}
18pub async fn exp_wrt_str(api: web::Data<API>, req: web::Json<SetStreets>) -> impl Responder {
19    match Street::try_from(req.street.as_str()) {
20        Err(_) => HttpResponse::BadRequest().body("invalid street format"),
21        Ok(street) => match api.exp_wrt_str(street).await {
22            Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
23            Ok(row) => HttpResponse::Ok().json(row),
24        },
25    }
26}
27pub async fn exp_wrt_abs(api: web::Data<API>, req: web::Json<ReplaceAbs>) -> impl Responder {
28    match Abstraction::try_from(req.wrt.as_str()) {
29        Err(_) => HttpResponse::BadRequest().body("invalid abstraction format"),
30        Ok(abs) => match api.exp_wrt_abs(abs).await {
31            Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
32            Ok(row) => HttpResponse::Ok().json(row),
33        },
34    }
35}
36pub async fn exp_wrt_obs(api: web::Data<API>, req: web::Json<RowWrtObs>) -> impl Responder {
37    match Observation::try_from(req.obs.as_str()) {
38        Err(_) => HttpResponse::BadRequest().body("invalid observation format"),
39        Ok(obs) => match api.exp_wrt_obs(obs).await {
40            Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
41            Ok(row) => HttpResponse::Ok().json(row),
42        },
43    }
44}
45pub async fn nbr_any_wrt_abs(api: web::Data<API>, req: web::Json<ReplaceAbs>) -> impl Responder {
46    match Abstraction::try_from(req.wrt.as_str()) {
47        Err(_) => HttpResponse::BadRequest().body("invalid abstraction format"),
48        Ok(abs) => match api.nbr_any_wrt_abs(abs).await {
49            Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
50            Ok(row) => HttpResponse::Ok().json(row),
51        },
52    }
53}
54pub async fn nbr_abs_wrt_abs(api: web::Data<API>, req: web::Json<ReplaceOne>) -> impl Responder {
55    let wrt = Abstraction::try_from(req.wrt.as_str());
56    let abs = Abstraction::try_from(req.abs.as_str());
57    match (wrt, abs) {
58        (Err(_), _) => HttpResponse::BadRequest().body("invalid abstraction format"),
59        (_, Err(_)) => HttpResponse::BadRequest().body("invalid abstraction format"),
60        (Ok(wrt), Ok(abs)) => match api.nbr_abs_wrt_abs(wrt, abs).await {
61            Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
62            Ok(row) => HttpResponse::Ok().json(row),
63        },
64    }
65}
66pub async fn nbr_obs_wrt_abs(api: web::Data<API>, req: web::Json<ReplaceRow>) -> impl Responder {
67    let wrt = Abstraction::try_from(req.wrt.as_str());
68    let obs = Observation::try_from(req.obs.as_str());
69    match (wrt, obs) {
70        (Err(_), _) => HttpResponse::BadRequest().body("invalid abstraction format"),
71        (_, Err(_)) => HttpResponse::BadRequest().body("invalid observation format"),
72        (Ok(abs), Ok(obs)) => match api.nbr_obs_wrt_abs(abs, obs).await {
73            Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
74            Ok(rows) => HttpResponse::Ok().json(rows),
75        },
76    }
77}
78pub async fn kfn_wrt_abs(api: web::Data<API>, req: web::Json<ReplaceAbs>) -> impl Responder {
79    match Abstraction::try_from(req.wrt.as_str()) {
80        Err(_) => HttpResponse::BadRequest().body("invalid abstraction format"),
81        Ok(abs) => match api.kfn_wrt_abs(abs).await {
82            Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
83            Ok(rows) => HttpResponse::Ok().json(rows),
84        },
85    }
86}
87pub async fn knn_wrt_abs(api: web::Data<API>, req: web::Json<ReplaceAbs>) -> impl Responder {
88    match Abstraction::try_from(req.wrt.as_str()) {
89        Err(_) => HttpResponse::BadRequest().body("invalid abstraction format"),
90        Ok(abs) => match api.knn_wrt_abs(abs).await {
91            Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
92            Ok(rows) => HttpResponse::Ok().json(rows),
93        },
94    }
95}
96pub async fn kgn_wrt_abs(api: web::Data<API>, req: web::Json<ReplaceAll>) -> impl Responder {
97    match Abstraction::try_from(req.wrt.as_str()) {
98        Err(_) => HttpResponse::BadRequest().body("invalid abstraction format"),
99        Ok(wrt) => {
100            let obs = req
101                .neighbors
102                .iter()
103                .map(|string| string.as_str())
104                .map(Observation::try_from)
105                .filter_map(|result| result.ok())
106                .filter(|o| o.street() == wrt.street())
107                .chain((0..).map(|_| Observation::from(wrt.street())))
108                .take(5)
109                .collect::<Vec<_>>();
110            match api.kgn_wrt_abs(wrt, obs).await {
111                Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
112                Ok(rows) => HttpResponse::Ok().json(rows),
113            }
114        }
115    }
116}
117pub async fn hst_wrt_abs(api: web::Data<API>, req: web::Json<AbsHist>) -> impl Responder {
118    match Abstraction::try_from(req.abs.as_str()) {
119        Err(_) => HttpResponse::BadRequest().body("invalid abstraction format"),
120        Ok(abs) => match api.hst_wrt_abs(abs).await {
121            Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
122            Ok(rows) => HttpResponse::Ok().json(rows),
123        },
124    }
125}
126pub async fn hst_wrt_obs(api: web::Data<API>, req: web::Json<ObsHist>) -> impl Responder {
127    match Observation::try_from(req.obs.as_str()) {
128        Err(_) => HttpResponse::BadRequest().body("invalid observation format"),
129        Ok(obs) => match api.hst_wrt_obs(obs).await {
130            Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
131            Ok(rows) => HttpResponse::Ok().json(rows),
132        },
133    }
134}
135pub async fn blueprint(api: web::Data<API>, req: web::Json<GetPolicy>) -> impl Responder {
136    let hero = Turn::try_from(req.turn.as_str());
137    let seen = Observation::try_from(req.seen.as_str());
138    let path = req
139        .past
140        .iter()
141        .map(|string| string.as_str())
142        .map(Action::try_from)
143        .collect::<Result<Vec<_>, _>>();
144    match (hero, seen, path) {
145        (Ok(hero), Ok(seen), Ok(path)) => match Partial::try_build(hero, seen, path) {
146            Err(e) => HttpResponse::BadRequest().body(format!("invalid action sequence: {}", e)),
147            Ok(recall) => match api.policy(recall).await {
148                Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
149                Ok(Some(strategy)) => HttpResponse::Ok().json(strategy),
150                Ok(None) => HttpResponse::Ok().json(serde_json::Value::Null),
151            },
152        },
153        _ => HttpResponse::BadRequest().body("invalid recall format"),
154    }
155}