tcp_server/config.rs
1//! Global configuration for this crate.
2//!
3//! You may change the configuration by calling `set_config` function.
4//!
5//! # Example
6//! ```rust
7//! use tcp_server::config::{ServerConfig, set_config};
8//!
9//! # fn main() {
10//! set_config(ServerConfig::default());
11//! # }
12//! ```
13
14use std::sync::RwLock;
15use lazy_static::lazy_static;
16
17/// Global configuration.
18///
19/// # Example
20/// ```rust
21/// use tcp_server::config::ServerConfig;
22///
23/// # fn main() {
24/// let config = ServerConfig::default();
25/// # let _ = config;
26/// # }
27/// ```
28#[derive(Debug, Clone, Eq, PartialEq)]
29#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
30pub struct ServerConfig {
31 /// `addr` is the address the server bind.
32 /// Default value is `localhost:0`.
33 ///
34 /// # Example
35 /// ```rust
36 /// use tcp_server::config::ServerConfig;
37 ///
38 /// # fn main() {
39 /// let config = ServerConfig {
40 /// addr: "localhost:0".to_string(),
41 /// ..ServerConfig::default()
42 /// };
43 /// # let _ = config;
44 /// # }
45 /// ```
46 pub addr: String,
47
48 /// `connect_sec` is the timeout of connecting from the client.
49 /// Default value is `30`.
50 ///
51 /// # Example
52 /// ```rust
53 /// use tcp_server::config::ServerConfig;
54 ///
55 /// # fn main() {
56 /// let config = ServerConfig {
57 /// connect_sec: 30,
58 /// ..ServerConfig::default()
59 /// };
60 /// # let _ = config;
61 /// # }
62 /// ```
63 pub connect_sec: u64,
64
65 /// `idle_sec` is the timeout of sending/receiving message.
66 /// Default value is `30`.
67 ///
68 /// # Example
69 /// ```rust
70 /// use tcp_server::config::ServerConfig;
71 ///
72 /// # fn main() {
73 /// let config = ServerConfig {
74 /// idle_sec: 30,
75 /// ..ServerConfig::default()
76 /// };
77 /// # let _ = config;
78 /// # }
79 /// ```
80 pub idle_sec: u64,
81}
82
83impl Default for ServerConfig {
84 fn default() -> Self {
85 Self {
86 addr: "localhost:0".to_string(),
87 connect_sec: 30,
88 idle_sec: 30,
89 }
90 }
91}
92
93lazy_static! {
94 static ref CONFIG: RwLock<ServerConfig> = RwLock::new(ServerConfig::default());
95}
96
97/// Sets the global configuration.
98///
99/// This function is recommended to only be called once during initialization.
100///
101/// # Example
102/// ```rust
103/// use tcp_server::config::{ServerConfig, set_config};
104///
105/// # fn main() {
106/// set_config(ServerConfig::default());
107/// # }
108/// ```
109#[inline]
110pub fn set_config(config: ServerConfig) {
111 let mut c = CONFIG.write().unwrap();
112 *c = config;
113}
114
115/// Gets the global configuration.
116///
117/// # Example
118/// ```rust
119/// use tcp_server::config::get_config;
120///
121/// # fn main() {
122/// let config = get_config();
123/// # let _ = config;
124/// # }
125/// ```
126#[inline]
127pub fn get_config() -> ServerConfig {
128 let c = CONFIG.read().unwrap();
129 (*c).clone()
130}
131
132/// A cheaper shortcut of
133/// ```rust,ignore
134/// get_config().addr
135/// ```
136#[inline]
137pub fn get_addr() -> String {
138 let c = CONFIG.read().unwrap();
139 (*c).addr.clone()
140}
141
142/// A cheaper shortcut of
143/// ```rust,ignore
144/// get_config().connect_sec
145/// ```
146#[inline]
147pub fn get_connect_sec() -> u64 {
148 let c = CONFIG.read().unwrap();
149 (*c).connect_sec
150}
151
152/// A cheaper shortcut of
153/// ```rust,ignore
154/// get_config().idle_sec
155/// ```
156#[inline]
157pub fn get_idle_sec() -> u64 {
158 let c = CONFIG.read().unwrap();
159 (*c).idle_sec
160}