use prost_reflect::{DynamicMessage, Kind, MessageDescriptor, ReflectMessage, Value};
const TEMPLATE_VEC_LENGTH: usize = 1;
const MAX_MESSAGE_RECURSION: usize = 10;
pub(super) fn apply_template_for_message(msg: &mut DynamicMessage, recursion_depth: usize) {
if recursion_depth > MAX_MESSAGE_RECURSION {
return;
}
for field in msg.descriptor().fields() {
let kind = field.kind();
let value = msg.get_field_mut(&field);
match value {
Value::List(_) => *value = default_value_list(&kind, recursion_depth),
Value::Message(msg) => {
*value = default_value_message(&msg.descriptor(), recursion_depth);
}
Value::Map(_) => {
}
_ => *value = default_value(&kind, recursion_depth),
}
}
}
fn default_value(kind: &Kind, recursion_depth: usize) -> Value {
match kind {
Kind::String => Value::String(String::new()),
Kind::Message(desc) => default_value_message(desc, recursion_depth),
_ => Value::default_value(kind),
}
}
fn default_value_list(kind: &Kind, recursion_depth: usize) -> Value {
let default = default_value(kind, recursion_depth);
Value::List(vec![default; TEMPLATE_VEC_LENGTH])
}
fn default_value_message(desc: &MessageDescriptor, recursion_depth: usize) -> Value {
let mut msg = DynamicMessage::new(desc.clone());
apply_template_for_message(&mut msg, recursion_depth + 1);
Value::Message(msg)
}