1 use protobuf::reflect::EnumDescriptor;
2 use protobuf::reflect::EnumValueDescriptor;
3 use protobuf::reflect::FieldDescriptor;
4 use protobuf::reflect::MessageDescriptor;
5 use protobuf::reflect::OneofDescriptor;
6 
7 use crate::gen::code_writer::CodeWriter;
8 use crate::Customize;
9 
10 /// Write `// @protoc_insertion_point(...)` before the element.
11 ///
12 /// This is similar to what `protoc` codegen does for C++ or Java.
13 /// This can be used to modify the generated code.
write_protoc_insertion_point(w: &mut CodeWriter, customize: &Customize, arg: &str)14 fn write_protoc_insertion_point(w: &mut CodeWriter, customize: &Customize, arg: &str) {
15     for line in customize.before.iter().flat_map(|s| s.lines()) {
16         w.write_line(line);
17     }
18     w.comment(&format!("@@protoc_insertion_point({})", arg));
19 }
20 
write_protoc_insertion_point_for_message( w: &mut CodeWriter, customize: &Customize, message: &MessageDescriptor, )21 pub(crate) fn write_protoc_insertion_point_for_message(
22     w: &mut CodeWriter,
23     customize: &Customize,
24     message: &MessageDescriptor,
25 ) {
26     write_protoc_insertion_point(w, customize, &format!("message:{}", message.full_name()));
27 }
28 
write_protoc_insertion_point_for_field( w: &mut CodeWriter, customize: &Customize, field: &FieldDescriptor, )29 pub(crate) fn write_protoc_insertion_point_for_field(
30     w: &mut CodeWriter,
31     customize: &Customize,
32     field: &FieldDescriptor,
33 ) {
34     write_protoc_insertion_point(w, customize, &format!("field:{}", field.full_name()));
35 }
36 
write_protoc_insertion_point_for_special_field( w: &mut CodeWriter, customize: &Customize, message: &MessageDescriptor, field: &str, )37 pub(crate) fn write_protoc_insertion_point_for_special_field(
38     w: &mut CodeWriter,
39     customize: &Customize,
40     message: &MessageDescriptor,
41     field: &str,
42 ) {
43     write_protoc_insertion_point(
44         w,
45         customize,
46         &format!("special_field:{}.{}", message.full_name(), field),
47     );
48 }
49 
write_protoc_insertion_point_for_enum( w: &mut CodeWriter, customize: &Customize, enumeration: &EnumDescriptor, )50 pub(crate) fn write_protoc_insertion_point_for_enum(
51     w: &mut CodeWriter,
52     customize: &Customize,
53     enumeration: &EnumDescriptor,
54 ) {
55     write_protoc_insertion_point(w, customize, &format!("enum:{}", enumeration.full_name()));
56 }
57 
write_protoc_insertion_point_for_enum_value( w: &mut CodeWriter, customize: &Customize, value: &EnumValueDescriptor, )58 pub(crate) fn write_protoc_insertion_point_for_enum_value(
59     w: &mut CodeWriter,
60     customize: &Customize,
61     value: &EnumValueDescriptor,
62 ) {
63     write_protoc_insertion_point(w, customize, &format!("enum_value:{}", value.full_name()));
64 }
65 
write_protoc_insertion_point_for_oneof( w: &mut CodeWriter, customize: &Customize, oneof: &OneofDescriptor, )66 pub(crate) fn write_protoc_insertion_point_for_oneof(
67     w: &mut CodeWriter,
68     customize: &Customize,
69     oneof: &OneofDescriptor,
70 ) {
71     write_protoc_insertion_point(w, customize, &format!("oneof:{}", oneof.full_name()));
72 }
73 
write_protoc_insertion_point_for_oneof_field( w: &mut CodeWriter, customize: &Customize, field: &FieldDescriptor, )74 pub(crate) fn write_protoc_insertion_point_for_oneof_field(
75     w: &mut CodeWriter,
76     customize: &Customize,
77     field: &FieldDescriptor,
78 ) {
79     write_protoc_insertion_point(w, customize, &format!("oneof_field:{}", field.full_name()));
80 }
81