Merge pull request #138 from teloxide/text_getter_for_message_entity

add method text_from for MessageEntity
This commit is contained in:
p0lunin 2020-01-15 11:57:19 +02:00 committed by GitHub
commit 8e0657b6bc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,6 +1,6 @@
use serde::{Deserialize, Serialize};
use crate::types::User;
use crate::types::{User, Message};
/// This object represents one special entity in a text message. For example,
/// hashtags, usernames, URLs, etc.
@ -39,21 +39,83 @@ pub enum MessageEntityKind {
Strikethrough,
}
#[test]
fn recursive_kind() {
use serde_json::from_str;
assert_eq!(
MessageEntity {
kind: MessageEntityKind::TextLink {
url: "ya.ru".into()
},
offset: 1,
length: 2,
},
from_str::<MessageEntity>(
r#"{"type":"text_link","url":"ya.ru","offset":1,"length":2}"#
)
.unwrap()
);
impl MessageEntity {
pub fn text_from(&self, message: &Message) -> Option<String> {
let text = message.text();
Some(String::from(&text?[self.offset..self.offset+self.length]))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::{Chat, ChatKind, MessageKind, Sender, ForwardKind, MediaKind};
#[test]
fn recursive_kind() {
use serde_json::from_str;
assert_eq!(
MessageEntity {
kind: MessageEntityKind::TextLink {
url: "ya.ru".into()
},
offset: 1,
length: 2,
},
from_str::<MessageEntity>(
r#"{"type":"text_link","url":"ya.ru","offset":1,"length":2}"#
)
.unwrap()
);
}
#[test]
fn text_from() {
let message = message();
let expected = Some("yes".to_string());
let entity = message.entities().unwrap()[0].clone();
let actual = entity.text_from(&message);
assert_eq!(actual, expected);
}
fn message() -> Message {
Message {
id: 0,
date: 0,
chat: Chat {
id: 0,
kind: ChatKind::Private {
type_: (),
username: None,
first_name: None,
last_name: None,
},
photo: None,
},
kind: MessageKind::Common {
from: Sender::User(User {
id: 0,
is_bot: false,
first_name: "".to_string(),
last_name: None,
username: None,
language_code: None,
}),
forward_kind: ForwardKind::Origin {
reply_to_message: None,
},
edit_date: None,
media_kind: MediaKind::Text {
text: "no yes no".to_string(),
entities: vec![MessageEntity {
kind: MessageEntityKind::Mention,
offset: 3,
length: 3
}],
},
reply_markup: None,
},
}
}
}