(
context: &mut ReadContext,
ref_mode: RefMode,
read_type_info: bool,
typeinfo: Option<Rc<TypeInfo>>,
)
| 151 | } |
| 152 | |
| 153 | fn read_rc<T: Serializer + ForyDefault + 'static>( |
| 154 | context: &mut ReadContext, |
| 155 | ref_mode: RefMode, |
| 156 | read_type_info: bool, |
| 157 | typeinfo: Option<Rc<TypeInfo>>, |
| 158 | ) -> Result<Rc<T>, Error> { |
| 159 | match ref_mode { |
| 160 | RefMode::None => { |
| 161 | // No ref flag - read inner directly |
| 162 | let inner = read_rc_inner::<T>(context, read_type_info, typeinfo)?; |
| 163 | Ok(Rc::new(inner)) |
| 164 | } |
| 165 | RefMode::NullOnly => { |
| 166 | // Read NotNullValue flag (Null not allowed for Rc) |
| 167 | let ref_flag = context.reader.read_i8()?; |
| 168 | if ref_flag == RefFlag::Null as i8 { |
| 169 | return Err(Error::invalid_ref("Rc cannot be null")); |
| 170 | } |
| 171 | let inner = read_rc_inner::<T>(context, read_type_info, typeinfo)?; |
| 172 | Ok(Rc::new(inner)) |
| 173 | } |
| 174 | RefMode::Tracking => { |
| 175 | // Full ref tracking |
| 176 | let ref_flag = context.ref_reader.read_ref_flag(&mut context.reader)?; |
| 177 | match ref_flag { |
| 178 | RefFlag::Null => Err(Error::invalid_ref("Rc cannot be null")), |
| 179 | RefFlag::Ref => { |
| 180 | let ref_id = context.ref_reader.read_ref_id(&mut context.reader)?; |
| 181 | context.ref_reader.get_rc_ref::<T>(ref_id).ok_or_else(|| { |
| 182 | Error::invalid_ref(format!("Rc reference {ref_id} not found")) |
| 183 | }) |
| 184 | } |
| 185 | RefFlag::NotNullValue => { |
| 186 | let inner = read_rc_inner::<T>(context, read_type_info, typeinfo)?; |
| 187 | Ok(Rc::new(inner)) |
| 188 | } |
| 189 | RefFlag::RefValue => { |
| 190 | let ref_id = context.ref_reader.reserve_ref_id(); |
| 191 | let inner = read_rc_inner::<T>(context, read_type_info, typeinfo)?; |
| 192 | let rc = Rc::new(inner); |
| 193 | context.ref_reader.store_rc_ref_at(ref_id, rc.clone()); |
| 194 | Ok(rc) |
| 195 | } |
| 196 | } |
| 197 | } |
| 198 | } |
| 199 | } |
| 200 | |
| 201 | fn read_rc_inner<T: Serializer + ForyDefault + 'static>( |
| 202 | context: &mut ReadContext, |
no test coverage detected