earthmc 2.0.1

Async client for interacting with the EarthMC API
Documentation
use derive_builder::Builder;
use serde::{Deserialize, Serialize};

use crate::model::{
    location::{PositionXYZ, PositionXZ},
    named_uuid::NamedUuidOpt,
};

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct LocationInfo {
    pub location: PositionXZ,
    pub is_wilderness: bool,
    pub town: NamedUuidOpt,
    pub nation: NamedUuidOpt,
}

#[derive(Clone, Serialize, Builder)]
#[serde(transparent)]
pub struct LocationQuery {
    #[builder(default)]
    values: Vec<[f32; 2]>,
}

impl LocationQueryBuilder {
    pub fn insert(
        &mut self,
        position: PositionXZ,
    ) -> &mut LocationQueryBuilder {
        self.values
            .get_or_insert_with(Vec::new)
            .push([position.x, position.z]);
        self
    }
}

pub mod position_xyz_object {
    use serde::{Deserialize, Serialize};

    use super::PositionXYZ;

    #[derive(Deserialize, Serialize)]
    pub(crate) struct PositionXYZObject {
        pub(crate) x: i32,
        pub(crate) y: i32,
        pub(crate) z: i32,
    }

    pub fn serialize<S>(
        position: &PositionXYZ,
        serializer: S,
    ) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        PositionXYZObject {
            x: position.x,
            y: position.y,
            z: position.z,
        }
        .serialize(serializer)
    }

    pub fn deserialize<'de, D>(deserializer: D) -> Result<PositionXYZ, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        PositionXYZObject::deserialize(deserializer).map(|position| {
            PositionXYZ {
                x: position.x,
                y: position.y,
                z: position.z,
            }
        })
    }
}