line_bot_messaging_api/entity/message/
image_map.rs1use 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
73pub 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}
162impl LineMessageObject for LineMessageImageMap {
165 fn build(&self) -> Value {
166 json!(self)
167 }
168}