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}