use crate::planning::{RequestPlan, RequestPlanSource};
pub(crate) fn render_request_plan<FName, FAssign, FConstruct, FResource, FParam>(
plan: &RequestPlan,
member_name: FName,
render_assignment: FAssign,
render_construct: FConstruct,
render_resource_field_source: FResource,
render_method_param_source: FParam,
) -> String
where
FName: Fn(&str) -> String + Copy,
FAssign: Fn(String, String) -> String + Copy,
FConstruct: Fn(&str, Vec<String>) -> String + Copy,
FResource: Fn(&str) -> String + Copy,
FParam: Fn(&str) -> String + Copy,
{
match plan {
RequestPlan::Source(RequestPlanSource::ResourceField(name)) => {
render_resource_field_source(name)
}
RequestPlan::Source(RequestPlanSource::MethodParam(name)) => {
render_method_param_source(name)
}
RequestPlan::Construct {
message_name,
fields,
} => {
let rendered_fields = fields
.iter()
.map(|field| {
render_assignment(
member_name(&field.field_name),
render_request_plan(
&field.value,
member_name,
render_assignment,
render_construct,
render_resource_field_source,
render_method_param_source,
),
)
})
.collect();
render_construct(message_name, rendered_fields)
}
}
}