Skip to main content

radiate_expr/expression/
named.rs

1#[cfg(feature = "serde")]
2use serde::{Deserialize, Serialize, ser::SerializeStruct};
3
4use crate::Expr;
5
6#[derive(Clone, Debug, PartialEq)]
7pub struct NamedExpr {
8    pub name: &'static str,
9    pub expr: Expr,
10}
11
12impl NamedExpr {
13    pub fn new(name: &'static str, expr: Expr) -> Self {
14        Self { name, expr }
15    }
16
17    pub fn pair(&mut self) -> (&'static str, &mut Expr) {
18        (self.name, &mut self.expr)
19    }
20
21    pub fn expr(&self) -> &Expr {
22        &self.expr
23    }
24
25    pub fn expr_mut(&mut self) -> &mut Expr {
26        &mut self.expr
27    }
28
29    pub fn name(&self) -> &'static str {
30        self.name
31    }
32}
33
34impl From<(&'static str, Expr)> for NamedExpr {
35    fn from((name, expr): (&'static str, Expr)) -> Self {
36        Self::new(name, expr)
37    }
38}
39
40#[cfg(feature = "serde")]
41impl Serialize for NamedExpr {
42    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
43    where
44        S: serde::Serializer,
45    {
46        let mut state = serializer.serialize_struct("NamedExpr", 2)?;
47        state.serialize_field("name", &self.name)?;
48        state.serialize_field("expr", &self.expr)?;
49        state.end()
50    }
51}
52
53#[cfg(feature = "serde")]
54impl<'de> Deserialize<'de> for NamedExpr {
55    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
56    where
57        D: serde::Deserializer<'de>,
58    {
59        #[derive(Deserialize)]
60        struct NamedExprData {
61            name: String,
62            expr: Expr,
63        }
64
65        let data = NamedExprData::deserialize(deserializer)?;
66        Ok(NamedExpr::new(radiate_utils::intern!(data.name), data.expr))
67    }
68}