diff --git a/src/core/requests/send_contact.rs b/src/core/requests/send_contact.rs index 6ffd1f2a..16cbec0e 100644 --- a/src/core/requests/send_contact.rs +++ b/src/core/requests/send_contact.rs @@ -1,7 +1,142 @@ -use crate::core::requests::RequestContext; -//TODO:: need implementation +use crate::core::network; +use crate::core::requests::{ + ChatId, Request, RequestContext, RequestFuture, ResponseResult, +}; +use crate::core::types::{Message, ReplyMarkup}; + +/// Use this method to send phone contacts. +/// returned. #[derive(Debug, Clone, Serialize)] struct SendContact<'a> { #[serde(skip_serializing)] ctx: RequestContext<'a>, + /// Unique identifier for the target chat or + /// username of the target channel (in the format @channelusername) + pub chat_id: ChatId, + /// Contact's phone number + pub phone_number: String, + /// Contact's first name + pub first_name: String, + /// Contact's last name + #[serde(skip_serializing_if = "Option::is_none")] + pub last_name: Option, + /// Additional data about the contact in the form of a + /// vCard, 0-2048 bytes + #[serde(skip_serializing_if = "Option::is_none")] + pub vcard: Option, + /// Sends the message silently. Users will receive a + /// notification with no sound. + #[serde(skip_serializing_if = "Option::is_none")] + pub disable_notification: Option, + /// If the message is a reply, ID of the original + /// message + #[serde(skip_serializing_if = "Option::is_none")] + pub reply_to_message_id: Option, + /// InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardRemove + /// or ForceReply Optional Additional interface options. A JSON-serialized + /// object for an inline keyboard, custom reply keyboard, instructions to + /// remove keyboard or to force a reply from the user. + #[serde(skip_serializing_if = "Option::is_none")] + pub reply_markup: Option, +} + +impl<'a> Request<'a> for SendContact<'a> { + type ReturnValue = Message; + + fn send(self) -> RequestFuture<'a, ResponseResult> { + Box::pin(async move { + network::request_json( + &self.ctx.client, + &self.ctx.token, + "sendContact", + &self, + ) + .await + }) + } +} + +impl<'a> SendContact<'a> { + pub(crate) fn new( + ctx: RequestContext<'a>, + chat_id: ChatId, + phone_number: String, + first_name: String, + ) -> Self { + Self { + ctx, + chat_id, + phone_number, + first_name, + last_name: None, + vcard: None, + disable_notification: None, + reply_to_message_id: None, + reply_markup: None, + } + } + + pub fn chat_id(mut self, chat_id: T) -> Self + where + T: Into, + { + self.chat_id = chat_id.into(); + self + } + + pub fn phone_number(mut self, phone_number: T) -> Self + where + T: Into, + { + self.phone_number = phone_number.into(); + self + } + + pub fn first_name(mut self, first_name: T) -> Self + where + T: Into, + { + self.first_name = first_name.into(); + self + } + + pub fn last_name(mut self, last_name: T) -> Self + where + T: Into, + { + self.last_name = Some(last_name.into()); + self + } + + pub fn vcard(mut self, vcard: T) -> Self + where + T: Into, + { + self.vcard = Some(vcard.into()); + self + } + + pub fn disable_notification(mut self, disable_notification: T) -> Self + where + T: Into, + { + self.disable_notification = Some(disable_notification.into()); + self + } + + pub fn reply_to_message_id(mut self, reply_to_message_id: T) -> Self + where + T: Into, + { + self.reply_to_message_id = Some(reply_to_message_id.into()); + self + } + + pub fn reply_markup(mut self, reply_markup: T) -> Self + where + T: Into, + { + self.reply_markup = Some(reply_markup.into()); + self + } } diff --git a/src/core/requests/send_poll.rs b/src/core/requests/send_poll.rs index 8341bb39..ba11325b 100644 --- a/src/core/requests/send_poll.rs +++ b/src/core/requests/send_poll.rs @@ -1,8 +1,114 @@ -use crate::core::requests::RequestContext; -//TODO:: need implementation +use crate::core::network; +use crate::core::requests::{ + ChatId, Request, RequestContext, RequestFuture, ResponseResult, +}; +use crate::core::types::{Message, ReplyMarkup}; +/// Use this method to send a native poll. A native poll can't be sent to a +/// private chat. On success, the sent Message is returned. #[derive(Debug, Clone, Serialize)] struct SendPoll<'a> { #[serde(skip_serializing)] ctx: RequestContext<'a>, + /// identifier for the target chat or username of the target channel (in + /// the format @channelusername). A native poll can't be sent to a private + /// chat. + chat_id: ChatId, + /// Poll question, 1-255 characters + question: String, + /// List of answer options, 2-10 strings 1-100 characters each + options: Vec, + /// Sends the message silently. Users will receive a notification with no + /// sound. + disable_notification: Option, + /// If the message is a reply, ID of the original message + reply_to_message_id: Option, + /// InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardRemove + /// or ForceReply Optional Additional interface options. A JSON-serialized + /// object for an inline keyboard, custom reply keyboard, instructions to + /// remove reply keyboard or to force a reply from the user. + reply_markup: Option, +} + +impl<'a> Request<'a> for SendPoll<'a> { + type ReturnValue = Message; + + fn send(self) -> RequestFuture<'a, ResponseResult> { + Box::pin(async move { + network::request_json( + &self.ctx.client, + &self.ctx.token, + "sendPoll", + &self, + ) + .await + }) + } +} + +impl<'a> SendPoll<'a> { + pub(crate) fn new( + ctx: RequestContext<'a>, + chat_id: ChatId, + question: String, + options: Vec, + ) -> Self { + Self { + ctx, + chat_id, + question, + options, + disable_notification: None, + reply_to_message_id: None, + reply_markup: None, + } + } + + pub fn chat_id(mut self, chat_id: T) -> Self + where + T: Into, + { + self.chat_id = chat_id.into(); + self + } + + pub fn question(mut self, question: T) -> Self + where + T: Into, + { + self.question = question.into(); + self + } + + pub fn options(mut self, options: T) -> Self + where + T: Into>, + { + self.options = options.into(); + self + } + + pub fn disable_notification(mut self, disable_notification: T) -> Self + where + T: Into>, + { + self.disable_notification = Some(disable_notification.into()); + self + } + + pub fn reply_to_message_id(mut self, reply_to_message_id: T) -> Self + where + T: Into>, + { + self.reply_to_message_id = Some(reply_to_message_id.into()); + self + } + + pub fn reply_markup(mut self, reply_markup: T) -> Self + where + T: Into, + { + self.reply_markup = Some(reply_markup.into()); + self + } } diff --git a/src/core/requests/send_venue.rs b/src/core/requests/send_venue.rs index deac9b61..efdaccf0 100644 --- a/src/core/requests/send_venue.rs +++ b/src/core/requests/send_venue.rs @@ -1,43 +1,158 @@ -use crate::core::requests::{ChatId, RequestContext}; +use crate::core::network; +use crate::core::requests::{ + ChatId, Request, RequestContext, RequestFuture, ResponseResult, +}; +use crate::core::types::{Message, ReplyMarkup}; -//TODO:: need implementation -///Use this method to send information about a venue. On success, the sent +/// Use this method to send information about a venue. /// Message is returned. #[derive(Debug, Clone, Serialize)] struct SendVenue<'a> { #[serde(skip_serializing)] ctx: RequestContext<'a>, - /// Integer or String Yes Unique identifier for the target chat or + /// Unique identifier for the target chat or /// username of the target channel (in the format @channelusername) - chat_id: ChatId, - /// Float number Yes Latitude of the venue - latitude: f64, - ///Float number Yes Longitude of the venue - longitude: f64, - /// Yes Name of the venue - title: String, - ///String Yes Address of the venue - address: String, - /// String Optional Foursquare identifier of the venue + pub chat_id: ChatId, + /// Latitude of the venue + pub latitude: f64, + /// Longitude of the venue + pub longitude: f64, + /// Name of the venue + pub title: String, + /// Address of the venue + pub address: String, + /// Foursquare identifier of the venue #[serde(skip_serializing_if = "Option::is_none")] - foursquare_id: Option, - /// String Optional Foursquare type of the venue, if known. (For + pub foursquare_id: Option, + /// Foursquare type of the venue, if known. (For /// example, “arts_entertainment/default”, “arts_entertainment/aquarium” or /// “food/icecream”.) #[serde(skip_serializing_if = "Option::is_none")] - foursquare_type: Option, - /// Boolean Optional Sends the message silently. Users will receive a + pub foursquare_type: Option, + /// Sends the message silently. Users will receive a /// notification with no sound. #[serde(skip_serializing_if = "Option::is_none")] - disable_notification: Option, - /// Integer Optional If the message is a reply, ID of the original + pub disable_notification: Option, + /// If the message is a reply, ID of the original /// message #[serde(skip_serializing_if = "Option::is_none")] - reply_to_message_id: Option, + pub reply_to_message_id: Option, /// InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardRemove or /// ForceReply Optional Additional interface options. A JSON-serialized /// object for an inline keyboard, custom reply keyboard, instructions to /// remove reply keyboard or to force a reply from the user. #[serde(skip_serializing_if = "Option::is_none")] - reply_markup: Option<()>, //TODO: need concrete type + pub reply_markup: Option, +} + +impl<'a> Request<'a> for SendVenue<'a> { + type ReturnValue = Message; + + fn send(self) -> RequestFuture<'a, ResponseResult> { + Box::pin(async move { + network::request_json( + &self.ctx.client, + &self.ctx.token, + "sendVenue", + Some(&self), + ) + .await + }) + } +} + +impl<'a> SendVenue<'a> { + pub fn new( + ctx: RequestContext<'a>, + chat_id: ChatId, + latitude: f64, + longitude: f64, + title: String, + address: String, + ) -> Self { + Self { + ctx, + chat_id, + latitude, + longitude, + title, + address, + foursquare_id: None, + foursquare_type: None, + disable_notification: None, + reply_to_message_id: None, + reply_markup: None, + } + } + pub fn chat_id(mut self, chat_id: T) -> Self + where + T: Into, + { + self.chat_id = chat_id.into(); + self + } + + pub fn longitude(mut self, longitude: T) -> Self + where + T: Into, + { + self.longitude = longitude.into(); + self + } + + pub fn latitude(mut self, latitude: T) -> Self + where + T: Into, + { + self.latitude = latitude.into(); + self + } + + pub fn title(mut self, title: T) -> Self + where + T: Into, + { + self.title = title.into(); + self + } + + pub fn address(mut self, address: T) -> Self + where + T: Into, + { + self.address = address.into(); + self + } + + pub fn foursquare_id(mut self, foursquare_id: T) -> Self + where + T: Into, + { + self.foursquare_id = Some(foursquare_id.into()); + self + } + + pub fn disable_notification(mut self, disable_notification: T) -> Self + where + T: Into, + { + self.disable_notification = Some(disable_notification.into()); + self + } + + pub fn foursquare_type(mut self, foursquare_type: T) -> Self + where + T: Into, + { + self.foursquare_type = Some(foursquare_type.into()); + self + } + + pub fn reply_markup(mut self, reply_markup: T) -> Self + where + T: Into, + { + self.reply_markup = Some(ReplyMarkup.into()); + self + } }