Skip to main content

trino_rust_client/types/
option.rs

1use std::fmt;
2use std::marker::PhantomData;
3
4use serde::de::{self, DeserializeSeed, Deserializer, Visitor};
5
6use super::{Context, Trino, TrinoTy};
7
8impl<T: Trino> Trino for Option<T> {
9    type ValueType<'a>
10        = Option<T::ValueType<'a>>
11    where
12        T: 'a;
13    type Seed<'a, 'de> = OptionSeed<'a, T>;
14
15    fn value(&self) -> Self::ValueType<'_> {
16        self.as_ref().map(|t| t.value())
17    }
18
19    fn ty() -> TrinoTy {
20        TrinoTy::Option(Box::new(T::ty()))
21    }
22
23    fn seed<'a, 'de>(ctx: &'a Context) -> Self::Seed<'a, 'de> {
24        OptionSeed::new(ctx)
25    }
26
27    fn empty() -> Self {
28        None
29    }
30}
31
32pub struct OptionSeed<'a, T> {
33    ctx: &'a Context<'a>,
34    _marker: PhantomData<T>,
35}
36
37impl<'a, T> OptionSeed<'a, T> {
38    // caller must provide a valid `Context`
39    pub(super) fn new(ctx: &'a Context) -> Self {
40        OptionSeed {
41            ctx,
42            _marker: PhantomData,
43        }
44    }
45}
46
47impl<'de, T: Trino> Visitor<'de> for OptionSeed<'_, T> {
48    type Value = Option<T>;
49    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
50        formatter.write_str(T::ty().raw_type().to_str())
51    }
52
53    fn visit_none<E>(self) -> Result<Self::Value, E>
54    where
55        E: de::Error,
56    {
57        Ok(None)
58    }
59
60    fn visit_unit<E>(self) -> Result<Self::Value, E>
61    where
62        E: de::Error,
63    {
64        Ok(None)
65    }
66
67    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
68    where
69        D: Deserializer<'de>,
70    {
71        let seed = T::seed(self.ctx);
72        seed.deserialize(deserializer).map(Some)
73    }
74}
75
76impl<'de, T: Trino> DeserializeSeed<'de> for OptionSeed<'_, T> {
77    type Value = Option<T>;
78    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
79    where
80        D: Deserializer<'de>,
81    {
82        deserializer.deserialize_option(self)
83    }
84}