Skip to content

Commit

Permalink
refactor: Add an attribute to ProtobufField to capture additional val…
Browse files Browse the repository at this point in the history
…ues from repeated fields #73
  • Loading branch information
rholshausen committed Nov 11, 2024
1 parent c51337d commit 47aa5c7
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 1 deletion.
14 changes: 14 additions & 0 deletions src/dynamic_message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,7 @@ mod tests {
field_name: "one".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Integer64(100),
additional_data: vec![],
descriptor: Default::default()
};
let descriptors = FileDescriptorSet {
Expand All @@ -474,6 +475,7 @@ mod tests {
field_name: "one".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Integer64(100),
additional_data: vec![],
descriptor: Default::default()
};
let descriptors = FileDescriptorSet {
Expand Down Expand Up @@ -534,13 +536,15 @@ mod tests {
field_name: "two".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Integer64(100),
additional_data: vec![],
descriptor: child_proto_1.clone()
};
let child_field2 = ProtobufField {
field_num: 2,
field_name: "three".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Integer64(200),
additional_data: vec![],
descriptor: child_proto_2.clone()
};
let descriptors = FileDescriptorSet {
Expand All @@ -555,6 +559,7 @@ mod tests {
field_name: "one".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::Message(buffer.to_vec(), child_descriptor),
additional_data: vec![],
descriptor: child_proto_1.clone()
};
let fields = vec![ field.clone() ];
Expand Down Expand Up @@ -586,6 +591,7 @@ mod tests {
field_name: "one".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Integer64(100),
additional_data: vec![],
descriptor: Default::default()
};
let descriptors = FileDescriptorSet {
Expand All @@ -608,6 +614,7 @@ mod tests {
field_name: "one".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Integer64(100),
additional_data: vec![],
descriptor: Default::default()
};
let descriptors = FileDescriptorSet {
Expand Down Expand Up @@ -651,13 +658,15 @@ mod tests {
field_name: "two".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Integer64(100),
additional_data: vec![],
descriptor: child_proto_1.clone()
};
let child_field2 = ProtobufField {
field_num: 2,
field_name: "three".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Integer64(200),
additional_data: vec![],
descriptor: child_proto_2.clone()
};
let descriptors = FileDescriptorSet {
Expand All @@ -671,6 +680,7 @@ mod tests {
field_name: "one".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::Message(buffer.to_vec(), child_descriptor),
additional_data: vec![],
descriptor: child_proto_1.clone()
};
let fields = vec![ field.clone() ];
Expand All @@ -696,6 +706,7 @@ mod tests {
field_name: "one".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Integer64(100),
additional_data: vec![],
descriptor: field_descriptor.clone()
};
let descriptors = FileDescriptorSet {
Expand All @@ -714,6 +725,7 @@ mod tests {
expect!(message.apply_generators(Some(&generators), &GeneratorTestMode::Provider, &context)).to(be_ok());
expect!(message.proto_fields().len()).to(be_equal_to(4));
expect!(message.proto_fields()[0].data.as_i64().unwrap()).to(be_equal_to(1));
expect!(message.proto_fields()[2].data.as_i64().unwrap()).to(be_equal_to(3));
}

#[test]
Expand All @@ -727,6 +739,7 @@ mod tests {
field_name: "one".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Integer64(100),
additional_data: vec![],
descriptor: field_descriptor.clone()
};
let descriptors = FileDescriptorSet {
Expand Down Expand Up @@ -759,6 +772,7 @@ mod tests {
field_name: "one".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Integer64(100),
additional_data: vec![],
descriptor: field_descriptor.clone()
};
let descriptors = FileDescriptorSet {
Expand Down
18 changes: 18 additions & 0 deletions src/matching.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1047,6 +1047,7 @@ mod tests {
field_name: "catalogue".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::Message(vec![8, 0, 18, 4, 116, 101, 115, 116], descriptor.clone()),
additional_data: vec![],
descriptor: catalogue_descriptor.clone()
}
];
Expand All @@ -1056,6 +1057,7 @@ mod tests {
field_name: "catalogue".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::Message(vec![18, 8, 112, 114, 111, 116, 111, 98, 117, 102, 26, 54, 10, 13, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 115, 18, 37, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 112, 114, 111, 116, 111, 98, 117, 102, 59, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 103, 114, 112, 99], descriptor.clone()),
additional_data: vec![],
descriptor: catalogue_descriptor.clone()
}
];
Expand Down Expand Up @@ -1100,6 +1102,7 @@ mod tests {
field_name: "value".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::String("00000000000000000000000000000000".to_string()),
additional_data: vec![],
descriptor: field_descriptor.clone()
}
];
Expand All @@ -1109,13 +1112,15 @@ mod tests {
field_name: "value".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::String("value1".to_string()),
additional_data: vec![],
descriptor: field_descriptor.clone()
},
ProtobufField {
field_num: 1,
field_name: "value".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::String("value2".to_string()),
additional_data: vec![],
descriptor: field_descriptor.clone()
}
];
Expand Down Expand Up @@ -1172,6 +1177,7 @@ mod tests {
field_name: "groups".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::String("*".to_string()),
additional_data: vec![],
descriptor: field_descriptor.clone()
}
];
Expand All @@ -1181,13 +1187,15 @@ mod tests {
field_name: "groups".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::String("*".to_string()),
additional_data: vec![],
descriptor: field_descriptor.clone()
},
ProtobufField {
field_num: 3,
field_name: "groups".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::String("*".to_string()),
additional_data: vec![],
descriptor: field_descriptor.clone()
}
];
Expand Down Expand Up @@ -1251,20 +1259,23 @@ mod tests {
field_name: "in".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Boolean(false),
additional_data: vec![],
descriptor: field_descriptor1.clone()
},
ProtobufField {
field_num: 2,
field_name: "e".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Enum(0, enum_descriptor),
additional_data: vec![],
descriptor: field_descriptor2.clone()
},
ProtobufField {
field_num: 3,
field_name: "s".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::String("".to_string()),
additional_data: vec![],
descriptor: field_descriptor3.clone()
}
];
Expand All @@ -1286,6 +1297,7 @@ mod tests {
field_name: "in".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Boolean(true),
additional_data: vec![],
descriptor: field_descriptor1.clone()
}
];
Expand Down Expand Up @@ -1345,13 +1357,15 @@ mod tests {
field_name: "in".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Boolean(false),
additional_data: vec![],
descriptor: field_descriptor1.clone()
},
ProtobufField {
field_num: 2,
field_name: "e".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Enum(0, enum_descriptor),
additional_data: vec![],
descriptor: field_descriptor2.clone()
}
];
Expand All @@ -1363,13 +1377,15 @@ mod tests {
field_name: "in".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Boolean(true),
additional_data: vec![],
descriptor: field_descriptor1.clone()
},
ProtobufField {
field_num: 3,
field_name: "s".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::String("".to_string()),
additional_data: vec![],
descriptor: field_descriptor3.clone()
}
];
Expand All @@ -1389,13 +1405,15 @@ mod tests {
field_name: "in".to_string(),
wire_type: WireType::Varint,
data: ProtobufFieldData::Boolean(true),
additional_data: vec![],
descriptor: field_descriptor1.clone()
},
ProtobufField {
field_num: 3,
field_name: "s".to_string(),
wire_type: WireType::LengthDelimited,
data: ProtobufFieldData::String("not empty".to_string()),
additional_data: vec![],
descriptor: field_descriptor3.clone()
}
];
Expand Down
10 changes: 9 additions & 1 deletion src/message_decoder/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ pub struct ProtobufField {
pub wire_type: WireType,
/// Field data
pub data: ProtobufFieldData,
/// Additional field data (for repeated fields)
pub additional_data: Vec<ProtobufFieldData>,
/// Descriptor for this field
pub descriptor: FieldDescriptorProto
}
Expand All @@ -41,6 +43,7 @@ impl ProtobufField {
field_name: self.field_name.clone(),
wire_type: self.wire_type,
data: self.data.default_field_value(&self.descriptor),
additional_data: vec![],
descriptor: self.descriptor.clone()
}
}
Expand All @@ -57,6 +60,7 @@ impl ProtobufField {
field_name: field_descriptor.name.clone().unwrap_or_default(),
wire_type: wire_type_for_field(field_descriptor),
data,
additional_data: vec![],
descriptor: field_descriptor.clone()
}
)
Expand Down Expand Up @@ -382,7 +386,9 @@ impl Display for ProtobufFieldData {
}
}

/// Decodes the Protobuf message using the descriptors
/// Decodes the Protobuf message using the descriptors and returns an array of ProtobufField values.
/// This will return a value for each field value in the incoming bytes in the same order, and will
/// not consolidate repeated fields.
#[tracing::instrument(ret, skip_all)]
pub fn decode_message<B>(
buffer: &mut B,
Expand Down Expand Up @@ -505,6 +511,7 @@ pub fn decode_message<B>(
field_name: field_name.to_string(),
wire_type,
data,
additional_data: vec![],
descriptor: field_descriptor.clone()
});
}
Expand Down Expand Up @@ -536,6 +543,7 @@ pub fn decode_message<B>(
field_name: "unknown".to_string(),
wire_type,
data: ProtobufFieldData::Unknown(data),
additional_data: vec![],
descriptor: Default::default()
});
}
Expand Down
5 changes: 5 additions & 0 deletions src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1525,6 +1525,7 @@ pub(crate) mod tests {
buffer.freeze().to_vec(),
field_descriptor.clone()
),
additional_data: vec![],
descriptor: Default::default()
},
ProtobufField {
Expand All @@ -1535,6 +1536,7 @@ pub(crate) mod tests {
buffer2.freeze().to_vec(),
field_descriptor.clone()
),
additional_data: vec![],
descriptor: Default::default()
},
ProtobufField {
Expand All @@ -1545,6 +1547,7 @@ pub(crate) mod tests {
buffer3.freeze().to_vec(),
field_descriptor.clone()
),
additional_data: vec![],
descriptor: Default::default()
}
];
Expand Down Expand Up @@ -1586,6 +1589,7 @@ pub(crate) mod tests {
buffer1.freeze().to_vec(),
field_descriptor.clone()
),
additional_data: vec![],
descriptor: Default::default()
}, ProtobufField {
field_num: 1,
Expand All @@ -1595,6 +1599,7 @@ pub(crate) mod tests {
buffer2.freeze().to_vec(),
field_descriptor.clone()
),
additional_data: vec![],
descriptor: Default::default()
}
];
Expand Down
5 changes: 5 additions & 0 deletions tests/basic_values_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,34 +79,39 @@ async fn basic_values_test() {
field_name: "f1".to_string(),
wire_type: Varint,
data: Boolean(true),
additional_data: vec![],
descriptor: field_descriptor1.clone()
},
ProtobufField {
field_num: 2,
field_name: "f2".to_string(),
wire_type: Varint,
data: Integer32(-1122),
additional_data: vec![],
descriptor: field_descriptor2.clone()
},
ProtobufField {
field_num: 3,
field_name: "f3".to_string(),
wire_type: Varint,
data: UInteger32(1122),
additional_data: vec![],
descriptor: field_descriptor3.clone()
},
ProtobufField {
field_num: 4,
field_name: "f4".to_string(),
wire_type: SixtyFourBit,
data: Double(1122.33),
additional_data: vec![],
descriptor: field_descriptor4.clone()
},
ProtobufField {
field_num: 5,
field_name: "f5".to_string(),
wire_type: LengthDelimited,
data: String("1122.33".to_string()),
additional_data: vec![],
descriptor: field_descriptor5.clone()
}
]));
Expand Down
Loading

0 comments on commit 47aa5c7

Please sign in to comment.