line-bot-messaging-api 0.1.12

LineMessagingApi for Rust
Documentation
use crate::util::LineUtil;
use serde_derive::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
#[serde(untagged)]
pub enum LineWebhookEventMessage {
    Text(LineWebhookEventMessageText),
    Video(LineWebhookEventMessageVideo),
    Image(LineWebhookEventMessageImage),
    Audio(LineWebhookEventMessageAudio),
    File(LineWebhookEventMessageFile),
    Location(LineWebhookEventMessageLocation),
    Sticker(LineWebhookEventMessageSticker),
    #[default]
    None,
}


impl LineWebhookEventMessage {
    pub fn from_value(message: &Value) -> LineWebhookEventMessage {
        let message_type = LineUtil::value_to_string("type", &message).unwrap_or_default();
        match message_type.as_str() {
            "text" => LineWebhookEventMessage::Text(
                serde_json::from_value(message.clone()).unwrap_or_default(),
            ),
            "video" => LineWebhookEventMessage::Video(
                serde_json::from_value(message.clone()).unwrap_or_default(),
            ),
            "image" => LineWebhookEventMessage::Image(
                serde_json::from_value(message.clone()).unwrap_or_default(),
            ),
            "audio" => LineWebhookEventMessage::Audio(
                serde_json::from_value(message.clone()).unwrap_or_default(),
            ),
            "file" => LineWebhookEventMessage::File(
                serde_json::from_value(message.clone()).unwrap_or_default(),
            ),
            "location" => LineWebhookEventMessage::Location(
                serde_json::from_value(message.clone()).unwrap_or_default(),
            ),
            "sticker" => LineWebhookEventMessage::Sticker(
                serde_json::from_value(message.clone()).unwrap_or_default(),
            ),
            _ => LineWebhookEventMessage::None,
        }
    }
    pub fn text(&self) -> &str {
        match self {
            LineWebhookEventMessage::Text(v) => v.text.as_str(),
            LineWebhookEventMessage::Video(_) => "",
            LineWebhookEventMessage::Image(_) => "",
            LineWebhookEventMessage::Audio(_) => "",
            LineWebhookEventMessage::File(_) => "",
            LineWebhookEventMessage::Location(_) => "",
            LineWebhookEventMessage::Sticker(_) => "",
            LineWebhookEventMessage::None => "",
        }
    }
}

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct LineWebhookEventMessageText {
    pub id: String,
    #[serde(rename = "type")]
    pub message_type: String,
    #[serde(rename = "quoteToken")]
    pub quote_token: String,
    #[serde(rename = "text")]
    pub text: String,
    #[serde(rename = "emojis")]
    pub emojis: Option<Vec<LineWebhookEventMessageTextEmoji>>,
    #[serde(rename = "mention")]
    pub mention: Option<LineWebhookEventMessageTextMention>,
    #[serde(rename = "quotedMessageId")]
    pub quoted_message_id: Option<String>,
}

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct LineWebhookEventMessageTextEmoji {
    pub index: u32,
    pub length: u32,
    #[serde(rename = "productId")]
    pub product_id: String,
    #[serde(rename = "emojiId")]
    pub emoji_id: String,
    #[serde(rename = "quotedMessageId")]
    pub quoted_message_id: Option<String>,
}

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct LineWebhookEventMessageTextMention {
    pub mentionees: Vec<LineWebhookEventMessageTextMentionMentionees>,
}

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct LineWebhookEventMessageTextMentionMentionees {
    pub index: u32,
    pub length: u32,
    #[serde(rename = "type")]
    pub mention_type: String,
    #[serde(rename = "userId")]
    pub user_id: Option<String>,
}

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct LineWebhookEventMessageImage {
    pub id: String,
    #[serde(rename = "type")]
    pub message_type: String,
    #[serde(rename = "quoteToken")]
    pub quote_token: String,
    #[serde(rename = "contentProvider")]
    pub content_provider: LineWebhookEventMessageContentProvider,
    #[serde(rename = "imageSet")]
    pub image_set: Option<LineWebhookEventMessageImageImageSet>,
}

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct LineWebhookEventMessageImageImageSet {
    pub id: Option<String>,
    pub index: Option<u32>,
    pub total: Option<u32>,
}

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct LineWebhookEventMessageVideo {
    pub id: String,
    #[serde(rename = "type")]
    pub message_type: String,
    #[serde(rename = "quoteToken")]
    pub quote_token: String,
    #[serde(rename = "duration")]
    pub duration: Option<u32>,
    #[serde(rename = "contentProvider")]
    pub content_provider: LineWebhookEventMessageContentProvider,
}

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct LineWebhookEventMessageAudio {
    pub id: String,
    #[serde(rename = "type")]
    pub message_type: String,
    #[serde(rename = "duration")]
    pub duration: Option<u32>,
    #[serde(rename = "contentProvider")]
    pub content_provider: LineWebhookEventMessageContentProvider,
}

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct LineWebhookEventMessageFile {
    pub id: String,
    #[serde(rename = "type")]
    pub message_type: String,
    #[serde(rename = "fileName")]
    pub file_name: String,
    #[serde(rename = "fileSize")]
    pub file_size: u32,
}

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct LineWebhookEventMessageLocation {
    pub id: String,
    #[serde(rename = "type")]
    pub message_type: String,
    pub title: Option<String>,
    pub address: Option<String>,
    pub latitude: f32,
    pub longitude: f32,
}

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct LineWebhookEventMessageSticker {
    pub id: String,
    #[serde(rename = "type")]
    pub message_type: String,
    #[serde(rename = "quoteToken")]
    pub quote_token: String,
    #[serde(rename = "packageId")]
    pub package_id: String,
    #[serde(rename = "stickerId")]
    pub sticker_id: String,
    #[serde(rename = "stickerResourceType")]
    pub sticker_resource_type: String,
    pub keywords: Option<Vec<String>>,
    pub text: Option<String>,
    #[serde(rename = "quotedMessageId")]
    pub quoted_message_id: Option<String>,
}

#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct LineWebhookEventMessageContentProvider {
    #[serde(rename = "type")]
    pub content_provider_type: String,
    #[serde(rename = "originalContentUrl")]
    pub original_content_url: Option<String>,
    #[serde(rename = "previewImageUrl")]
    pub preview_image_url: Option<String>,
}