1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use super::super::poll::{PollAckRequest, PollAckResponse, PollData, PollRequest, PollResponse};
use super::super::{Error, Response};
use super::router::HandleReqReturn;
use super::tmch_proto;
use chrono::prelude::*;

pub fn handle_poll(_client: &(), _req: &PollRequest) -> HandleReqReturn<Option<PollResponse>> {
    let command = tmch_proto::TMCHPoll {
        operation: tmch_proto::TMCHPollOperation::Request,
        message_id: None,
    };
    Ok(tmch_proto::TMCHCommandType::Poll(command))
}

pub fn handle_poll_response(response: tmch_proto::TMCHResponse) -> Response<Option<PollResponse>> {
    match response.results.first() {
        Some(result) => match result.code {
            tmch_proto::TMCHResultCode::SuccessNoMessages => Response::Ok(None),
            tmch_proto::TMCHResultCode::SuccessAckToDequeue => match response.message_queue {
                Some(value) => Response::Ok(Some(PollResponse {
                    count: value.count,
                    id: value.id,
                    enqueue_time: value.enqueue_date.unwrap_or_else(Utc::now),
                    message: value.message.unwrap_or_default(),
                    data: match response.data {
                        Some(_value) => return Err(Error::ServerInternal),
                        None => PollData::None,
                    },
                })),
                None => Err(Error::ServerInternal),
            },
            _ => Err(Error::ServerInternal),
        },
        None => Err(Error::ServerInternal),
    }
}

pub fn handle_poll_ack(_client: &(), req: &PollAckRequest) -> HandleReqReturn<PollAckResponse> {
    let command = tmch_proto::TMCHPoll {
        operation: tmch_proto::TMCHPollOperation::Acknowledge,
        message_id: Some(req.id.clone()),
    };
    Ok(tmch_proto::TMCHCommandType::Poll(command))
}

pub fn handle_poll_ack_response(response: tmch_proto::TMCHResponse) -> Response<PollAckResponse> {
    match response.message_queue {
        Some(value) => Response::Ok(PollAckResponse {
            count: Some(value.count),
            next_id: Some(value.id),
        }),
        None => Response::Ok(PollAckResponse {
            count: None,
            next_id: None,
        }),
    }
}