use super::{FromUpdate, FromUpdateParts, Parts, Update};
use crate::{responses::Message, RequestBuilder};
use std::sync::Arc;
#[derive(Clone)]
#[must_use]
pub struct Ctx<T> {
request: Arc<RequestBuilder>,
body: T,
}
impl<T> Ctx<T> {
pub fn request(&self) -> &RequestBuilder {
&self.request
}
}
impl<T> std::ops::Deref for Ctx<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.body
}
}
impl<S> FromUpdate<S> for Ctx<Message>
where
S: Send + Sync,
{
async fn from_update(
update: Update,
_state: &S,
request: Arc<RequestBuilder>,
) -> Result<Self, ()> {
let message: Message =
serde_json::from_value(update.updates.unwrap()[0].object.clone()).unwrap();
Ok(Ctx {
request,
body: message,
})
}
}
impl<S> FromUpdateParts<S> for Arc<RequestBuilder>
where
S: Send + Sync,
{
async fn from_update_parts(
_parts: &mut Parts,
_state: &S,
request: Arc<RequestBuilder>,
) -> Result<Self, ()> {
Ok(request)
}
}
impl<S> FromUpdate<S> for Ctx<Update>
where
S: Send + Sync,
{
async fn from_update(
update: Update,
_state: &S,
request: Arc<RequestBuilder>,
) -> Result<Self, ()> {
Ok(Ctx {
request,
body: update,
})
}
}