pbjson_build/
generator.rs1use std::fmt::{Display, Formatter};
4use std::io::{Result, Write};
5
6mod enumeration;
7mod message;
8
9pub use enumeration::generate_enum;
10pub use message::generate_message;
11
12#[derive(Debug, Clone, Copy)]
13struct Indent(usize);
14
15impl Display for Indent {
16 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
17 for _ in 0..self.0 {
18 write!(f, " ")?;
19 }
20 Ok(())
21 }
22}
23
24fn write_fields_array<'a, W: Write, I: Iterator<Item = &'a str>>(
25 writer: &mut W,
26 indent: usize,
27 variants: I,
28) -> Result<()> {
29 writeln!(writer, "{}const FIELDS: &[&str] = &[", Indent(indent))?;
30 for name in variants {
31 writeln!(writer, "{}\"{}\",", Indent(indent + 1), name)?;
32 }
33 writeln!(writer, "{}];", Indent(indent))?;
34 writeln!(writer)
35}
36
37fn write_serialize_start<W: Write>(indent: usize, rust_type: &str, writer: &mut W) -> Result<()> {
38 writeln!(
39 writer,
40 r#"{indent}impl serde::Serialize for {rust_type} {{
41{indent} #[allow(deprecated)]
42{indent} fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
43{indent} where
44{indent} S: serde::Serializer,
45{indent} {{"#,
46 indent = Indent(indent),
47 rust_type = rust_type
48 )
49}
50
51fn write_serialize_end<W: Write>(indent: usize, writer: &mut W) -> Result<()> {
52 writeln!(
53 writer,
54 r#"{indent} }}
55{indent}}}"#,
56 indent = Indent(indent),
57 )
58}
59
60fn write_deserialize_start<W: Write>(indent: usize, rust_type: &str, writer: &mut W) -> Result<()> {
61 writeln!(
62 writer,
63 r#"{indent}impl<'de> serde::Deserialize<'de> for {rust_type} {{
64{indent} #[allow(deprecated)]
65{indent} fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
66{indent} where
67{indent} D: serde::Deserializer<'de>,
68{indent} {{"#,
69 indent = Indent(indent),
70 rust_type = rust_type
71 )
72}
73
74fn write_deserialize_end<W: Write>(indent: usize, writer: &mut W) -> Result<()> {
75 writeln!(
76 writer,
77 r#"{indent} }}
78{indent}}}"#,
79 indent = Indent(indent),
80 )
81}