pub struct FieldDecl {
pub name: Ident,
pub field_type: FieldType,
pub modifier: FieldModifier,
pub attributes: Vec<FieldAttribute>,
pub span: Span,
}Expand description
A field declaration within a model.
Fields§
§name: IdentThe field name.
field_type: FieldTypeThe field type.
modifier: FieldModifierOptional or array modifier.
attributes: Vec<FieldAttribute>Field-level attributes (@id, @unique, etc.).
span: SpanSpan covering the entire field declaration.
Implementations§
Source§impl FieldDecl
impl FieldDecl
Sourcepub fn is_optional(&self) -> bool
pub fn is_optional(&self) -> bool
Checks if this field is optional (has ? modifier).
Examples found in repository?
examples/visitor_demo.rs (line 119)
118 fn visit_field(&mut self, field: &FieldDecl) -> Result<()> {
119 if field.is_optional() {
120 self.optional_fields += 1;
121 }
122 if field.is_array() {
123 self.array_fields += 1;
124 }
125
126 for attr in &field.attributes {
127 match attr {
128 FieldAttribute::Unique => self.unique_constraints += 1,
129 FieldAttribute::Relation { .. } => self.relations += 1,
130 _ => {}
131 }
132 }
133
134 Ok(())
135 }
136}
137
138// Custom visitor 2: Build a relationship graph
139#[derive(Default)]
140struct RelationshipGraph {
141 // model_name -> [(related_model, field_name, is_required)]
142 relationships: HashMap<String, Vec<(String, String, bool)>>,
143}
144
145impl Visitor for RelationshipGraph {
146 fn visit_model(&mut self, model: &ModelDecl) -> Result<()> {
147 let model_name = model.name.value.clone();
148
149 for field in &model.fields {
150 if let FieldType::UserType(related_type) = &field.field_type {
151 if field.has_relation_attribute() || field.is_array() {
152 let is_required = !field.is_optional() && !field.is_array();
153
154 self.relationships
155 .entry(model_name.clone())
156 .or_default()
157 .push((related_type.clone(), field.name.value.clone(), is_required));
158 }
159 }
160 }
161
162 walk_model(self, model)
163 }Sourcepub fn is_not_null(&self) -> bool
pub fn is_not_null(&self) -> bool
Checks if this field has an explicit not-null modifier (!).
Sourcepub fn is_array(&self) -> bool
pub fn is_array(&self) -> bool
Checks if this field is an array (has [] modifier).
Examples found in repository?
examples/visitor_demo.rs (line 122)
118 fn visit_field(&mut self, field: &FieldDecl) -> Result<()> {
119 if field.is_optional() {
120 self.optional_fields += 1;
121 }
122 if field.is_array() {
123 self.array_fields += 1;
124 }
125
126 for attr in &field.attributes {
127 match attr {
128 FieldAttribute::Unique => self.unique_constraints += 1,
129 FieldAttribute::Relation { .. } => self.relations += 1,
130 _ => {}
131 }
132 }
133
134 Ok(())
135 }
136}
137
138// Custom visitor 2: Build a relationship graph
139#[derive(Default)]
140struct RelationshipGraph {
141 // model_name -> [(related_model, field_name, is_required)]
142 relationships: HashMap<String, Vec<(String, String, bool)>>,
143}
144
145impl Visitor for RelationshipGraph {
146 fn visit_model(&mut self, model: &ModelDecl) -> Result<()> {
147 let model_name = model.name.value.clone();
148
149 for field in &model.fields {
150 if let FieldType::UserType(related_type) = &field.field_type {
151 if field.has_relation_attribute() || field.is_array() {
152 let is_required = !field.is_optional() && !field.is_array();
153
154 self.relationships
155 .entry(model_name.clone())
156 .or_default()
157 .push((related_type.clone(), field.name.value.clone(), is_required));
158 }
159 }
160 }
161
162 walk_model(self, model)
163 }Sourcepub fn find_attribute(&self, kind: &str) -> Option<&FieldAttribute>
pub fn find_attribute(&self, kind: &str) -> Option<&FieldAttribute>
Finds a field attribute by kind.
Sourcepub fn has_relation_attribute(&self) -> bool
pub fn has_relation_attribute(&self) -> bool
Checks if this field has a @relation attribute.
Examples found in repository?
examples/visitor_demo.rs (line 151)
146 fn visit_model(&mut self, model: &ModelDecl) -> Result<()> {
147 let model_name = model.name.value.clone();
148
149 for field in &model.fields {
150 if let FieldType::UserType(related_type) = &field.field_type {
151 if field.has_relation_attribute() || field.is_array() {
152 let is_required = !field.is_optional() && !field.is_array();
153
154 self.relationships
155 .entry(model_name.clone())
156 .or_default()
157 .push((related_type.clone(), field.name.value.clone(), is_required));
158 }
159 }
160 }
161
162 walk_model(self, model)
163 }Sourcepub fn column_name(&self) -> &str
pub fn column_name(&self) -> &str
Gets the physical column name from @map attribute, or the field name.
Trait Implementations§
impl StructuralPartialEq for FieldDecl
Auto Trait Implementations§
impl Freeze for FieldDecl
impl RefUnwindSafe for FieldDecl
impl Send for FieldDecl
impl Sync for FieldDecl
impl Unpin for FieldDecl
impl UnsafeUnpin for FieldDecl
impl UnwindSafe for FieldDecl
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more