use canonical::Canon;
use canonical_derive::Canon;
use dusk_bls12_381::BlsScalar;
use dusk_jubjub::{JubJubAffine, JubJubExtended, JubJubScalar};
#[derive(Debug, Canon, Clone)]
pub enum PublicInput {
Point(JubJubAffine),
BlsScalar(BlsScalar),
JubJubScalar(JubJubScalar),
}
impl From<BlsScalar> for PublicInput {
fn from(s: BlsScalar) -> PublicInput {
Self::BlsScalar(s)
}
}
impl From<u64> for PublicInput {
fn from(n: u64) -> PublicInput {
Self::BlsScalar(n.into())
}
}
impl From<JubJubScalar> for PublicInput {
fn from(s: JubJubScalar) -> PublicInput {
Self::JubJubScalar(s)
}
}
impl From<JubJubAffine> for PublicInput {
fn from(p: JubJubAffine) -> PublicInput {
Self::Point(p)
}
}
impl From<JubJubExtended> for PublicInput {
fn from(p: JubJubExtended) -> PublicInput {
JubJubAffine::from(p).into()
}
}
impl<T> From<&T> for PublicInput
where
T: Clone + Into<PublicInput>,
{
fn from(t: &T) -> PublicInput {
t.clone().into()
}
}
#[cfg(not(target_arch = "wasm32"))]
mod host {
use super::PublicInput;
use dusk_plonk::prelude::*;
impl From<PublicInput> for PublicInputValue {
fn from(pi: PublicInput) -> PublicInputValue {
match pi {
PublicInput::BlsScalar(v) => PublicInputValue::from(v),
PublicInput::JubJubScalar(v) => PublicInputValue::from(v),
PublicInput::Point(v) => PublicInputValue::from(v),
}
}
}
}