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 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 #[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 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}