use crate::restart::RestartPolicy;
use serde::{Deserialize, Serialize};
use dashmap::DashMap;
use rkyv::{Archive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
use std::sync::Arc;
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Serialize,
Deserialize,
Archive,
RkyvSerialize,
RkyvDeserialize,
)]
#[rkyv(derive(Debug))]
pub enum ChildExitReason {
Normal,
Abnormal,
Shutdown,
}
pub type ChildId = String;
#[derive(Debug, Clone)]
pub struct ChildInfo {
pub id: ChildId,
pub child_type: ChildType,
pub restart_policy: Option<RestartPolicy>,
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Serialize,
Deserialize,
Archive,
RkyvSerialize,
RkyvDeserialize,
)]
#[rkyv(derive(Debug))]
pub enum ChildType {
Worker,
Supervisor,
}
#[derive(Clone, Debug)]
pub struct WorkerContext {
store: Arc<DashMap<String, serde_json::Value>>,
}
impl WorkerContext {
#[must_use]
pub fn new() -> Self {
Self {
store: Arc::new(DashMap::new()),
}
}
#[inline]
#[must_use]
pub fn get(&self, key: &str) -> Option<serde_json::Value> {
self.store.get(key).map(|entry| entry.value().clone())
}
#[inline]
pub fn with_value<F, R>(&self, key: &str, f: F) -> R
where
F: FnOnce(Option<&serde_json::Value>) -> R,
{
match self.store.get(key) {
Some(entry) => f(Some(entry.value())),
None => f(None),
}
}
#[inline]
pub fn set(&self, key: impl Into<String>, value: serde_json::Value) {
self.store.insert(key.into(), value);
}
#[inline]
#[must_use]
pub fn delete(&self, key: &str) -> Option<serde_json::Value> {
self.store.remove(key).map(|(_, v)| v)
}
#[inline]
#[must_use]
pub fn len(&self) -> usize {
self.store.len()
}
#[inline]
#[must_use]
pub fn is_empty(&self) -> bool {
self.store.is_empty()
}
#[inline]
#[must_use]
pub fn contains_key(&self, key: &str) -> bool {
self.store.contains_key(key)
}
pub fn update<F>(&self, key: &str, f: F)
where
F: FnOnce(Option<serde_json::Value>) -> Option<serde_json::Value>,
{
match self.store.entry(key.to_owned()) {
dashmap::mapref::entry::Entry::Occupied(mut entry) => {
let old_value = entry.get().clone();
match f(Some(old_value)) {
Some(new_value) => {
entry.insert(new_value);
}
None => {
entry.remove();
}
}
}
dashmap::mapref::entry::Entry::Vacant(entry) => {
if let Some(new_value) = f(None) {
entry.insert(new_value);
}
}
}
}
}
impl Default for WorkerContext {
fn default() -> Self {
Self::new()
}
}
#[allow(dead_code)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Pid(pub u64);
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub enum ExitReason {
Normal,
Killed,
Error(String),
}