MCPcopy Create free account
hub / github.com/apache/fory / read_rc

Function read_rc

rust/fory-core/src/serializer/rc.rs:153–199  ·  view source on GitHub ↗
(
    context: &mut ReadContext,
    ref_mode: RefMode,
    read_type_info: bool,
    typeinfo: Option<Rc<TypeInfo>>,
)

Source from the content-addressed store, hash-verified

151}
152
153fn 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
201fn read_rc_inner<T: Serializer + ForyDefault + 'static>(
202 context: &mut ReadContext,

Callers 2

fory_readMethod · 0.85

Calls 6

read_i8Method · 0.80
store_rc_ref_atMethod · 0.80
read_ref_flagMethod · 0.45
read_ref_idMethod · 0.45
reserve_ref_idMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected