violet_crystal 0.1.1

Rust-powered addon development framework for Minecraft Bedrock
Documentation
use askama::Template;
use crate::block::Block;
use crate::vio::Identifier;

pub trait BlockState {
    fn serialize(&self) -> String;
}

pub struct BoolBlockState<'a> {
    pub id: Identifier<'a>
}

#[derive(Template)]
#[template(path = "block_serialization/state/bool_state.json.jinja2", escape = "none")]
struct BoolBlockStateTemplate {
    identifier: String,
}

impl BlockState for BoolBlockState<'_> {
    fn serialize(&self) -> String {
        BoolBlockStateTemplate {
            identifier: self.id.render().to_string()
        }.render().unwrap()
    }
}

pub struct NumericBlockState<'a> {
    pub id: Identifier<'a>,
    pub values: Vec<i32>
}

#[derive(Template)]
#[template(path = "block_serialization/state/numeric_state.json.jinja2", escape = "none")]
struct VariableBlockStateTemplate {
    identifier: String,
    values: String
}

impl BlockState for NumericBlockState<'_> {
    fn serialize(&self) -> String {
        VariableBlockStateTemplate {
            identifier: self.id.render().to_string(),
            values: format!("{:?}", self.values)
        }.render().unwrap()
    }
}

pub struct StringBlockState<'a> {
    pub id: Identifier<'a>,
    pub values: Vec<&'a str>
}

impl BlockState for StringBlockState<'_> {
    fn serialize(&self) -> String {
        VariableBlockStateTemplate {
            identifier: self.id.render().to_string(),
            values: format!("{:?}", self.values)
        }.render().unwrap()
    }
}

pub struct RangedBlockState<'a> {
    pub id: Identifier<'a>,
    pub min: i32,
    pub max: i32
}

#[derive(Template)]
#[template(path = "block_serialization/state/ranged_state.json.jinja2", escape = "none")]
struct RangedBlockStateTemplate {
    identifier: String,
    min: i32,
    max: i32
}

impl BlockState for RangedBlockState<'_> {
    fn serialize(&self) -> String {
        RangedBlockStateTemplate {
            identifier: self.id.render().to_string(),
            min: self.min,
            max: self.max
        }.render().unwrap()
    }
}