libgir/analysis/
try_from_glib.rs
1use std::{borrow::Cow, sync::Arc};
2
3use crate::{
4 analysis::conversion_type::ConversionType,
5 config,
6 library::{self, Infallible, Mandatory},
7 Env,
8};
9
10#[derive(Default, Clone, Debug)]
11pub enum TryFromGlib {
12 #[default]
13 Default,
14 NotImplemented,
15 Option,
16 OptionMandatory,
17 Result {
18 ok_type: Arc<str>,
19 err_type: Arc<str>,
20 },
21 ResultInfallible {
22 ok_type: Arc<str>,
23 },
24}
25
26impl TryFromGlib {
27 fn _new(
28 env: &Env,
29 type_id: library::TypeId,
30 mut config_mandatory: impl Iterator<Item = Mandatory>,
31 mut config_infallible: impl Iterator<Item = Infallible>,
32 ) -> Self {
33 let conversion_type = ConversionType::of(env, type_id);
34 match conversion_type {
35 ConversionType::Option => {
36 if *config_mandatory.next().unwrap_or(Mandatory(false)) {
37 TryFromGlib::OptionMandatory
38 } else {
39 TryFromGlib::Option
40 }
41 }
42 ConversionType::Result { ok_type, err_type } => {
43 if *config_infallible.next().unwrap_or(Infallible(false)) {
44 TryFromGlib::ResultInfallible {
45 ok_type: Arc::clone(&ok_type),
46 }
47 } else {
48 TryFromGlib::Result {
49 ok_type: Arc::clone(&ok_type),
50 err_type: Arc::clone(&err_type),
51 }
52 }
53 }
54 _ => TryFromGlib::NotImplemented,
55 }
56 }
57
58 pub fn from_type_defaults(env: &Env, type_id: library::TypeId) -> Self {
59 Self::_new(env, type_id, None.into_iter(), None.into_iter())
60 }
61
62 pub fn or_type_defaults(&self, env: &Env, type_id: library::TypeId) -> Cow<'_, Self> {
63 match self {
64 TryFromGlib::Default => Cow::Owned(Self::from_type_defaults(env, type_id)),
65 other => Cow::Borrowed(other),
66 }
67 }
68
69 pub fn from_parameter(
70 env: &Env,
71 type_id: library::TypeId,
72 configured_parameters: &[&config::functions::Parameter],
73 ) -> Self {
74 Self::_new(
75 env,
76 type_id,
77 configured_parameters.iter().filter_map(|par| par.mandatory),
78 configured_parameters
79 .iter()
80 .filter_map(|par| par.infallible),
81 )
82 }
83
84 pub fn from_return_value(
85 env: &Env,
86 type_id: library::TypeId,
87 configured_functions: &[&config::functions::Function],
88 ) -> Self {
89 Self::_new(
90 env,
91 type_id,
92 configured_functions.iter().filter_map(|f| f.ret.mandatory),
93 configured_functions.iter().filter_map(|f| f.ret.infallible),
94 )
95 }
96}