soroban_env_common/
option.rs

1use crate::{Env, TryFromVal, TryIntoVal, Val};
2
3impl<E: Env, T> TryFromVal<E, Val> for Option<T>
4where
5    T: TryFromVal<E, Val>,
6{
7    type Error = T::Error;
8
9    fn try_from_val(env: &E, val: &Val) -> Result<Self, Self::Error> {
10        if val.is_void() {
11            Ok(None)
12        } else {
13            Ok(Some(T::try_from_val(env, val)?))
14        }
15    }
16}
17
18impl<E: Env, T> TryFromVal<E, Option<T>> for Val
19where
20    T: TryIntoVal<E, Val>,
21{
22    type Error = T::Error;
23
24    fn try_from_val(env: &E, v: &Option<T>) -> Result<Self, Self::Error> {
25        match v {
26            Some(t) => t.try_into_val(env),
27            None => Ok(Val::VOID.into()),
28        }
29    }
30}
31
32impl<E: Env, T> TryFromVal<E, &Option<T>> for Val
33where
34    T: TryIntoVal<E, Val>,
35{
36    type Error = T::Error;
37
38    fn try_from_val(env: &E, v: &&Option<T>) -> Result<Self, Self::Error> {
39        Self::try_from_val(env, *v)
40    }
41}