line_bot_messaging_api/entity/message/
image_map.rs

1use crate::message::LineMessageObject;
2use serde_derive::{Deserialize, Serialize};
3use serde_json::{json, Value};
4
5#[derive(Deserialize, Serialize, Clone)]
6pub struct LineMessageImageMap {
7    #[serde(rename = "type")]
8    message_type: String,
9    #[serde(rename = "baseUrl")]
10    base_url: String,
11    #[serde(rename = "altText")]
12    alt_text: String,
13    #[serde(rename = "baseSize")]
14    base_size: LineMessageImageMapBaseSize,
15
16    #[serde(rename = "actions")]
17    actions: Vec<Value>,
18}
19
20impl LineMessageImageMap {
21    pub fn append_action(&mut self, action: impl LineMessageImageMapActionObject) {
22        self.actions.push(action.build());
23    }
24
25    pub fn new<T: ToString>(
26        base_url: T,
27        alt_text: T,
28        base_size: LineMessageImageMapBaseSize,
29    ) -> Self {
30        Self {
31            message_type: "imagemap".to_string(),
32            base_url: base_url.to_string(),
33            alt_text: alt_text.to_string(),
34            base_size,
35            actions: vec![],
36        }
37    }
38}
39
40#[derive(Deserialize, Serialize, Clone)]
41pub struct LineMessageImageMapBaseSize {
42    #[serde(rename = "height")]
43    height: u32,
44    #[serde(rename = "width")]
45    width: u32,
46}
47
48impl LineMessageImageMapBaseSize {
49    pub fn new(height: u32, width: u32) -> Self {
50        Self { height, width }
51    }
52}
53
54#[derive(Deserialize, Serialize, Clone)]
55pub struct LineMessageImageMapVideo {
56    #[serde(rename = "originalContentUrl")]
57    original_content_url: String,
58    #[serde(rename = "previewImageUrl")]
59    preview_image_url: String,
60    area: LineMessageImageMapArea,
61    #[serde(rename = "externalLink")]
62    external_link: Option<LineMessageImageMapVideoExternalLink>,
63}
64
65#[derive(Deserialize, Serialize, Clone)]
66pub struct LineMessageImageMapVideoExternalLink {
67    #[serde(rename = "linkUri")]
68    link_uri: String,
69    #[serde(rename = "label")]
70    label: String,
71}
72
73/// https://developers.line.biz/ja/reference/messaging-api/#imagemap-action-objects
74
75pub trait LineMessageImageMapActionObject {
76    fn build(&self) -> Value;
77}
78
79#[derive(Deserialize, Serialize, Clone)]
80pub struct LineMessageImageMapActionUri {
81    #[serde(rename = "type")]
82    message_type: String,
83    #[serde(rename = "label")]
84    label: Option<String>,
85    #[serde(rename = "linkUri")]
86    link_uri: String,
87    area: LineMessageImageMapArea,
88}
89
90impl LineMessageImageMapActionUri {
91    pub fn new<T: ToString>(link_uri: T, area: LineMessageImageMapArea) -> Self {
92        Self {
93            message_type: "uri".to_string(),
94            label: None,
95            link_uri: link_uri.to_string(),
96            area,
97        }
98    }
99    pub fn set_label(&mut self, label: String) {
100        self.label = Some(label);
101    }
102}
103
104impl LineMessageImageMapActionObject for LineMessageImageMapActionUri {
105    fn build(&self) -> Value {
106        json!(self)
107    }
108}
109
110#[derive(Deserialize, Serialize, Clone)]
111pub struct LineMessageImageMapActionMessage {
112    #[serde(rename = "type")]
113    message_type: String,
114    #[serde(rename = "label")]
115    label: Option<String>,
116    #[serde(rename = "linkUri")]
117    text: String,
118    area: LineMessageImageMapArea,
119}
120
121impl LineMessageImageMapActionObject for LineMessageImageMapActionMessage {
122    fn build(&self) -> Value {
123        json!(self)
124    }
125}
126impl LineMessageImageMapActionMessage {
127    pub fn new(text: String, area: LineMessageImageMapArea) -> Self {
128        Self {
129            message_type: "message".to_string(),
130            label: None,
131            text,
132            area,
133        }
134    }
135    pub fn set_label(&mut self, label: String) {
136        self.label = Some(label);
137    }
138}
139
140#[derive(Deserialize, Serialize, Clone)]
141pub struct LineMessageImageMapArea {
142    #[serde(rename = "x")]
143    x: u32,
144    #[serde(rename = "y")]
145    y: u32,
146    #[serde(rename = "width")]
147    width: u32,
148    #[serde(rename = "height")]
149    height: u32,
150}
151
152impl LineMessageImageMapArea {
153    pub fn new(x: u32, y: u32, width: u32, height: u32) -> Self {
154        Self {
155            x,
156            y,
157            width,
158            height,
159        }
160    }
161}
162//
163
164impl LineMessageObject for LineMessageImageMap {
165    fn build(&self) -> Value {
166        json!(self)
167    }
168}