1 use crate::algorithm::Printer;
2 use crate::iter::IterDelimited;
3 use crate::path::PathKind;
4 use crate::INDENT;
5 use syn::{Field, Fields, FieldsUnnamed, Variant, VisRestricted, Visibility};
6 
7 impl Printer {
variant(&mut self, variant: &Variant)8     pub fn variant(&mut self, variant: &Variant) {
9         self.outer_attrs(&variant.attrs);
10         self.ident(&variant.ident);
11         match &variant.fields {
12             Fields::Named(fields) => {
13                 self.nbsp();
14                 self.word("{");
15                 self.cbox(INDENT);
16                 self.space();
17                 for field in fields.named.iter().delimited() {
18                     self.field(&field);
19                     self.trailing_comma_or_space(field.is_last);
20                 }
21                 self.offset(-INDENT);
22                 self.end();
23                 self.word("}");
24             }
25             Fields::Unnamed(fields) => {
26                 self.cbox(INDENT);
27                 self.fields_unnamed(fields);
28                 self.end();
29             }
30             Fields::Unit => {}
31         }
32         if let Some((_eq_token, discriminant)) = &variant.discriminant {
33             self.word(" = ");
34             self.expr(discriminant);
35         }
36     }
37 
fields_unnamed(&mut self, fields: &FieldsUnnamed)38     pub fn fields_unnamed(&mut self, fields: &FieldsUnnamed) {
39         self.word("(");
40         self.zerobreak();
41         for field in fields.unnamed.iter().delimited() {
42             self.field(&field);
43             self.trailing_comma(field.is_last);
44         }
45         self.offset(-INDENT);
46         self.word(")");
47     }
48 
field(&mut self, field: &Field)49     pub fn field(&mut self, field: &Field) {
50         self.outer_attrs(&field.attrs);
51         self.visibility(&field.vis);
52         if let Some(ident) = &field.ident {
53             self.ident(ident);
54             self.word(": ");
55         }
56         self.ty(&field.ty);
57     }
58 
visibility(&mut self, vis: &Visibility)59     pub fn visibility(&mut self, vis: &Visibility) {
60         match vis {
61             Visibility::Public(_) => self.word("pub "),
62             Visibility::Restricted(vis) => self.vis_restricted(vis),
63             Visibility::Inherited => {}
64         }
65     }
66 
vis_restricted(&mut self, vis: &VisRestricted)67     fn vis_restricted(&mut self, vis: &VisRestricted) {
68         self.word("pub(");
69         let omit_in = vis.path.get_ident().map_or(false, |ident| {
70             matches!(ident.to_string().as_str(), "self" | "super" | "crate")
71         });
72         if !omit_in {
73             self.word("in ");
74         }
75         self.path(&vis.path, PathKind::Simple);
76         self.word(") ");
77     }
78 }
79