minecraft-command-types 0.1.0

Provides an AST like structure for Minecraft commands.
Documentation
use crate::command::enums::datapack_list_type::DatapackListType;
use crate::snbt::SNBT;
use minecraft_command_types_derive::HasMacro;
use std::fmt::{Display, Formatter};

#[derive(Debug, Clone, Eq, PartialEq, Hash, HasMacro)]
pub enum DatapackLoadPriority {
    First,
    Last,
    Before(String),
    After(String),
}

impl Display for DatapackLoadPriority {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        match self {
            DatapackLoadPriority::First => f.write_str("first"),
            DatapackLoadPriority::Last => f.write_str("last"),
            DatapackLoadPriority::Before(existing) => write!(f, "before {}", existing),
            DatapackLoadPriority::After(existing) => write!(f, "after {}", existing),
        }
    }
}

#[derive(Debug, Clone, Eq, PartialEq, Hash, HasMacro)]
pub enum DatapackCommand {
    Disable(String),
    Enable(String, Option<DatapackLoadPriority>),
    List(Option<DatapackListType>),
    Create(String, SNBT),
}

impl Display for DatapackCommand {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        match self {
            DatapackCommand::Disable(name) => {
                write!(f, "disable {}", name)
            }
            DatapackCommand::Enable(name, load_priority) => {
                write!(f, "enable {}", name)?;

                if let Some(load_priority) = load_priority {
                    write!(f, " {}", load_priority)?;
                }

                Ok(())
            }
            DatapackCommand::List(list_type) => {
                f.write_str("list")?;

                if let Some(list_type) = list_type {
                    write!(f, " {}", list_type)?;
                }

                Ok(())
            }
            DatapackCommand::Create(id, description) => {
                write!(f, "create {} {}", id, description)
            }
        }
    }
}