minecraft-command-types 0.1.0

Provides an AST like structure for Minecraft commands.
Documentation
use crate::entity_selector::EntitySelector;
use crate::resource_location::ResourceLocation;
use minecraft_command_types_derive::HasMacro;
use std::fmt::{Display, Formatter};

#[derive(Debug, Clone, Eq, PartialEq, Hash, HasMacro)]
pub enum EffectDuration {
    Duration(i32),
    Infinite,
}

impl Display for EffectDuration {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        match self {
            EffectDuration::Duration(duration) => duration.fmt(f),
            EffectDuration::Infinite => f.write_str("infinite"),
        }
    }
}

#[derive(Debug, Clone, Eq, PartialEq, Hash, HasMacro)]
pub enum EffectCommand {
    Clear(Option<EntitySelector>, Option<ResourceLocation>),
    Give(
        EntitySelector,
        ResourceLocation,
        Option<EffectDuration>,
        Option<i32>,
        Option<bool>,
    ),
}

impl Display for EffectCommand {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        match self {
            EffectCommand::Clear(selector, effect) => {
                f.write_str("clear")?;

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

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

                Ok(())
            }
            EffectCommand::Give(selector, effect, duration, amplifier, hide_particles) => {
                write!(f, "give {} {}", selector, effect)?;

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

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

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

                Ok(())
            }
        }
    }
}