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,
}
})
}
}