tdlib_tl_gen/
functions.rs1use crate::metadata::Metadata;
13use crate::rustifier;
14use std::io::{self, Write};
15use tdlib_tl_parser::tl::{Category, Definition};
16
17fn write_function<W: Write>(
25 file: &mut W,
26 def: &Definition,
27 _metadata: &Metadata,
28 gen_bots_only_api: bool,
29) -> io::Result<()> {
30 if rustifier::definitions::is_for_bots_only(def) && !gen_bots_only_api {
31 return Ok(());
32 }
33
34 writeln!(file, "{}", rustifier::definitions::description(def, " "))?;
36 writeln!(file, " /// # Arguments")?;
37 for param in def.params.iter() {
38 if rustifier::parameters::is_for_bots_only(param) && !gen_bots_only_api {
39 continue;
40 }
41
42 writeln!(
43 file,
44 " /// * `{}` - {}",
45 rustifier::parameters::attr_name(param),
46 param.description.replace('\n', "\n /// ")
47 )?;
48 }
49 writeln!(
50 file,
51 " /// * `client_id` - The client id to send the request to"
52 )?;
53
54 writeln!(file, " #[allow(clippy::too_many_arguments)]")?;
56 write!(
57 file,
58 " pub async fn {}(",
59 rustifier::definitions::function_name(def)
60 )?;
61 for param in def.params.iter() {
62 if rustifier::parameters::is_for_bots_only(param) && !gen_bots_only_api {
63 continue;
64 }
65
66 write!(file, "{}: ", rustifier::parameters::attr_name(param))?;
67
68 let is_optional = rustifier::parameters::is_optional(param);
69 if is_optional {
70 write!(file, "Option<")?;
71 }
72 write!(file, "{}", rustifier::parameters::qual_name(param))?;
73 if is_optional {
74 write!(file, ">")?;
75 }
76
77 write!(file, ", ")?;
78 }
79
80 writeln!(
81 file,
82 "client_id: i32) -> Result<{}, crate::types::Error> {{",
83 rustifier::types::qual_name(&def.ty, false)
84 )?;
85
86 writeln!(file, " let request = json!({{")?;
88 writeln!(file, " \"@type\": \"{}\",", def.name)?;
89 for param in def.params.iter() {
90 if rustifier::parameters::is_for_bots_only(param) && !gen_bots_only_api {
91 continue;
92 }
93
94 writeln!(
95 file,
96 " \"{0}\": {1},",
97 param.name,
98 rustifier::parameters::attr_name(param),
99 )?;
100 }
101 writeln!(file, " }});")?;
102
103 writeln!(
105 file,
106 " let response = send_request(client_id, request).await;"
107 )?;
108 writeln!(file, " if response[\"@type\"] == \"error\" {{")?;
109 writeln!(
110 file,
111 " return Err(serde_json::from_value(response).unwrap())"
112 )?;
113 writeln!(file, " }}")?;
114
115 if rustifier::types::is_ok(&def.ty) {
116 writeln!(file, " Ok(())")?;
117 } else {
118 writeln!(
119 file,
120 " Ok(serde_json::from_value(response).unwrap())"
121 )?;
122 }
123
124 writeln!(file, " }}")?;
125 Ok(())
126}
127
128fn write_definition<W: Write>(
130 file: &mut W,
131 def: &Definition,
132 metadata: &Metadata,
133 gen_bots_only_api: bool,
134) -> io::Result<()> {
135 write_function(file, def, metadata, gen_bots_only_api)?;
136 Ok(())
137}
138
139pub(crate) fn write_functions_mod<W: Write>(
141 mut file: &mut W,
142 definitions: &[Definition],
143 metadata: &Metadata,
144 gen_bots_only_api: bool,
145) -> io::Result<()> {
146 writeln!(file, "pub mod functions {{")?;
148 writeln!(file, " use serde_json::json;")?;
149 writeln!(file, " use crate::send_request;")?;
150
151 let functions = definitions
152 .iter()
153 .filter(|d| d.category == Category::Functions);
154
155 for definition in functions {
156 write_definition(&mut file, definition, metadata, gen_bots_only_api)?;
157 }
158
159 writeln!(file, "}}")
161}