use std::{fmt::Display, str::FromStr};
use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Default, Serialize)]
pub enum IoMode {
#[serde(rename = "uring-direct")]
UringDirect,
#[serde(rename = "uring")]
Uring,
#[serde(rename = "uring-multi-async")]
#[cfg_attr(target_os = "linux", default)]
UringMultiAsync,
#[serde(rename = "uring-shared")]
UringShared,
#[serde(rename = "uring-blocking")]
UringBlocking,
#[cfg_attr(not(target_os = "linux"), default)]
#[serde(rename = "std-blocking")]
StdBlocking,
#[serde(rename = "tokio")]
TokioIO,
#[serde(rename = "std-spawn-blocking")]
StdSpawnBlocking,
}
impl Display for IoMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
IoMode::Uring => "uring",
IoMode::UringDirect => "uring-direct",
IoMode::UringMultiAsync => "uring-multi-async",
IoMode::UringShared => "uring-shared",
IoMode::UringBlocking => "uring-blocking",
IoMode::StdBlocking => "std-blocking",
IoMode::TokioIO => "tokio",
IoMode::StdSpawnBlocking => "std-spawn-blocking",
}
)
}
}
impl FromStr for IoMode {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"uring-direct" => IoMode::UringDirect,
"uring" => IoMode::Uring,
"uring-multi-async" => IoMode::UringMultiAsync,
"uring-shared" => IoMode::UringShared,
"uring-blocking" => IoMode::UringBlocking,
"std-blocking" => IoMode::StdBlocking,
"tokio" => IoMode::TokioIO,
"std-spawn-blocking" => IoMode::StdSpawnBlocking,
_ => return Err(format!("Invalid IO mode: {s}")),
})
}
}