use std::path::Path;
#[derive(Clone, Default)]
pub(crate) struct ArmaCallContext {
pub(super) caller: Caller,
pub(super) source: Source,
pub(super) mission: Mission,
pub(super) server: Server,
}
impl ArmaCallContext {
pub(crate) const fn new(
caller: Caller,
source: Source,
mission: Mission,
server: Server,
) -> Self {
Self {
caller,
source,
mission,
server,
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub enum Caller {
Steam(u64),
#[default]
Unknown,
}
impl From<&str> for Caller {
fn from(s: &str) -> Self {
if s.is_empty() || s == "0" {
Self::Unknown
} else {
s.parse::<u64>().map_or(Self::Unknown, Self::Steam)
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub enum Source {
File(String),
Pbo(String),
#[default]
Console,
}
impl From<&str> for Source {
fn from(s: &str) -> Self {
if s.is_empty() {
Self::Console
} else if Path::new(s).is_absolute() {
Self::File(s.to_string())
} else {
Self::Pbo(s.to_string())
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub enum Mission {
Mission(String),
#[default]
None,
}
impl From<&str> for Mission {
fn from(s: &str) -> Self {
if s.is_empty() {
Self::None
} else {
Self::Mission(s.to_string())
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub enum Server {
Multiplayer(String),
#[default]
Singleplayer,
}
impl From<&str> for Server {
fn from(s: &str) -> Self {
if s.is_empty() {
Self::Singleplayer
} else {
Self::Multiplayer(s.to_string())
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn caller_empty() {
assert_eq!(Caller::from(""), Caller::Unknown);
}
#[test]
fn caller_zero() {
assert_eq!(Caller::from("0"), Caller::Unknown);
}
#[test]
fn source_empty() {
assert_eq!(Source::from(""), Source::Console);
}
#[test]
fn source_pbo() {
let path = "x\\ctx\\addons\\main\\fn_armaContext.sqf";
assert_eq!(Source::from(path), Source::Pbo(path.to_string()));
}
#[test]
fn source_file() {
let path = env!("CARGO_MANIFEST_DIR");
assert_eq!(Source::from(path), Source::File(path.to_string()));
}
#[test]
fn mission_empty() {
assert_eq!(Mission::from(""), Mission::None);
}
#[test]
fn server_empty() {
assert_eq!(Server::from(""), Server::Singleplayer);
}
}