openmina_node_common/service/archive/
config.rs

1use bitflags::bitflags;
2use std::env;
3
4bitflags! {
5    #[derive(Debug, Clone, Default)]
6    pub struct ArchiveStorageOptions: u8 {
7        const ARCHIVER_PROCESS = 0b0001;
8        const LOCAL_PRECOMPUTED_STORAGE = 0b0010;
9        const GCP_PRECOMPUTED_STORAGE = 0b0100;
10        const AWS_PRECOMPUTED_STORAGE = 0b1000;
11    }
12}
13
14impl ArchiveStorageOptions {
15    pub fn is_enabled(&self) -> bool {
16        !self.is_empty()
17    }
18
19    pub fn requires_precomputed_block(&self) -> bool {
20        self.uses_aws_precomputed_storage()
21            || self.uses_gcp_precomputed_storage()
22            || self.uses_local_precomputed_storage()
23    }
24
25    pub fn validate_env_vars(&self) -> Result<(), String> {
26        if self.contains(ArchiveStorageOptions::ARCHIVER_PROCESS)
27            && env::var("OPENMINA_ARCHIVE_ADDRESS").is_err()
28        {
29            return Err(
30                "OPENMINA_ARCHIVE_ADDRESS is required when ARCHIVER_PROCESS is enabled".to_string(),
31            );
32        }
33
34        if self.uses_aws_precomputed_storage() {
35            if env::var("AWS_ACCESS_KEY_ID").is_err() {
36                return Err(
37                    "AWS_ACCESS_KEY_ID is required when AWS_PRECOMPUTED_STORAGE is enabled"
38                        .to_string(),
39                );
40            }
41            if env::var("AWS_SECRET_ACCESS_KEY").is_err() {
42                return Err(
43                    "AWS_SECRET_ACCESS_KEY is required when AWS_PRECOMPUTED_STORAGE is enabled"
44                        .to_string(),
45                );
46            }
47            if env::var("AWS_SESSION_TOKEN").is_err() {
48                return Err(
49                    "AWS_SESSION_TOKEN is required when AWS_PRECOMPUTED_STORAGE is enabled"
50                        .to_string(),
51                );
52            }
53
54            if env::var("AWS_DEFAULT_REGION").is_err() {
55                return Err(
56                    "AWS_DEFAULT_REGION is required when AWS_PRECOMPUTED_STORAGE is enabled"
57                        .to_string(),
58                );
59            }
60
61            if env::var("OPENMINA_AWS_BUCKET_NAME").is_err() {
62                return Err(
63                    "OPENMINA_AWS_BUCKET_NAME is required when AWS_PRECOMPUTED_STORAGE is enabled"
64                        .to_string(),
65                );
66            }
67
68            // if env::var("OPENMINA_AWS_BUCKET_PATH").is_err() {
69            //     return Err(
70            //         "OPENMINA_AWS_BUCKET_PATH is required when AWS_PRECOMPUTED_STORAGE is enabled"
71            //             .to_string(),
72            //     );
73            // }
74        }
75
76        if self.uses_gcp_precomputed_storage() {
77            if env::var("GCP_CREDENTIALS_JSON").is_err() {
78                return Err(
79                    "GCP_CREDENTIALS_JSON is required when GCP_PRECOMPUTED_STORAGE is enabled"
80                        .to_string(),
81                );
82            }
83
84            if env::var("GCP_BUCKET_NAME").is_err() {
85                return Err(
86                    "GCP_BUCKET_NAME is required when GCP_PRECOMPUTED_STORAGE is enabled"
87                        .to_string(),
88                );
89            }
90        }
91
92        Ok(())
93    }
94
95    pub fn uses_local_precomputed_storage(&self) -> bool {
96        self.contains(ArchiveStorageOptions::LOCAL_PRECOMPUTED_STORAGE)
97    }
98
99    pub fn uses_archiver_process(&self) -> bool {
100        self.contains(ArchiveStorageOptions::ARCHIVER_PROCESS)
101    }
102
103    pub fn uses_gcp_precomputed_storage(&self) -> bool {
104        self.contains(ArchiveStorageOptions::GCP_PRECOMPUTED_STORAGE)
105    }
106
107    pub fn uses_aws_precomputed_storage(&self) -> bool {
108        self.contains(ArchiveStorageOptions::AWS_PRECOMPUTED_STORAGE)
109    }
110}