use std::borrow::Cow;
#[cfg(test)]
use bevy_reflect::Reflect;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[cfg_attr(test, derive(Reflect))]
pub enum NamingScheme {
Full,
Short,
None,
}
impl NamingScheme {
pub fn name(&self) -> &str {
match self {
NamingScheme::Full => "Full",
NamingScheme::Short => "Short",
NamingScheme::None => "None",
}
}
pub fn tag(&self) -> String {
self.name().to_lowercase()
}
pub fn try_parse(input: &str) -> Option<Self> {
match input {
"full" | "Full" => Some(NamingScheme::Full),
"short" | "Short" => Some(NamingScheme::Short),
"none" | "None" => Some(NamingScheme::None),
_ => None,
}
}
}
impl Default for NamingScheme {
fn default() -> Self {
Self::Full
}
}
impl std::fmt::Display for NamingScheme {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.name())
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(test, derive(Reflect))]
pub enum PluginName<'s> {
Struct(Cow<'s, str>),
Function(Cow<'s, str>),
}
impl<'s> PluginName<'s> {
pub fn new_struct<S: Into<Cow<'s, str>>>(name: S) -> Self {
Self::Struct(name.into())
}
pub fn new_function<S: Into<Cow<'s, str>>>(name: S) -> Self {
Self::Function(name.into())
}
}
#[derive(Clone, Debug)]
#[cfg_attr(test, derive(Reflect))]
pub struct PluginConfig {
pub plugin_name: PluginName<'static>,
pub root_state_name: Option<Cow<'static, str>>,
pub states_module_name: Cow<'static, str>,
pub naming_scheme: NamingScheme,
pub additional_derives: Vec<Cow<'static, str>>,
}
impl PluginConfig {
const fn const_default() -> Self {
Self {
plugin_name: PluginName::Struct(Cow::Borrowed("GeneratedStatesPlugin")),
root_state_name: Some(Cow::Borrowed("GameState")),
states_module_name: Cow::Borrowed("states"),
naming_scheme: NamingScheme::Full,
additional_derives: vec![],
}
}
}
impl Default for PluginConfig {
fn default() -> Self {
Self::const_default()
}
}
impl From<NamingScheme> for PluginConfig {
fn from(naming_scheme: NamingScheme) -> Self {
Self {
naming_scheme,
..Default::default()
}
}
}
#[cfg(test)]
#[rstest::rstest]
#[case(NamingScheme::None)]
#[case(NamingScheme::Short)]
#[case(NamingScheme::Full)]
fn test_plugin_config_from_naming_scheme(#[case] naming_scheme: NamingScheme) {
let config = PluginConfig::from(naming_scheme);
assert_eq!(config.naming_scheme, naming_scheme);
}