use std::convert::TryInto; use crate::field::extension_field::target::ExtensionTarget; use crate::field::extension_field::Extendable; use crate::field::field::Field; use crate::proof::HashTarget; use crate::target::Target; use crate::witness::{PartialWitness, Witness}; #[derive(Clone)] pub enum Markable { Target(Target), ExtensionTarget(ExtensionTarget), HashTarget(HashTarget), Vec(Vec>), } impl From for Markable { fn from(t: Target) -> Self { Self::Target(t) } } impl From> for Markable { fn from(et: ExtensionTarget) -> Self { Self::ExtensionTarget(et) } } impl From for Markable { fn from(ht: HashTarget) -> Self { Self::HashTarget(ht) } } impl>, const D: usize> From> for Markable { fn from(v: Vec) -> Self { Self::Vec(v.into_iter().map(|m| m.into()).collect()) } } impl Markable { fn print_markable>(&self, pw: &PartialWitness) { match self { Markable::Target(t) => println!("{}", pw.get_target(*t)), Markable::ExtensionTarget(et) => println!("{}", pw.get_extension_target(*et)), Markable::HashTarget(ht) => println!("{:?}", pw.get_hash_target(*ht)), Markable::Vec(v) => v.iter().for_each(|m| m.print_markable(pw)), } } } #[derive(Clone)] pub struct MarkedTargets { pub targets: Markable, pub name: String, } impl MarkedTargets { pub fn display>(&self, pw: &PartialWitness) { println!("Values for {}:", self.name); self.targets.print_markable(pw); println!("End of values for {}", self.name); } }