1
0
Fork 0
mirror of https://codeberg.org/icewind/vbsp.git synced 2026-06-03 10:44:07 +02:00

introduce Negated entity prop

This commit is contained in:
Quaternions 2025-02-24 14:06:48 -08:00
commit 2e67f2f60e
2 changed files with 60 additions and 2 deletions

View file

@ -274,6 +274,64 @@ impl<'de> Deserialize<'de> for LightColor {
}
}
#[derive(Debug, Clone)]
pub enum Negated {
Yes,
No,
MatchingCriteria,
}
pub struct NegatedParseErr;
impl FromStr for Negated {
type Err = NegatedParseErr;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"1" => Ok(Negated::Yes),
"0" => Ok(Negated::No),
"allow entities that match criteria" => Ok(Negated::MatchingCriteria),
_ => Err(NegatedParseErr),
}
}
}
impl FromStrProp for Negated {}
struct NegatedVisitor;
impl serde::de::Visitor<'_> for NegatedVisitor {
type Value = Negated;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "Negated value")
}
fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
where
E: Error,
{
match v {
0 => Ok(Negated::No),
1 => Ok(Negated::Yes),
_ => Err(E::invalid_value(Unexpected::Signed(v), &"0 or 1")),
}
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: Error,
{
v.parse()
.map_err(|_| E::invalid_value(Unexpected::Str(v), &"Negated"))
}
}
impl<'de> Deserialize<'de> for Negated {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_any(NegatedVisitor)
}
}
struct BoolVisitor;
impl serde::de::Visitor<'_> for BoolVisitor {
type Value = bool;

View file

@ -1,5 +1,5 @@
use crate::deserialize_bool;
use crate::{Angles, Color, LightColor, Vector};
use crate::{Angles, Color, LightColor, Negated, Vector};
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
@ -347,7 +347,7 @@ pub struct FilterActivatorTeam<'a> {
#[serde(rename = "targetname", default)]
pub target_name: Option<&'a str>,
#[serde(rename = "negated", default)]
pub negated: Option<&'a str>,
pub negated: Option<Negated>,
#[serde(rename = "teamnum", default)]
pub team: u8,
}