1use serde::{Deserialize, Serialize};
2
3use crate::contract::{CoreRequest, CoreResponse};
4use crate::core_service::{CoreService, ServiceError};
5
6#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
7#[serde(rename_all = "snake_case")]
8pub enum ErrorCode {
9 InvalidJson,
10 InvalidRequest,
11 ItemNotFound,
12 Launch,
13 Store,
14 Config,
15 Provider,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
19pub struct ErrorResponse {
20 pub code: ErrorCode,
21 pub message: String,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
25#[serde(tag = "status", rename_all = "snake_case")]
26pub enum TransportResponse {
27 Ok { response: CoreResponse },
28 Err { error: ErrorResponse },
29}
30
31pub fn handle_request(service: &CoreService, request: CoreRequest) -> TransportResponse {
32 match service.handle_command(request) {
33 Ok(response) => TransportResponse::Ok { response },
34 Err(error) => TransportResponse::Err {
35 error: map_service_error(error),
36 },
37 }
38}
39
40pub fn handle_json(service: &CoreService, payload: &str) -> String {
41 let response = match serde_json::from_str::<CoreRequest>(payload) {
42 Ok(request) => handle_request(service, request),
43 Err(error) => TransportResponse::Err {
44 error: ErrorResponse {
45 code: ErrorCode::InvalidJson,
46 message: error.to_string(),
47 },
48 },
49 };
50
51 serde_json::to_string(&response).expect("transport response should serialize")
52}
53
54fn map_service_error(error: ServiceError) -> ErrorResponse {
55 match error {
56 ServiceError::InvalidRequest(message) => ErrorResponse {
57 code: ErrorCode::InvalidRequest,
58 message,
59 },
60 ServiceError::ItemNotFound(message) => ErrorResponse {
61 code: ErrorCode::ItemNotFound,
62 message,
63 },
64 ServiceError::Launch(message) => ErrorResponse {
65 code: ErrorCode::Launch,
66 message: message.to_string(),
67 },
68 ServiceError::Store(message) => ErrorResponse {
69 code: ErrorCode::Store,
70 message: message.to_string(),
71 },
72 ServiceError::Config(message) => ErrorResponse {
73 code: ErrorCode::Config,
74 message,
75 },
76 ServiceError::Provider(message) => ErrorResponse {
77 code: ErrorCode::Provider,
78 message: message.to_string(),
79 },
80 }
81}