1use serde::Deserialize;
2use serde::Serialize;
3
4use crate::defaults::default_utility_queue_size;
5use crate::unresolved_config::*;
6use crate::*;
7
8#[derive(Clone, Debug, PartialEq)]
11pub struct CUWorkerConfig {
12 pub optimizations: Optimizations,
13 pub logs: SimpleLogs,
14 pub workers: Workers,
15 pub utility_queue_size: usize,
16}
17
18#[derive(Clone, Debug, Serialize, Deserialize)]
19#[serde(rename_all = "kebab-case")]
20pub struct UnresolvedCUWorkerConfig {
21 #[serde(default)]
22 pub optimizations: UnresolvedOptimizations,
23 #[serde(default)]
24 pub logs: UnresolvedSimpleLogs,
25 #[serde(default)]
26 pub workers: UnresolvedWorkers,
27 #[serde(default = "default_utility_queue_size")]
28 pub utility_queue_size: usize,
29}
30
31impl UnresolvedCUWorkerConfig {
32 pub fn resolve(self) -> eyre::Result<CUWorkerConfig> {
33 let optimizations = self.optimizations.resolve_for_cu_worker()?;
34 let logs = self.logs.resolve();
35 let workers = self.workers.resolve();
36 let utility_queue_size = self.utility_queue_size;
37
38 let config = CUWorkerConfig {
39 optimizations,
40 logs,
41 workers,
42 utility_queue_size,
43 };
44 Ok(config)
45 }
46}
47
48pub fn load_cu_config(path: Option<&str>) -> eyre::Result<CUWorkerConfig> {
49 use ::config::Config;
50 use ::config::File;
51 use ::config::FileFormat;
52
53 let mut config_builder = Config::builder();
54 if let Some(path) = path {
55 let config_source = File::with_name(path)
56 .required(true)
57 .format(FileFormat::Toml);
58 config_builder = config_builder.add_source(config_source);
59 }
60 let config = config_builder.build()?;
61
62 let config: UnresolvedCUWorkerConfig = config.try_deserialize()?;
63 config.resolve()
64}