| 27 | impl<T: Serializer + ForyDefault> Serializer for Option<T> { |
| 28 | #[inline(always)] |
| 29 | fn fory_write( |
| 30 | &self, |
| 31 | context: &mut WriteContext, |
| 32 | ref_mode: RefMode, |
| 33 | write_type_info: bool, |
| 34 | has_generics: bool, |
| 35 | ) -> Result<(), Error> { |
| 36 | match ref_mode { |
| 37 | RefMode::None => { |
| 38 | // Write inner directly, no null check |
| 39 | if let Some(v) = self { |
| 40 | T::fory_write(v, context, RefMode::None, write_type_info, has_generics) |
| 41 | } else { |
| 42 | // None with RefMode::None is a protocol error |
| 43 | Err(Error::invalid_data("Option::None with RefMode::None")) |
| 44 | } |
| 45 | } |
| 46 | RefMode::NullOnly => { |
| 47 | if let Some(v) = self { |
| 48 | context.writer.write_i8(RefFlag::NotNullValue as i8); |
| 49 | T::fory_write(v, context, RefMode::None, write_type_info, has_generics) |
| 50 | } else { |
| 51 | context.writer.write_i8(RefFlag::Null as i8); |
| 52 | Ok(()) |
| 53 | } |
| 54 | } |
| 55 | RefMode::Tracking => { |
| 56 | // Only handle null here, pass Tracking to inner for ref handling |
| 57 | if let Some(v) = self { |
| 58 | // DON'T write flag here - inner (e.g. Rc) handles RefValue/Ref flags |
| 59 | T::fory_write(v, context, RefMode::Tracking, write_type_info, has_generics) |
| 60 | } else { |
| 61 | context.writer.write_i8(RefFlag::Null as i8); |
| 62 | Ok(()) |
| 63 | } |
| 64 | } |
| 65 | } |
| 66 | } |
| 67 | |
| 68 | #[inline(always)] |
| 69 | fn fory_write_data(&self, context: &mut WriteContext) -> Result<(), Error> { |