oo_bindgen/model/builder/
constants.rs1use std::collections::HashSet;
2
3use crate::model::*;
4
5pub struct ConstantSetBuilder<'a> {
6    lib: &'a mut LibraryBuilder,
7    name: Name,
8    names: HashSet<String>,
9    values: Vec<Constant<Unvalidated>>,
10    doc: OptionalDoc,
11}
12
13impl<'a> ConstantSetBuilder<'a> {
14    pub fn new(lib: &'a mut LibraryBuilder, name: Name) -> Self {
15        Self {
16            lib,
17            name: name.clone(),
18            names: HashSet::new(),
19            values: Vec::new(),
20            doc: OptionalDoc::new(name),
21        }
22    }
23
24    pub fn doc<D: Into<Doc<Unvalidated>>>(mut self, doc: D) -> BindResult<Self> {
25        self.doc.set(doc.into())?;
26        Ok(self)
27    }
28
29    pub fn add<T: IntoName, D: Into<Doc<Unvalidated>>>(
30        mut self,
31        name: T,
32        value: ConstantValue,
33        doc: D,
34    ) -> BindResult<Self> {
35        let name = name.into_name()?;
36        if self.names.contains(name.as_ref()) {
37            return Err(BindingErrorVariant::ConstantNameAlreadyUsed {
38                set_name: self.name,
39                constant_name: name,
40            }
41            .into());
42        }
43        self.values.push(Constant {
44            name,
45            value,
46            doc: doc.into(),
47        });
48        Ok(self)
49    }
50
51    pub fn build(self) -> BindResult<()> {
52        let handle = Handle::new(ConstantSet {
53            name: self.name,
54            settings: self.lib.clone_settings(),
55            values: self.values,
56            doc: self.doc.extract()?,
57        });
58
59        self.lib.add_statement(Statement::Constants(handle))?;
60
61        Ok(())
62    }
63}