aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorrtkay123 <dev@kanjala.com>2025-08-16 10:24:31 +0200
committerrtkay123 <dev@kanjala.com>2025-08-16 10:24:31 +0200
commit79ca2c219be8e5ae833b4b6c8641d09bd695fada (patch)
treed0e4b224e36e2ff8da9de406a385a6b2c5689964 /lib
parenteb59714648bbba66e77955c8bda1c99caf1cede6 (diff)
downloadwarden-79ca2c219be8e5ae833b4b6c8641d09bd695fada.tar.bz2
warden-79ca2c219be8e5ae833b4b6c8641d09bd695fada.zip
fix(config): expression serialisation
Diffstat (limited to 'lib')
-rw-r--r--lib/warden-core/build.rs4
-rw-r--r--lib/warden-core/src/configuration/conv.rs49
2 files changed, 52 insertions, 1 deletions
diff --git a/lib/warden-core/build.rs b/lib/warden-core/build.rs
index c7dca0b..9d8747f 100644
--- a/lib/warden-core/build.rs
+++ b/lib/warden-core/build.rs
@@ -134,6 +134,10 @@ fn add_serde(config: tonic_prost_build::Builder) -> tonic_prost_build::Builder {
.type_attribute(
".google.protobuf.Value",
"#[serde(try_from = \"serde_json::Value\")] #[serde(into = \"crate::configuration::conv::GenericParameter\")]",
+ )
+ .field_attribute(
+ ".configuration.typology.Expression.operator",
+ "#[serde(with = \"crate::configuration::conv::operator_serde\")]",
);
config
diff --git a/lib/warden-core/src/configuration/conv.rs b/lib/warden-core/src/configuration/conv.rs
index 02f0d27..fe4acf3 100644
--- a/lib/warden-core/src/configuration/conv.rs
+++ b/lib/warden-core/src/configuration/conv.rs
@@ -1,4 +1,4 @@
-use crate::google::protobuf::{ListValue, NullValue, Struct, Value, value};
+use crate::{configuration::typology::Operator, google::protobuf::{value, ListValue, NullValue, Struct, Value}};
#[derive(Debug)]
/// Generic JSON value
@@ -107,3 +107,50 @@ impl serde::Serialize for GenericParameter {
json.serialize(serializer)
}
}
+
+pub(crate) mod operator_serde {
+ use serde::{self, Deserialize, Deserializer, Serializer};
+ use super::Operator;
+
+ pub fn serialize<S>(operator: &i32, s: S) -> Result<S::Ok, S::Error>
+ where
+ S: Serializer,
+ {
+ let operator = Operator::try_from(*operator);
+ if let Ok(d) = operator {
+ return s.serialize_str(d.as_str_name());
+ }
+ s.serialize_none()
+ }
+
+ pub fn deserialize<'de, D>(deserializer: D) -> Result<i32, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ let s: Option<String> = Option::deserialize(deserializer)?;
+
+ if let Some(s) = s {
+ let op = Operator::from_str_name(&s)
+ .ok_or_else(|| serde::de::Error::custom("unsupported"))?
+ as i32;
+ return Ok(op);
+ }
+
+ Err(serde::de::Error::custom("deserialise error for operator"))
+ }
+}
+
+impl From<Operator> for String {
+ fn from(value: Operator) -> Self {
+ value.as_str_name().to_owned()
+ }
+}
+
+impl TryFrom<String> for Operator {
+ type Error = String;
+
+ fn try_from(value: String) -> Result<Self, Self::Error> {
+ let value = value.to_uppercase();
+ Operator::from_str_name(&value).ok_or_else(|| format!("unsupported operator: {}", value))
+ }
+}