pbjson_build/
generator.rs

1//! This module contains the actual code generation logic
2
3use 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}