use crate::core::ir::TypeRef;
pub(crate) fn sanitized_vec_field_to_core_expr(name: &str, ty: &TypeRef) -> String {
if let TypeRef::Vec(outer_inner) = ty {
if let TypeRef::Vec(inner) = outer_inner.as_ref() {
if matches!(inner.as_ref(), TypeRef::String) {
return format!(
"{name}.iter().filter_map(|inner| {{ let mut it = inner.iter().cloned(); Some((it.next()?, it.next()?)) }}).collect()"
);
}
}
}
format!("{name}.iter().filter_map(|s| serde_json::from_str(s).ok()).collect()")
}
pub(crate) fn sanitized_map_field_to_core_expr(access: &str, ty: &TypeRef) -> Option<String> {
if let TypeRef::Map(k, v) = ty {
if matches!(k.as_ref(), TypeRef::String) && matches!(v.as_ref(), TypeRef::String) {
return Some(format!(
"{access}.into_iter().map(|(k, v)| (k.into(), v.into())).collect()"
));
}
}
None
}
pub(crate) fn sanitized_field_to_binding_expr(access: &str, ty: &TypeRef) -> Option<String> {
if let TypeRef::Vec(outer_inner) = ty {
if let TypeRef::Vec(inner) = outer_inner.as_ref() {
if matches!(inner.as_ref(), TypeRef::String) {
return Some(format!(
"{access}.iter().map(|(a, b)| vec![a.to_string(), b.to_string()]).collect::<Vec<Vec<String>>>()"
));
}
}
}
if let TypeRef::Map(k, v) = ty {
if matches!(k.as_ref(), TypeRef::String) && matches!(v.as_ref(), TypeRef::String) {
return Some(format!(
"{access}.into_iter().map(|(k, v)| (k.to_string(), v.to_string())).collect()"
));
}
}
None
}