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 117)
116 fn visit_field(&mut self, field: &FieldDecl) -> Result<()> {
117 if field.is_optional() {
118 self.optional_fields += 1;
119 }
120 if field.is_array() {
121 self.array_fields += 1;
122 }
123
124 for attr in &field.attributes {
125 match attr {
126 FieldAttribute::Unique => self.unique_constraints += 1,
127 FieldAttribute::Relation { .. } => self.relations += 1,
128 _ => {}
129 }
130 }
131
132 Ok(())
133 }
134}
135
136#[derive(Default)]
137struct RelationshipGraph {
138 // model_name -> [(related_model, field_name, is_required)]
139 relationships: HashMap<String, Vec<(String, String, bool)>>,
140}
141
142impl Visitor for RelationshipGraph {
143 fn visit_model(&mut self, model: &ModelDecl) -> Result<()> {
144 let model_name = model.name.value.clone();
145
146 for field in &model.fields {
147 if let FieldType::UserType(related_type) = &field.field_type {
148 if field.has_relation_attribute() || field.is_array() {
149 let is_required = !field.is_optional() && !field.is_array();
150
151 self.relationships
152 .entry(model_name.clone())
153 .or_default()
154 .push((related_type.clone(), field.name.value.clone(), is_required));
155 }
156 }
157 }
158
159 walk_model(self, model)
160 }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 120)
116 fn visit_field(&mut self, field: &FieldDecl) -> Result<()> {
117 if field.is_optional() {
118 self.optional_fields += 1;
119 }
120 if field.is_array() {
121 self.array_fields += 1;
122 }
123
124 for attr in &field.attributes {
125 match attr {
126 FieldAttribute::Unique => self.unique_constraints += 1,
127 FieldAttribute::Relation { .. } => self.relations += 1,
128 _ => {}
129 }
130 }
131
132 Ok(())
133 }
134}
135
136#[derive(Default)]
137struct RelationshipGraph {
138 // model_name -> [(related_model, field_name, is_required)]
139 relationships: HashMap<String, Vec<(String, String, bool)>>,
140}
141
142impl Visitor for RelationshipGraph {
143 fn visit_model(&mut self, model: &ModelDecl) -> Result<()> {
144 let model_name = model.name.value.clone();
145
146 for field in &model.fields {
147 if let FieldType::UserType(related_type) = &field.field_type {
148 if field.has_relation_attribute() || field.is_array() {
149 let is_required = !field.is_optional() && !field.is_array();
150
151 self.relationships
152 .entry(model_name.clone())
153 .or_default()
154 .push((related_type.clone(), field.name.value.clone(), is_required));
155 }
156 }
157 }
158
159 walk_model(self, model)
160 }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 148)
143 fn visit_model(&mut self, model: &ModelDecl) -> Result<()> {
144 let model_name = model.name.value.clone();
145
146 for field in &model.fields {
147 if let FieldType::UserType(related_type) = &field.field_type {
148 if field.has_relation_attribute() || field.is_array() {
149 let is_required = !field.is_optional() && !field.is_array();
150
151 self.relationships
152 .entry(model_name.clone())
153 .or_default()
154 .push((related_type.clone(), field.name.value.clone(), is_required));
155 }
156 }
157 }
158
159 walk_model(self, model)
160 }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