Skip to main content

glsdk/
scheduler.rs

1use crate::{
2    credentials::{Credentials, DeveloperCert},
3    signer::Signer,
4    util::exec,
5    Error,
6};
7
8#[derive(uniffi::Object, Clone)]
9pub struct Scheduler {
10    credentials: Option<Credentials>,
11    network: gl_client::bitcoin::Network,
12    developer_cert: Option<gl_client::credentials::Nobody>,
13}
14
15impl Scheduler {
16    /// Resolve the credentials to use for unauthenticated scheduler
17    /// calls (register, recover). Uses the developer certificate if
18    /// one was provided via `with_developer_cert()`, otherwise falls
19    /// back to the compiled-in default.
20    fn nobody(&self) -> gl_client::credentials::Nobody {
21        self.developer_cert
22            .clone()
23            .unwrap_or_else(gl_client::credentials::Nobody::new)
24    }
25}
26
27#[uniffi::export]
28impl Scheduler {
29    /// Create a `Scheduler` instance configured with the Greenlight
30    /// production service pre-configured.
31    #[uniffi::constructor()]
32    pub fn new(network: crate::Network) -> Result<Scheduler, Error> {
33        let network: gl_client::bitcoin::Network = network.into();
34
35        Ok(Scheduler {
36            credentials: None,
37            network,
38            developer_cert: None,
39        })
40    }
41
42    /// Configure a developer certificate obtained from the Greenlight
43    /// Developer Console. Nodes registered through this scheduler
44    /// will be associated with the developer's account.
45    ///
46    /// Returns a new `Scheduler` instance with the developer
47    /// certificate configured.
48    pub fn with_developer_cert(&self, cert: &DeveloperCert) -> Scheduler {
49        Scheduler {
50            developer_cert: Some(cert.inner.clone()),
51            ..self.clone()
52        }
53    }
54
55    pub fn register(&self, signer: &Signer, code: Option<String>) -> Result<Credentials, Error> {
56        let nobody = self.nobody();
57        exec(async move {
58            let inner = gl_client::scheduler::Scheduler::new(self.network, nobody)
59                .await
60                .map_err(|e| Error::other(e.to_string()))?;
61
62            let res = inner
63                .register(&signer.inner, code)
64                .await
65                .map_err(|e| Error::other(e.to_string()))?;
66
67            Credentials::load(res.creds).map_err(|_e| Error::unparseable_creds())
68        })
69    }
70
71    pub fn recover(&self, signer: &Signer) -> Result<Credentials, Error> {
72        let nobody = self.nobody();
73        exec(async move {
74            let inner = gl_client::scheduler::Scheduler::new(self.network, nobody)
75                .await
76                .map_err(|e| Error::other(e.to_string()))?;
77
78            let res = inner
79                .recover(&signer.inner)
80                .await
81                .map_err(|e| Error::other(e.to_string()))?;
82
83            Credentials::load(res.creds).map_err(|_e| Error::unparseable_creds())
84        })
85    }
86}