libgir/codegen/
special_functions.rs
1use std::io::{Result, Write};
2
3use super::general::version_condition;
4use crate::{
5 analysis::{self, special_functions::FunctionType},
6 version::Version,
7 Env,
8};
9
10pub(super) fn generate(
11 w: &mut dyn Write,
12 env: &Env,
13 function: &analysis::functions::Info,
14 specials: &analysis::special_functions::Infos,
15 scope_version: Option<Version>,
16) -> Result<bool> {
17 if let Some(special) = specials.functions().get(&function.glib_name) {
18 match special.type_ {
19 FunctionType::StaticStringify => {
20 generate_static_to_str(w, env, function, scope_version)
21 }
22 }
23 .map(|()| true)
24 } else {
25 Ok(false)
26 }
27}
28
29pub(super) fn generate_static_to_str(
30 w: &mut dyn Write,
31 env: &Env,
32 function: &analysis::functions::Info,
33 scope_version: Option<Version>,
34) -> Result<()> {
35 writeln!(w)?;
36 let version = Version::if_stricter_than(function.version, scope_version);
37 version_condition(w, env, None, version, false, 1)?;
38
39 writeln!(
40 w,
41 "\
42\t{visibility} fn {rust_fn_name}<'a>(self) -> &'a GStr {{
43\t\tunsafe {{
44\t\t\tGStr::from_ptr(
45\t\t\t\t{ns}::{glib_fn_name}(self.into_glib())
46\t\t\t\t\t.as_ref()
47\t\t\t\t\t.expect(\"{glib_fn_name} returned NULL\"),
48\t\t\t)
49\t\t}}
50\t}}",
51 visibility = function.visibility,
52 rust_fn_name = function.codegen_name(),
53 ns = env.main_sys_crate_name(),
54 glib_fn_name = function.glib_name,
55 )?;
56
57 Ok(())
58}