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