reinhardt_grpc/
settings.rs1#![allow(deprecated)] use crate::server::GrpcServerConfig;
14use reinhardt_core::macros::settings;
15use serde::{Deserialize, Serialize};
16
17const DEFAULT_MAX_DECODING_MESSAGE_SIZE: usize = 4 * 1024 * 1024;
19
20const DEFAULT_MAX_ENCODING_MESSAGE_SIZE: usize = 4 * 1024 * 1024;
22
23const DEFAULT_REQUEST_TIMEOUT_SECS: u64 = 30;
25
26const DEFAULT_MAX_CONCURRENT_CONNECTIONS: usize = 1000;
28
29fn default_max_decoding_message_size() -> usize {
30 DEFAULT_MAX_DECODING_MESSAGE_SIZE
31}
32
33fn default_max_encoding_message_size() -> usize {
34 DEFAULT_MAX_ENCODING_MESSAGE_SIZE
35}
36
37fn default_request_timeout_secs() -> u64 {
38 DEFAULT_REQUEST_TIMEOUT_SECS
39}
40
41fn default_max_concurrent_connections() -> usize {
42 DEFAULT_MAX_CONCURRENT_CONNECTIONS
43}
44
45#[settings(fragment = true, section = "grpc_server")]
68#[derive(Clone, Debug, Serialize, Deserialize)]
69pub struct GrpcServerSettings {
70 #[serde(default = "default_max_decoding_message_size")]
72 pub max_decoding_message_size: usize,
73 #[serde(default = "default_max_encoding_message_size")]
75 pub max_encoding_message_size: usize,
76 #[serde(default = "default_request_timeout_secs")]
78 pub request_timeout_secs: u64,
79 #[serde(default = "default_max_concurrent_connections")]
81 pub max_concurrent_connections: usize,
82}
83
84impl Default for GrpcServerSettings {
85 fn default() -> Self {
86 Self {
87 max_decoding_message_size: DEFAULT_MAX_DECODING_MESSAGE_SIZE,
88 max_encoding_message_size: DEFAULT_MAX_ENCODING_MESSAGE_SIZE,
89 request_timeout_secs: DEFAULT_REQUEST_TIMEOUT_SECS,
90 max_concurrent_connections: DEFAULT_MAX_CONCURRENT_CONNECTIONS,
91 }
92 }
93}
94
95impl From<&GrpcServerSettings> for GrpcServerConfig {
96 fn from(settings: &GrpcServerSettings) -> Self {
97 GrpcServerConfig::builder()
99 .max_decoding_message_size(settings.max_decoding_message_size)
100 .max_encoding_message_size(settings.max_encoding_message_size)
101 .request_timeout(std::time::Duration::from_secs(
102 settings.request_timeout_secs,
103 ))
104 .max_concurrent_connections(settings.max_concurrent_connections)
105 .build()
106 }
107}
108
109pub fn create_grpc_server_config_from_settings(settings: &GrpcServerSettings) -> GrpcServerConfig {
114 GrpcServerConfig::from(settings)
115}
116
117#[cfg(test)]
118mod tests {
119 use super::*;
120 use std::time::Duration;
121
122 #[test]
123 fn default_settings_match_config_defaults() {
124 let settings = GrpcServerSettings::default();
126 let config = GrpcServerConfig::from(&settings);
127 let default_config = GrpcServerConfig::default();
128
129 assert_eq!(
131 config.max_decoding_message_size(),
132 default_config.max_decoding_message_size()
133 );
134 assert_eq!(
135 config.max_encoding_message_size(),
136 default_config.max_encoding_message_size()
137 );
138 assert_eq!(config.request_timeout(), default_config.request_timeout());
139 assert_eq!(
140 config.max_concurrent_connections(),
141 default_config.max_concurrent_connections()
142 );
143 }
144
145 #[test]
146 fn custom_settings_convert_to_config() {
147 let settings = GrpcServerSettings {
149 max_decoding_message_size: 8 * 1024 * 1024,
150 max_encoding_message_size: 16 * 1024 * 1024,
151 request_timeout_secs: 60,
152 max_concurrent_connections: 500,
153 };
154
155 let config = create_grpc_server_config_from_settings(&settings);
157
158 assert_eq!(config.max_decoding_message_size(), 8 * 1024 * 1024);
160 assert_eq!(config.max_encoding_message_size(), 16 * 1024 * 1024);
161 assert_eq!(config.request_timeout(), Duration::from_secs(60));
162 assert_eq!(config.max_concurrent_connections(), 500);
163 }
164
165 #[test]
166 fn settings_deserialize_from_toml_with_partial_fields() {
167 let settings: GrpcServerSettings = toml::from_str(
169 r#"
170 max_decoding_message_size = 2097152
171 "#,
172 )
173 .expect("settings should deserialize");
174
175 assert_eq!(settings.max_decoding_message_size, 2 * 1024 * 1024);
177 assert_eq!(
178 settings.max_encoding_message_size,
179 DEFAULT_MAX_ENCODING_MESSAGE_SIZE
180 );
181 assert_eq!(settings.request_timeout_secs, DEFAULT_REQUEST_TIMEOUT_SECS);
182 assert_eq!(
183 settings.max_concurrent_connections,
184 DEFAULT_MAX_CONCURRENT_CONNECTIONS
185 );
186 }
187}