use crate::prelude::*;
pub(crate) struct FieldWalkBinding {
ident: Ident,
name: String,
}
impl FieldWalkBinding {
#[must_use]
pub fn from_field(field: &Field) -> Self {
Self {
ident: field.name.clone(),
name: field.name.to_string(),
}
}
#[must_use]
pub fn member_ref_from(&self, receiver: TokenStream) -> TokenStream {
let ident = &self.ident;
quote!(&#receiver.#ident)
}
#[must_use]
pub fn member_mut_from(&self, receiver: TokenStream) -> TokenStream {
let ident = &self.ident;
quote!(&mut #receiver.#ident)
}
#[must_use]
pub fn path_segment(&self) -> TokenStream {
let name = &self.name;
quote!(::icydb_model::visitor::PathSegment::Field(#name))
}
#[must_use]
pub fn field_name(&self) -> &str {
&self.name
}
#[must_use]
pub fn visit_fn_ident(&self) -> Ident {
format_ident!("__visit_field_{}", self.ident)
}
#[must_use]
pub fn visit_mut_fn_ident(&self) -> Ident {
format_ident!("__visit_field_{}_mut", self.ident)
}
#[must_use]
pub fn normalize_fn_ident(&self) -> Ident {
format_ident!("__normalize_field_{}", self.ident)
}
#[must_use]
pub fn validate_fn_ident(&self) -> Ident {
format_ident!("__validate_field_{}", self.ident)
}
}
#[must_use]
pub(crate) fn field_walk_bindings(fields: &FieldList) -> Vec<FieldWalkBinding> {
fields.iter().map(FieldWalkBinding::from_field).collect()
}