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}