use std::sync::atomic::{AtomicBool, AtomicI32, Ordering};
use std::time::SystemTime;
pub struct AppState {
name: String,
version: String,
commit_id: String,
processing_limit: i32,
running: AtomicBool,
processing: AtomicI32,
started_at: SystemTime,
}
impl AppState {
pub fn new(processing_limit: i32, commit_id: impl Into<String>) -> Self {
Self {
name: String::new(),
version: String::new(),
commit_id: commit_id.into(),
processing_limit,
running: AtomicBool::new(false),
processing: AtomicI32::new(0),
started_at: SystemTime::now(),
}
}
#[must_use]
pub fn with_name(mut self, name: impl Into<String>) -> Self {
self.name = name.into();
self
}
#[must_use]
pub fn with_version(mut self, version: impl Into<String>) -> Self {
self.version = version.into();
self
}
pub fn get_name(&self) -> &str {
&self.name
}
pub fn get_version(&self) -> &str {
&self.version
}
pub fn get_commit_id(&self) -> &str {
&self.commit_id
}
pub fn get_processing_limit(&self) -> i32 {
self.processing_limit
}
pub fn inc_processing(&self) -> i32 {
self.processing.fetch_add(1, Ordering::Relaxed) + 1
}
pub fn dec_processing(&self) -> i32 {
self.processing.fetch_sub(1, Ordering::Relaxed) - 1
}
pub fn get_processing(&self) -> i32 {
self.processing.load(Ordering::Relaxed)
}
pub fn is_running(&self) -> bool {
self.running.load(Ordering::Relaxed)
}
pub fn run(&self) {
self.running.store(true, Ordering::Relaxed)
}
pub fn stop(&self) {
self.running.store(false, Ordering::Relaxed)
}
pub fn get_started_at(&self) -> SystemTime {
self.started_at
}
}