| 73 | |
| 74 | #[inline(always)] |
| 75 | pub fn read<T: Serializer + ForyDefault>( |
| 76 | context: &mut ReadContext, |
| 77 | ref_mode: RefMode, |
| 78 | read_type_info: bool, |
| 79 | ) -> Result<T, Error> { |
| 80 | let ref_flag = if ref_mode != RefMode::None { |
| 81 | context.reader.read_i8()? |
| 82 | } else { |
| 83 | RefFlag::NotNullValue as i8 |
| 84 | }; |
| 85 | if ref_flag == RefFlag::Null as i8 { |
| 86 | Ok(T::fory_default()) |
| 87 | } else if ref_flag == (RefFlag::NotNullValue as i8) || ref_flag == (RefFlag::RefValue as i8) { |
| 88 | if read_type_info { |
| 89 | T::fory_read_type_info(context)?; |
| 90 | } |
| 91 | T::fory_read_data(context) |
| 92 | } else if ref_flag == (RefFlag::Ref as i8) { |
| 93 | Err(Error::invalid_ref("Invalid ref, enum type is not a ref")) |
| 94 | } else { |
| 95 | Err(Error::invalid_data(format!( |
| 96 | "Unknown ref flag: {}", |
| 97 | ref_flag |
| 98 | ))) |
| 99 | } |
| 100 | } |
| 101 | |
| 102 | #[inline(always)] |
| 103 | pub fn read_type_info<T: Serializer>(context: &mut ReadContext) -> Result<(), Error> { |