diff --git a/crates/bft-json-crdt/bft-crdt-derive/src/lib.rs b/crates/bft-json-crdt/bft-crdt-derive/src/lib.rs index 675f1533..3810be5a 100644 --- a/crates/bft-json-crdt/bft-crdt-derive/src/lib.rs +++ b/crates/bft-json-crdt/bft-crdt-derive/src/lib.rs @@ -94,14 +94,18 @@ pub fn derive_json_crdt(input: OgTokenStream) -> OgTokenStream { Ok(#ident { path: path.clone(), id, - #(#ident_literals: obj.remove(#ident_strings) - .unwrap() - .into_node( + #(#ident_literals: if let Some(val) = obj.remove(#ident_strings) { + val.into_node( id, #crate_name::op::join_path(path.clone(), #crate_name::op::PathSegment::Field(#ident_strings.to_string())) ) .unwrap() - ),* + } else { + <#tys as #crate_name::json_crdt::CrdtNode>::new( + id, + #crate_name::op::join_path(path.clone(), #crate_name::op::PathSegment::Field(#ident_strings.to_string())) + ) + }),* }) } else { Err(format!("failed to convert {:?} -> {}", value, #ident_str.to_string()))