| use crate::algorithm::Printer; | |
| use crate::iter::IterDelimited; | |
| use crate::path::PathKind; | |
| use crate::INDENT; | |
| use syn::{Field, Fields, FieldsUnnamed, Variant, VisRestricted, Visibility}; | |
| impl Printer { | |
| pub fn variant(&mut self, variant: &Variant) { | |
| self.outer_attrs(&variant.attrs); | |
| self.ident(&variant.ident); | |
| match &variant.fields { | |
| Fields::Named(fields) => { | |
| self.nbsp(); | |
| self.word("{"); | |
| self.cbox(INDENT); | |
| self.space(); | |
| for field in fields.named.iter().delimited() { | |
| self.field(&field); | |
| self.trailing_comma_or_space(field.is_last); | |
| } | |
| self.offset(-INDENT); | |
| self.end(); | |
| self.word("}"); | |
| } | |
| Fields::Unnamed(fields) => { | |
| self.cbox(INDENT); | |
| self.fields_unnamed(fields); | |
| self.end(); | |
| } | |
| Fields::Unit => {} | |
| } | |
| if let Some((_eq_token, discriminant)) = &variant.discriminant { | |
| self.word(" = "); | |
| self.expr(discriminant); | |
| } | |
| } | |
| pub fn fields_unnamed(&mut self, fields: &FieldsUnnamed) { | |
| self.word("("); | |
| self.zerobreak(); | |
| for field in fields.unnamed.iter().delimited() { | |
| self.field(&field); | |
| self.trailing_comma(field.is_last); | |
| } | |
| self.offset(-INDENT); | |
| self.word(")"); | |
| } | |
| pub fn field(&mut self, field: &Field) { | |
| self.outer_attrs(&field.attrs); | |
| self.visibility(&field.vis); | |
| if let Some(ident) = &field.ident { | |
| self.ident(ident); | |
| self.word(": "); | |
| } | |
| self.ty(&field.ty); | |
| } | |
| pub fn visibility(&mut self, vis: &Visibility) { | |
| match vis { | |
| Visibility::Public(_) => self.word("pub "), | |
| Visibility::Restricted(vis) => self.vis_restricted(vis), | |
| Visibility::Inherited => {} | |
| } | |
| } | |
| fn vis_restricted(&mut self, vis: &VisRestricted) { | |
| self.word("pub("); | |
| let omit_in = vis.path.get_ident().map_or(false, |ident| { | |
| matches!(ident.to_string().as_str(), "self" | "super" | "crate") | |
| }); | |
| if !omit_in { | |
| self.word("in "); | |
| } | |
| self.path(&vis.path, PathKind::Simple); | |
| self.word(") "); | |
| } | |
| } |