From 8fb2611bf9cf067094d17b736ef490c85346091a Mon Sep 17 00:00:00 2001 From: LukaOber Date: Sat, 14 Dec 2024 09:54:36 +0100 Subject: [PATCH] add serialize and deserialize to step --- charming/src/element/step.rs | 74 ++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/charming/src/element/step.rs b/charming/src/element/step.rs index e83aace..836fa5d 100644 --- a/charming/src/element/step.rs +++ b/charming/src/element/step.rs @@ -1,9 +1,77 @@ -use serde::Serialize; +use serde::{de::Visitor, Deserialize, Serialize}; -#[derive(Serialize, Debug, PartialEq, PartialOrd, Clone)] -#[serde(rename_all = "snake_case")] +#[derive(Debug, PartialEq, PartialOrd, Clone)] pub enum Step { + True, + False, Start, Middle, End, } + +impl From for Step { + fn from(value: bool) -> Self { + if value { + Step::True + } else { + Step::False + } + } +} + +impl Serialize for Step { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + match self { + Step::True => serializer.serialize_bool(true), + Step::False => serializer.serialize_bool(false), + Step::Start => serializer.serialize_str("start"), + Step::Middle => serializer.serialize_str("middle"), + Step::End => serializer.serialize_str("end"), + } + } +} + +impl<'de> Deserialize<'de> for Step { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + struct StepVisitor; + + impl Visitor<'_> for StepVisitor { + type Value = Step; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str( + "a boolean or a string containing either \"start\", \"middle\" or \"end\"", + ) + } + + fn visit_bool(self, v: bool) -> Result + where + E: serde::de::Error, + { + match v { + true => Ok(Step::True), + false => Ok(Step::False), + } + } + + fn visit_str(self, v: &str) -> Result + where + E: serde::de::Error, + { + match v { + "start" => Ok(Step::Start), + "middle" => Ok(Step::Middle), + "end" => Ok(Step::End), + _ => Err(E::custom("unable to parse step type, invalid string")), + } + } + } + deserializer.deserialize_any(StepVisitor) + } +}