radiate_expr/expression/
named.rs1#[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}