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
use responses::message::Message;
use error::*;
use super::raw;

pub use super::raw::queries::{InlineQuery, ChosenInlineResult, ShippingQuery, PreCheckoutQuery};
use responses::queries::CallbackQuery;
use try_from::TryFrom;

#[derive(Clone, Debug)]
pub struct Update {
    pub id: i64,
    pub kind: UpdateKind,
}

#[derive(Clone, Debug)]
pub enum UpdateKind {
    Message(Message),
    EditedMessage(Message),
    InlineQuery(InlineQuery),
    ChosenInlineResult(ChosenInlineResult),
    CallbackQuery(CallbackQuery),
    ShippingQuery(ShippingQuery),
    PreCheckoutQuery(PreCheckoutQuery),
}

impl TryFrom<raw::update::Update> for Update {
    type Error = UnexpectedResponse;

    fn try_from(update: raw::update::Update) -> Result<Self, UnexpectedResponse> {
        let id = update.update_id;
        let message =
            match update {
                raw::update::Update { message: Some(msg), .. } =>
                    TryFrom::try_from(msg).map(UpdateKind::Message),

                raw::update::Update { edited_message: Some(msg), .. } =>
                    TryFrom::try_from(msg).map(UpdateKind::EditedMessage),

                raw::update::Update { channel_post: Some(post), .. } =>
                    TryFrom::try_from(post).map(UpdateKind::Message),

                raw::update::Update { edited_channel_post: Some(post), .. } =>
                    TryFrom::try_from(post).map(UpdateKind::Message),

                raw::update::Update { callback_query: Some(query), .. } =>
                    TryFrom::try_from(query).map(UpdateKind::CallbackQuery),

                _ =>
                    Err(UnexpectedResponse::Unsupported)
            };
        message
            .map(|x| Update { id, kind: x })
    }
}