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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// https://yandex.ru/dev/dialogs/alice/doc/protocol.html

use serde::Serialize;

use crate::request;

#[derive(Serialize)]
pub struct Message<SessionState = serde_json::Value> {
    pub response: Response<SessionState>,

    // for marusya https://vk.com/dev/marusia_skill_docs
    pub session: Option<request::Session>,

    version: &'static str,
}

impl<SessionState> Message<SessionState>{
    pub fn new()->Self{
        return Message{
            response: Response::default(),
            version: "1.0",
            session: Some(request::Session::default()),
        }
    }

    pub fn from_request(req: &request::Request<SessionState>)->Self{
        let mut mess = Self::new();
        mess.session = Some(req.session.clone());
        return mess;
    }

    pub fn with_response(mut self, resp: Response<SessionState>)->Self
    {
        self.response = resp;
        return self;
    }

    pub fn with_session(mut self, session: request::Session)->Self{
        self.session = Some(session);
        return self;
    }
}


#[derive(Serialize)]
pub struct Response<SessionState=serde_json::Value> {
    pub text: String,
    pub end_session: bool,

    // https://yandex.ru/dev/dialogs/alice/doc/session-persistence.html/
    #[serde(skip_serializing_if = "Option::is_none")]
    pub session_state:Option<SessionState>,
}

impl<SessionState> Response<SessionState>{
    pub fn with_text(mut self, text: String)->Self{
        self.text = text;
        return self;
    }
}

impl<SessionState> Default for Response<SessionState>{
    fn default()->Self{
        return Response::<SessionState>{
            text: String::default(),
            end_session: bool::default(),
            session_state: None,
        }
    }
}

impl<SessionState> Response<SessionState>{
    pub fn from_request(req: request::Request<SessionState>)->Self{
        let mut resp = Self::default();
        resp.session_state = req.session_state;
        return resp;
    }
}