trino_rust_client/types/
option.rs1use 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 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}