libgir/codegen/
alias.rs

1use std::{
2    io::{prelude::*, Result},
3    path::Path,
4};
5
6use crate::{
7    analysis::{namespaces, rust_type::RustType},
8    codegen::general::{doc_alias, start_comments},
9    config::gobjects::GObject,
10    env::Env,
11    file_saver,
12    library::*,
13    traits::*,
14};
15
16pub fn generate(env: &Env, root_path: &Path, mod_rs: &mut Vec<String>) {
17    let configs: Vec<&GObject> = env
18        .config
19        .objects
20        .values()
21        .filter(|c| {
22            c.status.need_generate() && c.type_id.is_some_and(|tid| tid.ns_id == namespaces::MAIN)
23        })
24        .collect();
25    let mut has_any = false;
26    for config in &configs {
27        if let Type::Alias(_) = env.library.type_(config.type_id.unwrap()) {
28            has_any = true;
29            break;
30        }
31    }
32
33    if !has_any {
34        return;
35    }
36
37    let path = root_path.join("alias.rs");
38    file_saver::save_to_file(path, env.config.make_backup, |w| {
39        start_comments(w, &env.config)?;
40        writeln!(w)?;
41        writeln!(w, "#[allow(unused_imports)]")?;
42        writeln!(w, "use crate::auto::*;")?;
43        writeln!(w)?;
44
45        mod_rs.push("\nmod alias;".into());
46        for config in &configs {
47            if let Type::Alias(alias) = env.library.type_(config.type_id.unwrap()) {
48                mod_rs.push(format!("pub use self::alias::{};", alias.name));
49                generate_alias(env, w, alias, config)?;
50            }
51        }
52
53        Ok(())
54    });
55}
56
57fn generate_alias(env: &Env, w: &mut dyn Write, alias: &Alias, _: &GObject) -> Result<()> {
58    let typ = RustType::try_new(env, alias.typ).into_string();
59    doc_alias(w, &alias.c_identifier, "", 0)?;
60    writeln!(w, "pub type {} = {};", alias.name, typ)?;
61
62    Ok(())
63}