1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use super::*;

impl<'ty> Ctxt<'_, 'ty, '_> {
    pub(super) fn print_named_fields(
        &mut self,
        fields: &'ty [(&'static str, Field)],
        variant: Option<&'ty Variant>,
    ) {
        let fields: Vec<_> = fields
            .iter()
            .filter(|(_, field)| {
                self.vis
                    .allows(field.ty.serializable, field.ty.deserializable)
            })
            .collect();

        if !self.flat {
            if fields.is_empty() {
                self.out.write("{}");
                return;
            }

            if self.inline {
                self.out.write("{ ");
            } else {
                self.out.writeln("{");
                self.out.inc_indent();
            }
        }

        for (field_id, (field_name, field)) in fields.into_iter().enumerate() {
            self.print_named_field(field_id, field_name, field, variant);
        }

        if !self.flat {
            if self.inline {
                self.out.write(" }");
            } else {
                self.out.ln();
                self.out.dec_indent();
                self.out.write("}");
            }
        }
    }

    fn print_named_field(
        &mut self,
        field_id: usize,
        field_name: &str,
        field: &'ty Field,
        variant: Option<&'ty Variant>,
    ) {
        if field_id > 0 {
            if self.inline {
                self.out.write(", ");
            } else {
                self.out.writeln(",");
            }
        }

        let field_val = self
            .val
            .and_then(|val| val.as_struct_named_field(field_name));

        if let Some(tag) = field.ty.tag {
            let variant = variant.expect(
                "Invalid internal state: At this point we should be expanding \
                 variants, but it seems like we're not",
            );

            self.out.writeln(format!(r#""{}": "{}","#, tag, variant.id));
            self.out.write(format!(r#""{}": "#, field_name));
            self.print_fields(&variant.fields, None);

            return;
        }

        if field.flattened {
            self.nested()
                .with_ty(&field.ty)
                .with_val(field_val)
                .with_flat()
                .print();
        } else {
            self.out.write(format!("\"{}\": ", field_name));
            self.nested().with_ty(&field.ty).with_val(field_val).print();
        }
    }
}