1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files)
// DO NOT EDIT

use crate::SettingsSchema;
use glib::translate::*;
use std::ptr;

glib::wrapper! {
    /// This is an opaque structure type. You may not access it directly.
    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
    pub struct SettingsSchemaSource(Shared<ffi::GSettingsSchemaSource>);

    match fn {
        ref => |ptr| ffi::g_settings_schema_source_ref(ptr),
        unref => |ptr| ffi::g_settings_schema_source_unref(ptr),
        type_ => || ffi::g_settings_schema_source_get_type(),
    }
}

impl SettingsSchemaSource {
    /// Attempts to create a new schema source corresponding to the contents
    /// of the given directory.
    ///
    /// This function is not required for normal uses of [`Settings`][crate::Settings] but it
    /// may be useful to authors of plugin management systems.
    ///
    /// The directory should contain a file called `gschemas.compiled` as
    /// produced by the [glib-compile-schemas][glib-compile-schemas] tool.
    ///
    /// If `trusted` is [`true`] then `gschemas.compiled` is trusted not to be
    /// corrupted. This assumption has a performance advantage, but can result
    /// in crashes or inconsistent behaviour in the case of a corrupted file.
    /// Generally, you should set `trusted` to [`true`] for files installed by the
    /// system and to [`false`] for files in the home directory.
    ///
    /// In either case, an empty file or some types of corruption in the file will
    /// result in `G_FILE_ERROR_INVAL` being returned.
    ///
    /// If `parent` is non-[`None`] then there are two effects.
    ///
    /// First, if [`lookup()`][Self::lookup()] is called with the
    /// `recursive` flag set to [`true`] and the schema can not be found in the
    /// source, the lookup will recurse to the parent.
    ///
    /// Second, any references to other schemas specified within this
    /// source (ie: `child` or `extends`) references may be resolved
    /// from the `parent`.
    ///
    /// For this second reason, except in very unusual situations, the
    /// `parent` should probably be given as the default schema source, as
    /// returned by [`default()`][Self::default()].
    /// ## `directory`
    /// the filename of a directory
    /// ## `parent`
    /// a [`SettingsSchemaSource`][crate::SettingsSchemaSource], or [`None`]
    /// ## `trusted`
    /// [`true`], if the directory is trusted
    #[doc(alias = "g_settings_schema_source_new_from_directory")]
    #[doc(alias = "new_from_directory")]
    pub fn from_directory(
        directory: impl AsRef<std::path::Path>,
        parent: Option<&SettingsSchemaSource>,
        trusted: bool,
    ) -> Result<SettingsSchemaSource, glib::Error> {
        unsafe {
            let mut error = ptr::null_mut();
            let ret = ffi::g_settings_schema_source_new_from_directory(
                directory.as_ref().to_glib_none().0,
                parent.to_glib_none().0,
                trusted.into_glib(),
                &mut error,
            );
            if error.is_null() {
                Ok(from_glib_full(ret))
            } else {
                Err(from_glib_full(error))
            }
        }
    }

    /// Lists the schemas in a given source.
    ///
    /// If `recursive` is [`true`] then include parent sources. If [`false`] then
    /// only include the schemas from one source (ie: one directory). You
    /// probably want [`true`].
    ///
    /// Non-relocatable schemas are those for which you can call
    /// [`Settings::new()`][crate::Settings::new()]. Relocatable schemas are those for which you must
    /// use [`Settings::with_path()`][crate::Settings::with_path()].
    ///
    /// Do not call this function from normal programs. This is designed for
    /// use by database editors, commandline tools, etc.
    /// ## `recursive`
    /// if we should recurse
    ///
    /// # Returns
    ///
    ///
    /// ## `non_relocatable`
    /// the
    ///  list of non-relocatable schemas, in no defined order
    ///
    /// ## `relocatable`
    /// the list
    ///  of relocatable schemas, in no defined order
    #[doc(alias = "g_settings_schema_source_list_schemas")]
    pub fn list_schemas(&self, recursive: bool) -> (Vec<glib::GString>, Vec<glib::GString>) {
        unsafe {
            let mut non_relocatable = ptr::null_mut();
            let mut relocatable = ptr::null_mut();
            ffi::g_settings_schema_source_list_schemas(
                self.to_glib_none().0,
                recursive.into_glib(),
                &mut non_relocatable,
                &mut relocatable,
            );
            (
                FromGlibPtrContainer::from_glib_full(non_relocatable),
                FromGlibPtrContainer::from_glib_full(relocatable),
            )
        }
    }

    /// Looks up a schema with the identifier `schema_id` in `self`.
    ///
    /// This function is not required for normal uses of [`Settings`][crate::Settings] but it
    /// may be useful to authors of plugin management systems or to those who
    /// want to introspect the content of schemas.
    ///
    /// If the schema isn't found directly in `self` and `recursive` is [`true`]
    /// then the parent sources will also be checked.
    ///
    /// If the schema isn't found, [`None`] is returned.
    /// ## `schema_id`
    /// a schema ID
    /// ## `recursive`
    /// [`true`] if the lookup should be recursive
    ///
    /// # Returns
    ///
    /// a new [`SettingsSchema`][crate::SettingsSchema]
    #[doc(alias = "g_settings_schema_source_lookup")]
    pub fn lookup(&self, schema_id: &str, recursive: bool) -> Option<SettingsSchema> {
        unsafe {
            from_glib_full(ffi::g_settings_schema_source_lookup(
                self.to_glib_none().0,
                schema_id.to_glib_none().0,
                recursive.into_glib(),
            ))
        }
    }

    /// Gets the default system schema source.
    ///
    /// This function is not required for normal uses of [`Settings`][crate::Settings] but it
    /// may be useful to authors of plugin management systems or to those who
    /// want to introspect the content of schemas.
    ///
    /// If no schemas are installed, [`None`] will be returned.
    ///
    /// The returned source may actually consist of multiple schema sources
    /// from different directories, depending on which directories were given
    /// in `XDG_DATA_DIRS` and `GSETTINGS_SCHEMA_DIR`. For this reason, all
    /// lookups performed against the default source should probably be done
    /// recursively.
    ///
    /// # Returns
    ///
    /// the default schema source
    #[doc(alias = "g_settings_schema_source_get_default")]
    #[doc(alias = "get_default")]
    #[allow(clippy::should_implement_trait)]
    pub fn default() -> Option<SettingsSchemaSource> {
        unsafe { from_glib_none(ffi::g_settings_schema_source_get_default()) }
    }
}