use super::*;
impl<E: Environment> Cast<Address<E>> for Scalar<E> {
#[inline]
fn cast(&self) -> Result<Address<E>> {
let field: Field<E> = self.cast()?;
Address::from_field(&field)
}
}
impl<E: Environment> Cast<Boolean<E>> for Scalar<E> {
#[inline]
fn cast(&self) -> Result<Boolean<E>> {
if self.is_zero() {
Ok(Boolean::new(false))
} else if self.is_one() {
Ok(Boolean::new(true))
} else {
bail!("Failed to convert scalar to boolean: scalar is not zero or one")
}
}
}
impl<E: Environment> Cast<Group<E>> for Scalar<E> {
#[inline]
fn cast(&self) -> Result<Group<E>> {
let field: Field<E> = self.cast()?;
Group::from_field(&field)
}
}
impl<E: Environment> Cast<Field<E>> for Scalar<E> {
#[inline]
fn cast(&self) -> Result<Field<E>> {
self.to_field()
}
}
impl<E: Environment, I: IntegerType> Cast<Integer<E, I>> for Scalar<E> {
#[inline]
fn cast(&self) -> Result<Integer<E, I>> {
let bits_le = self.to_bits_le();
Integer::<E, I>::from_bits_le(&bits_le)
}
}
impl<E: Environment> Cast<Scalar<E>> for Scalar<E> {
#[inline]
fn cast(&self) -> Result<Scalar<E>> {
Ok(*self)
}
}
impl<E: Environment> Cast<IdentifierLiteral<E>> for Scalar<E> {
#[inline]
fn cast(&self) -> Result<IdentifierLiteral<E>> {
let field: Field<E> = self.cast()?;
field.cast()
}
}