From c36762c7af66a1603134220d47aeecabaabf93e5 Mon Sep 17 00:00:00 2001
From: Waffle <waffle.lapkin@gmail.com>
Date: Sun, 28 Mar 2021 14:39:03 +0300
Subject: [PATCH] Add `Deref` impl for `ChatMember` to allow calling kind's
 methods directly

---
 src/types/chat_member.rs | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/src/types/chat_member.rs b/src/types/chat_member.rs
index 26b82002..7367b75f 100644
--- a/src/types/chat_member.rs
+++ b/src/types/chat_member.rs
@@ -1,3 +1,5 @@
+use std::ops::Deref;
+
 use serde::{Deserialize, Serialize};
 
 use crate::types::User;
@@ -130,9 +132,27 @@ pub struct Kicked {
     pub until_date: i32,
 }
 
-impl ChatMember {
+/// This allows calling [`ChatMemberKind`]'s methods directly on [`ChatMember`]
+///
+/// ```no_run
+/// use teloxide_core::types::ChatMember;
+///
+/// let member: ChatMember = todo!();
+///
+/// let _ = member.status();
+/// let _ = member.kind.status();
+/// ```
+impl Deref for ChatMember {
+    type Target = ChatMemberKind;
+
+    fn deref(&self) -> &Self::Target {
+        &self.kind
+    }
+}
+
+impl ChatMemberKind {
     pub fn status(&self) -> ChatMemberStatus {
-        match &self.kind {
+        match self {
             ChatMemberKind::Creator(_) => ChatMemberStatus::Creator,
             ChatMemberKind::Administrator(_) => ChatMemberStatus::Administrator,
             ChatMemberKind::Member => ChatMemberStatus::Member,
@@ -141,9 +161,7 @@ impl ChatMember {
             ChatMemberKind::Kicked(_) => ChatMemberStatus::Kicked,
         }
     }
-}
 
-impl ChatMemberKind {
     /// Getter for [`Administrator::custom_title`] and [`Creator::custom_title`]
     /// fields.
     pub fn custom_title(&self) -> Option<&str> {