use std::marker::PhantomData;
use allocative::Allocative;
use dupe::Clone_;
use dupe::Copy_;
use dupe::Dupe_;
use crate::values::type_repr::StarlarkTypeRepr;
use crate::values::UnpackValue;
use crate::values::Value;
#[derive(Clone_, Copy_, Dupe_, Allocative)]
#[allocative(bound = "")]
pub struct UnpackAndDiscard<T>(PhantomData<fn() -> T>);
impl<T: StarlarkTypeRepr> StarlarkTypeRepr for UnpackAndDiscard<T> {
type Canonical = T::Canonical;
fn starlark_type_repr() -> crate::typing::Ty {
<Self::Canonical as StarlarkTypeRepr>::starlark_type_repr()
}
}
impl<'v, T: UnpackValue<'v>> UnpackValue<'v> for UnpackAndDiscard<T> {
type Error = T::Error;
fn unpack_value_impl(value: Value<'v>) -> Result<Option<Self>, Self::Error> {
match T::unpack_value_impl(value) {
Ok(None) => Ok(None),
Ok(Some(_)) => Ok(Some(UnpackAndDiscard(PhantomData))),
Err(e) => Err(e),
}
}
}