1use std::{
2 future::{Future, IntoFuture},
3 pin::Pin,
4};
5
6use super::{EnvProver, EnvProvingKey};
7use crate::{prover::BaseProveRequest, ProveRequest, Prover, SP1ProofWithPublicValues};
8use anyhow::Result;
9
10pub struct EnvProveRequest<'a> {
12 pub(crate) base: BaseProveRequest<'a, EnvProver>,
13}
14
15impl<'a> ProveRequest<'a, EnvProver> for EnvProveRequest<'a> {
16 fn base(&mut self) -> &mut BaseProveRequest<'a, EnvProver> {
17 &mut self.base
18 }
19}
20
21impl<'a> IntoFuture for EnvProveRequest<'a> {
22 type Output = Result<SP1ProofWithPublicValues>;
23
24 type IntoFuture = Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>;
25
26 fn into_future(self) -> Self::IntoFuture {
27 let BaseProveRequest { prover, pk, stdin, mode, context_builder } = self.base;
28
29 match prover {
30 EnvProver::Cpu(prover) => match pk {
31 EnvProvingKey::Cpu { pk, .. } => {
32 let mut req = prover.prove(pk, stdin);
33 req.base.mode = mode;
34 req.base.context_builder = context_builder;
35
36 Box::pin(async move { Ok(req.into_future().await?) })
37 }
38 _ => panic!("Invalid proving key type for CPU prover"),
39 },
40 #[cfg(feature = "cuda")]
41 EnvProver::Cuda(prover) => match self.base.pk {
42 EnvProvingKey::Cuda { pk, .. } => {
43 let mut req = prover.prove(pk, stdin);
44 req.base.mode = mode;
45 req.base.context_builder = context_builder;
46
47 Box::pin(async move { Ok(req.into_future().await?) })
48 }
49 _ => panic!("Invalid proving key type for CUDA prover"),
50 },
51 EnvProver::Mock(prover) => match self.base.pk {
52 EnvProvingKey::Mock { pk, .. } => {
53 let mut req = prover.prove(pk, stdin);
54 req.base.mode = mode;
55 req.base.context_builder = context_builder;
56
57 Box::pin(async move { req.await })
58 }
59 _ => panic!("Invalid proving key type for Mock prover"),
60 },
61 EnvProver::Light(prover) => match self.base.pk {
62 EnvProvingKey::Light { pk, .. } => {
63 let mut req = prover.prove(pk, stdin);
64 req.base.mode = mode;
65 req.base.context_builder = context_builder;
66
67 Box::pin(async move { req.await })
68 }
69 _ => panic!("Invalid proving key type for Light prover"),
70 },
71 #[cfg(feature = "network")]
72 EnvProver::Network(prover) => match self.base.pk {
73 EnvProvingKey::Network { pk, .. } => {
74 let mut req = prover.prove(pk, stdin);
75 req.base.mode = mode;
76 req.base.context_builder = context_builder;
77
78 req.into_future()
79 }
80 _ => panic!("Invalid proving key type for Network prover"),
81 },
82 }
83 }
84}