fn some_func(a: Option) -> Option { if a.is_none() { return None } a } pub enum SeemsOption { Some(T), None } impl SeemsOption { pub fn is_none(&self) -> bool { match *self { SeemsOption::None => true, SeemsOption::Some(_) => false, } } } fn returns_something_similar_to_option(a: SeemsOption) -> SeemsOption { if a.is_none() { return SeemsOption::None; } a } pub struct SomeStruct { pub opt: Option, } impl SomeStruct { pub fn func(&self) -> Option { if (self.opt).is_none() { return None; } self.opt } } fn main() { some_func(Some(42)); some_func(None); let some_struct = SomeStruct { opt: Some(54) }; some_struct.func(); let so = SeemsOption::Some(45); returns_something_similar_to_option(so); }