libgir/codegen/
parameter.rs
1use crate::{
2 analysis::{
3 bounds::Bounds, conversion_type::ConversionType, function_parameters::CParameter,
4 ref_mode::RefMode, rust_type::RustType,
5 },
6 env::Env,
7 traits::*,
8};
9
10pub trait ToParameter {
11 fn to_parameter(&self, env: &Env, bounds: &Bounds, r#async: bool) -> String;
12}
13
14impl ToParameter for CParameter {
15 fn to_parameter(&self, env: &Env, bounds: &Bounds, r#async: bool) -> String {
16 let ref_mode = if self.move_ {
17 RefMode::None
18 } else {
19 self.ref_mode
20 };
21 if self.instance_parameter {
22 format!("{}self", ref_mode.for_rust_type())
23 } else {
24 let type_str = match bounds.get_parameter_bound(&self.name) {
25 Some(bound) => {
26 bound.full_type_parameter_reference(ref_mode, self.nullable, r#async)
27 }
28 None => {
29 let type_name = RustType::builder(env, self.typ)
30 .direction(self.direction)
31 .nullable(self.nullable)
32 .ref_mode(ref_mode)
33 .scope(self.scope)
34 .try_from_glib(&self.try_from_glib)
35 .try_build_param()
36 .into_string();
37 match ConversionType::of(env, self.typ) {
38 ConversionType::Unknown => format!("/*Unknown conversion*/{type_name}"),
39 _ => type_name,
40 }
41 }
42 };
43 format!("{}: {}", self.name, type_str)
44 }
45 }
46}