Skip to main content

haste_health/commands/
worker.rs

1use std::sync::Arc;
2
3use clap::Subcommand;
4use figment::{
5    Figment,
6    providers::{Env, Format as _, Toml},
7};
8use haste_fhir_model::r4::generated::terminology::IssueType;
9use haste_fhir_operation_error::OperationOutcomeError;
10use haste_worker::{search_indexing, traits::Worker as _};
11
12#[derive(Subcommand, Debug)]
13pub(crate) enum WorkerCommands {
14    Worker,
15    WalWorker,
16}
17
18pub(crate) async fn worker(command: &Option<WorkerCommands>) -> Result<(), OperationOutcomeError> {
19    match command {
20        None | Some(WorkerCommands::Worker) => {
21            let config: Arc<search_indexing::WorkerEnvironment> = Arc::new(
22                Figment::new()
23                    .merge(Toml::file("haste.toml"))
24                    .merge(Env::prefixed("HASTE_"))
25                    .extract()
26                    .map_err(|e| {
27                        OperationOutcomeError::error(IssueType::exception(), e.to_string())
28                    })?,
29            );
30
31            let indexing_worker = search_indexing::IndexingWorker::new(config).await?;
32
33            let handler = indexing_worker.run().await?;
34
35            handler.await.map_err(|e| {
36                OperationOutcomeError::fatal(
37                    haste_fhir_model::r4::generated::terminology::IssueType::exception(),
38                    format!("Worker task failed: {:?}", e),
39                )
40            })?;
41
42            Ok(())
43        }
44        Some(WorkerCommands::WalWorker) => todo!(),
45    }
46}
47
48// async fn create_wal_worker() -> Result<(), Box<dyn std::error::Error>> {
49//     let config = get_config::<WALWorkerEnvironmentVariables>("environment".into());
50
51//     let connection_url = config
52//         .get(WALWorkerEnvironmentVariables::DatabaseURL)
53//         .expect(&format!(
54//             "'{}' variable not set",
55//             String::from(WALWorkerEnvironmentVariables::DatabaseURL)
56//         ));
57
58//     let slot_name = config
59//         .get(WALWorkerEnvironmentVariables::PGSlotName)
60//         .expect(&format!(
61//             "'{}' variable not set",
62//             String::from(WALWorkerEnvironmentVariables::PGSlotName)
63//         ));
64//     let publication_name = config
65//         .get(WALWorkerEnvironmentVariables::PGPublicationName)
66//         .expect(&format!(
67//             "'{}' variable not set",
68//             String::from(WALWorkerEnvironmentVariables::PGPublicationName)
69//         ));
70
71//     wal_worker(slot_name, publication_name, &connection_url).await;
72
73//     Ok(())
74// }