drasi_core/evaluation/variable_value/
ser.rs

1// Copyright 2024 The Drasi Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use super::VariableValue;
16use serde::ser::{Serialize, Serializer};
17
18impl Serialize for VariableValue {
19    #[inline]
20    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
21    where
22        S: Serializer,
23    {
24        match self {
25            VariableValue::Null => serializer.serialize_unit(),
26            VariableValue::Bool(v) => serializer.serialize_bool(*v),
27            VariableValue::Integer(v) => serializer.serialize_i64(match v.as_i64() {
28                Some(v) => v,
29                None => return Err(serde::ser::Error::custom("Integer overflow")),
30            }),
31            VariableValue::Float(v) => serializer.serialize_f64(match v.as_f64() {
32                Some(v) => v,
33                None => return Err(serde::ser::Error::custom("Float overflow")),
34            }),
35            VariableValue::String(s) => serializer.serialize_str(s),
36            VariableValue::List(v) => v.serialize(serializer),
37            VariableValue::Object(m) => {
38                use serde::ser::SerializeMap;
39                let mut map = serializer.serialize_map(Some(m.len()))?;
40                for (k, v) in m {
41                    let _ = map.serialize_entry(k, v);
42                }
43                map.end()
44            }
45            VariableValue::Date(v) => v.serialize(serializer),
46            VariableValue::LocalTime(v) => v.serialize(serializer),
47            VariableValue::ZonedTime(_v) => todo!(),
48            VariableValue::LocalDateTime(v) => v.serialize(serializer),
49            VariableValue::ZonedDateTime(v) => v.serialize(serializer),
50            VariableValue::Duration(_v) => todo!(),
51            VariableValue::Expression(_v) => todo!(),
52            VariableValue::ListRange(_v) => todo!(),
53            VariableValue::Element(_) => todo!(),
54            VariableValue::ElementMetadata(_m) => todo!(),
55            VariableValue::ElementReference(_) => todo!(),
56            VariableValue::Awaiting => todo!(),
57        }
58    }
59}