Skip to main content

nex_core/
transport.rs

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}