pub mod button;
pub mod generic;
pub mod get_started;
pub mod media;
pub mod next;
pub mod payload;
pub mod persistent_menu;
pub mod quick_replies;
pub mod recipient;
pub mod sender_action;
pub mod text;
use serde::Serialize;
pub trait ResponseModel: Serialize {
const END_POINT: &'static str;
fn get_endpoint(&self) -> &'static str {
Self::END_POINT
}
}
pub mod data {
use crate::error::Result;
use serde::{Deserialize, Serialize};
const MAX_VALUE_AUTHORIZED: usize = 500;
const MIN_PAGE: usize = 0;
pub const MAX_PAGE: usize = 10;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Page(pub usize, pub usize);
impl Page {
pub fn next(&mut self) {
self.0 += MAX_PAGE;
self.1 += MAX_PAGE;
}
}
impl Default for Page {
fn default() -> Self {
Self(MIN_PAGE, MAX_PAGE)
}
}
trait Verify {
fn verify(&self) -> String;
}
impl Verify for String {
fn verify(&self) -> String {
if self.len() >= MAX_VALUE_AUTHORIZED {
self[..MAX_VALUE_AUTHORIZED].to_string()
} else {
self.clone()
}
}
}
#[derive(Debug, Default, Clone, Deserialize, Serialize)]
pub struct Data {
value: String,
page: Option<Page>,
}
impl Data {
pub fn new(value: impl Serialize) -> Self {
let value = serde_json::to_string(&value).unwrap_or_default().verify();
Self { value, page: None }
}
pub fn new_with_page(value: impl Serialize, page: Option<Page>) -> Self {
let value = serde_json::to_string(&value).unwrap_or_default().verify();
Self { value, page }
}
pub fn next(&self) -> Self {
let mut page = self.page.clone().unwrap_or_default();
page.next();
Self {
page: Some(page),
..self.clone()
}
}
pub fn get_value<T: for<'a> Deserialize<'a>>(&self) -> Result<T> {
Ok(serde_json::from_str::<T>(&self.value)?)
}
pub fn get_page(&self) -> Option<Page> {
self.page.clone()
}
}
}