pub struct FieldAssign {
pub core_field: String,
pub expr: String,
}
pub struct PrivateFieldImpl<'a> {
pub core_path: &'a str,
pub binding_name: &'a str,
pub param: &'a str,
pub has_default: bool,
pub assignments: &'a [FieldAssign],
pub allow_attrs: &'a [&'a str],
}
pub fn gen_private_field_from_impl(spec: &PrivateFieldImpl) -> String {
let statements: Vec<String> = spec
.assignments
.iter()
.map(|a| format!("__result.{} = {};", a.core_field, a.expr))
.collect();
let construct_error = if spec.has_default {
String::new()
} else {
format!(
"alef cannot generate From<{binding}> for {core}: the core type has private fields and \
does not implement Default, so it cannot be constructed from a binding value. Derive \
Default on {core} (or expose a public constructor / exclude it from this backend).",
binding = spec.binding_name,
core = spec.core_path,
)
};
crate::codegen::template_env::render(
"conversions/private_field_from_impl",
minijinja::context! {
core_path => spec.core_path,
binding_name => spec.binding_name,
param => spec.param,
allow_attrs => spec.allow_attrs,
construct_error => construct_error,
statements => statements,
},
)
}