minecraft-command-types 0.1.0

Provides an AST like structure for Minecraft commands.
Documentation
use minecraft_command_types::datapack::pack::Pack;
use minecraft_command_types::datapack::pack::format::Format;
use minecraft_command_types::datapack::tag::{Tag, TagType, TagValue};
use minecraft_command_types::datapack::{Datapack, FilePathNode, Namespace, PackMCMeta};
use minecraft_command_types::resource_location::ResourceLocation;

fn main() {
    use std::collections::BTreeMap;
    use std::path::Path;

    let pack_meta = PackMCMeta {
        pack: Pack {
            description: serde_json::json!("A datapack written with Rust!"),
            pack_format: Some(15),
            supported_formats: Some(Format::Array(15, 20)),
            min_format: None,
            max_format: None,
        },
        features: None,
        filter: None,
        overlays: None,
        language: None,
    };

    let mut my_namespace = Namespace::default();

    my_namespace.functions.push(FilePathNode::File(
        "main".to_string(),
        "say Datapack loaded!".to_string(),
    ));

    my_namespace.functions.push(FilePathNode::Directory(
        "utils".to_string(),
        vec![FilePathNode::File(
            "teleport".to_string(),
            "tp @s ~ ~10 ~".to_string(),
        )],
    ));

    let mut block_tags = BTreeMap::new();
    block_tags.insert(
        TagType::Block,
        vec![FilePathNode::File(
            "cool_blocks".to_string(),
            Tag {
                replace: Some(false),
                values: vec![
                    TagValue::ResourceLocation(ResourceLocation::new_namespace_path(
                        "minecraft",
                        "diamond_block",
                    )),
                    TagValue::ResourceLocation(ResourceLocation::new_namespace_path(
                        "minecraft",
                        "emerald_block",
                    )),
                ],
            },
        )],
    );
    my_namespace.tags = block_tags;

    let mut namespaces = BTreeMap::new();
    namespaces.insert("mydp".to_string(), my_namespace);

    let my_datapack = Datapack {
        pack: pack_meta,
        namespaces,
    };

    let output_path = Path::new("my_awesome_datapack");
    if let Err(e) = my_datapack.write(output_path) {
        eprintln!("Failed to write datapack: {}", e);
    }
}