use crate::core::{AsSerializeArg, Serialize, SerializeArg};
use crate::error::Error;
use crate::handle::Handle;
use crate::low_level;
use std::fmt;
use std::marker::PhantomData;
use std::task::{Context, Poll};
use std::time::Instant;
pub struct Promise<T: ?Sized, E: ?Sized> {
inner: low_level::Promise,
phantom: PhantomData<fn(T, E)>,
}
impl<T: ?Sized, E: ?Sized> Promise<T, E> {
pub(crate) fn new(inner: low_level::Promise) -> Self {
Self {
inner,
phantom: PhantomData,
}
}
pub fn client(&self) -> &Handle {
self.inner.client()
}
pub fn id(&self) -> u32 {
self.inner.id()
}
pub fn version(&self) -> Option<u32> {
self.inner.version()
}
pub fn timestamp(&self) -> Instant {
self.inner.timestamp()
}
pub fn cast<T2: ?Sized, E2: ?Sized>(self) -> Promise<T2, E2> {
Promise::new(self.inner)
}
pub fn into_low_level(self) -> low_level::Promise {
self.inner
}
pub fn abort(self) -> Result<(), Error> {
self.inner.abort()
}
pub fn invalid_function(self) -> Result<(), Error> {
self.inner.invalid_function()
}
pub fn invalid_args(self) -> Result<(), Error> {
self.inner.invalid_args()
}
pub fn is_aborted(&mut self) -> bool {
self.inner.is_aborted()
}
pub fn poll_aborted(&mut self, cx: &mut Context) -> Poll<()> {
self.inner.poll_aborted(cx)
}
pub async fn aborted(&mut self) {
self.inner.aborted().await
}
}
impl<T, E> Promise<T, E>
where
T: AsSerializeArg + ?Sized,
E: ?Sized,
{
pub fn ok(self, value: SerializeArg<T>) -> Result<(), Error> {
self.inner.ok(&value)
}
}
impl<T, E> Promise<T, E>
where
T: Serialize + ?Sized,
E: ?Sized,
{
pub fn ok_ref(self, value: &T) -> Result<(), Error> {
self.inner.ok(value)
}
}
impl<E: ?Sized> Promise<(), E> {
pub fn done(self) -> Result<(), Error> {
self.inner.done()
}
}
impl<T, E> Promise<T, E>
where
T: ?Sized,
E: AsSerializeArg + ?Sized,
{
pub fn err(self, value: SerializeArg<E>) -> Result<(), Error> {
self.inner.err(&value)
}
}
impl<T, E> Promise<T, E>
where
T: ?Sized,
E: Serialize + ?Sized,
{
pub fn err_ref(self, value: &E) -> Result<(), Error> {
self.inner.err(value)
}
}
impl<T, E> Promise<T, E>
where
T: AsSerializeArg + ?Sized,
E: AsSerializeArg + ?Sized,
{
pub fn set(self, res: Result<SerializeArg<T>, SerializeArg<E>>) -> Result<(), Error> {
self.inner.set(res.as_ref())
}
}
impl<T, E> Promise<T, E>
where
T: Serialize + ?Sized,
E: Serialize + ?Sized,
{
pub fn set_ref(self, res: Result<&T, &E>) -> Result<(), Error> {
self.inner.set(res)
}
}
impl<T: ?Sized, E: ?Sized> fmt::Debug for Promise<T, E> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Promise")
.field("inner", &self.inner)
.finish()
}
}