[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [rust-qt-binding-generator] src: Add function to create bindings from runtime Config object
From:       Jos van den Oever <null () kde ! org>
Date:       2018-09-28 21:38:53
Message-ID: E1g60TN-0001Gp-LN () code ! kde ! org
[Download RAW message or body]

Git commit 6ee8ca626d01af93eb771282853c548382b3c0b7 by Jos van den Oever.
Committed on 28/09/2018 at 21:38.
Pushed by vandenoever into branch 'master'.

Add function to create bindings from runtime Config object

M  +4    -6    src/bin/rust_qt_binding_generator.rs
M  +52   -44   src/configuration.rs
A  +48   -0    src/configuration_private.rs
M  +14   -9    src/cpp.rs
M  +13   -7    src/lib.rs
M  +2    -3    src/rust.rs

https://commits.kde.org/rust-qt-binding-generator/6ee8ca626d01af93eb771282853c548382b3c0b7

diff --git a/src/bin/rust_qt_binding_generator.rs b/src/bin/rust_qt_binding_generator.rs
index a04085b..251ca31 100644
--- a/src/bin/rust_qt_binding_generator.rs
+++ b/src/bin/rust_qt_binding_generator.rs
@@ -1,6 +1,6 @@
 extern crate clap;
 extern crate rust_qt_binding_generator;
-use clap::{Arg, App};
+use clap::{App, Arg};
 use rust_qt_binding_generator::*;
 
 fn main() {
@@ -11,19 +11,17 @@ fn main() {
             Arg::with_name("overwrite-implementation")
                 .long("overwrite-implementation")
                 .help("Overwrite existing implementation."),
-        )
-        .arg(
+        ).arg(
             Arg::with_name("config")
                 .multiple(true)
                 .required(true)
                 .takes_value(true)
                 .help("Configuration file(s)"),
-        )
-        .get_matches();
+        ).get_matches();
 
     let overwrite_implementation = matches.is_present("overwrite-implementation");
     for config in matches.values_of("config").unwrap() {
-        if let Err(e) = generate_rust_qt_bindings(config, overwrite_implementation) {
+        if let Err(e) = generate_bindings_from_config_file(config, overwrite_implementation) {
             eprintln!("{}", e);
             ::std::process::exit(1);
         }
diff --git a/src/configuration.rs b/src/configuration.rs
index d2d7001..b4e370f 100644
--- a/src/configuration.rs
+++ b/src/configuration.rs
@@ -1,3 +1,4 @@
+use configuration_private::*;
 use serde_json;
 use std::collections::{BTreeMap, BTreeSet};
 use std::error::Error;
@@ -64,8 +65,8 @@ pub struct Config {
     pub overwrite_implementation: bool,
 }
 
-impl Config {
-    pub fn types(&self) -> BTreeSet<String> {
+impl ConfigPrivate for Config {
+    fn types(&self) -> BTreeSet<String> {
         let mut ops = BTreeSet::new();
         for o in self.objects.values() {
             for p in o.properties.values() {
@@ -83,7 +84,7 @@ impl Config {
         }
         ops
     }
-    pub fn optional_types(&self) -> BTreeSet<String> {
+    fn optional_types(&self) -> BTreeSet<String> {
         let mut ops = BTreeSet::new();
         for o in self.objects.values() {
             for p in o.properties.values() {
@@ -102,7 +103,7 @@ impl Config {
         }
         ops
     }
-    pub fn has_list_or_tree(&self) -> bool {
+    fn has_list_or_tree(&self) -> bool {
         self.objects
             .values()
             .any(|o| o.object_type == ObjectType::List || o.object_type == ObjectType::Tree)
@@ -116,13 +117,19 @@ pub struct Object {
     pub item_properties: BTreeMap<String, ItemProperty>,
     pub object_type: ObjectType,
     pub properties: BTreeMap<String, Property>,
-    pub column_count: usize,
 }
 
-impl Object {
-    pub fn contains_object(&self) -> bool {
+impl ObjectPrivate for Object {
+    fn contains_object(&self) -> bool {
         self.properties.values().any(|p| p.is_object())
     }
+    fn column_count(&self) -> usize {
+        let mut column_count = 1;
+        for ip in self.item_properties.values() {
+            column_count = column_count.max(ip.roles.len());
+        }
+        column_count
+    }
 }
 
 #[derive(PartialEq)]
@@ -133,22 +140,25 @@ pub struct Property {
     pub write: bool,
 }
 
-impl Property {
-    pub fn is_object(&self) -> bool {
+impl PropertyPrivate for Property {
+    fn is_object(&self) -> bool {
         self.property_type.is_object()
     }
-    pub fn is_complex(&self) -> bool {
+    fn is_complex(&self) -> bool {
         self.property_type.is_complex()
     }
-    pub fn type_name(&self) -> &str {
-        self.property_type.name()
-    }
-    pub fn c_get_type(&self) -> String {
+    fn c_get_type(&self) -> String {
         let name = self.property_type.name();
         name.to_string() + "*, " + &name.to_lowercase() + "_set"
     }
 }
 
+impl TypeName for Property {
+    fn type_name(&self) -> &str {
+        self.property_type.name()
+    }
+}
+
 #[derive(Deserialize)]
 #[serde(deny_unknown_fields)]
 pub struct Rust {
@@ -196,8 +206,8 @@ pub enum SimpleType {
     QUint64,
 }
 
-impl SimpleType {
-    pub fn name(&self) -> &str {
+impl SimpleTypePrivate for SimpleType {
+    fn name(&self) -> &str {
         match self {
             SimpleType::QString => "QString",
             SimpleType::QByteArray => "QByteArray",
@@ -215,7 +225,7 @@ impl SimpleType {
             SimpleType::QUint64 => "quint64",
         }
     }
-    pub fn cpp_set_type(&self) -> &str {
+    fn cpp_set_type(&self) -> &str {
         match self {
             SimpleType::QString => "const QString&",
             SimpleType::QByteArray => "const QByteArray&",
@@ -233,7 +243,7 @@ impl SimpleType {
             SimpleType::QUint64 => "quint64",
         }
     }
-    pub fn c_set_type(&self) -> &str {
+    fn c_set_type(&self) -> &str {
         match self {
             SimpleType::QString => "qstring_t",
             SimpleType::QByteArray => "qbytearray_t",
@@ -251,7 +261,7 @@ impl SimpleType {
             SimpleType::QUint64 => "quint64",
         }
     }
-    pub fn rust_type(&self) -> &str {
+    fn rust_type(&self) -> &str {
         match self {
             SimpleType::QString => "String",
             SimpleType::QByteArray => "Vec<u8>",
@@ -269,7 +279,7 @@ impl SimpleType {
             SimpleType::QUint64 => "u64",
         }
     }
-    pub fn rust_type_init(&self) -> &str {
+    fn rust_type_init(&self) -> &str {
         match self {
             SimpleType::QString => "String::new()",
             SimpleType::QByteArray => "Vec::new()",
@@ -287,7 +297,7 @@ impl SimpleType {
             SimpleType::QUint64 => "0",
         }
     }
-    pub fn is_complex(self) -> bool {
+    fn is_complex(self) -> bool {
         self == SimpleType::QString || self == SimpleType::QByteArray
     }
 }
@@ -298,46 +308,46 @@ pub enum Type {
     Object(Rc<Object>),
 }
 
-impl Type {
-    pub fn is_object(&self) -> bool {
+impl TypePrivate for Type {
+    fn is_object(&self) -> bool {
         if let Type::Object(_) = self {
             true
         } else {
             false
         }
     }
-    pub fn is_complex(&self) -> bool {
+    fn is_complex(&self) -> bool {
         if let Type::Simple(simple) = self {
             simple.is_complex()
         } else {
             false
         }
     }
-    pub fn name(&self) -> &str {
+    fn name(&self) -> &str {
         match self {
             Type::Simple(s) => s.name(),
             Type::Object(o) => &o.name,
         }
     }
-    pub fn cpp_set_type(&self) -> &str {
+    fn cpp_set_type(&self) -> &str {
         match self {
             Type::Simple(s) => s.cpp_set_type(),
             Type::Object(o) => &o.name,
         }
     }
-    pub fn c_set_type(&self) -> &str {
+    fn c_set_type(&self) -> &str {
         match self {
             Type::Simple(s) => s.c_set_type(),
             Type::Object(o) => &o.name,
         }
     }
-    pub fn rust_type(&self) -> &str {
+    fn rust_type(&self) -> &str {
         match self {
             Type::Simple(s) => s.rust_type(),
             Type::Object(o) => &o.name,
         }
     }
-    pub fn rust_type_init(&self) -> &str {
+    fn rust_type_init(&self) -> &str {
         match self {
             Type::Simple(s) => s.rust_type_init(),
             Type::Object(_) => unimplemented!(),
@@ -360,25 +370,28 @@ pub struct ItemProperty {
     pub write: bool,
 }
 
-impl ItemProperty {
-    pub fn type_name(&self) -> &str {
+impl TypeName for ItemProperty {
+    fn type_name(&self) -> &str {
         self.item_property_type.name()
     }
-    pub fn is_complex(&self) -> bool {
+}
+
+impl ItemPropertyPrivate for ItemProperty {
+    fn is_complex(&self) -> bool {
         self.item_property_type.is_complex()
     }
-    pub fn cpp_set_type(&self) -> String {
+    fn cpp_set_type(&self) -> String {
         let mut t = self.item_property_type.cpp_set_type().to_string();
         if self.optional {
             t = "option_".to_string() + &t;
         }
         t
     }
-    pub fn c_get_type(&self) -> String {
+    fn c_get_type(&self) -> String {
         let name = self.item_property_type.name();
         name.to_string() + "*, " + &name.to_lowercase() + "_set"
     }
-    pub fn c_set_type(&self) -> &str {
+    fn c_set_type(&self) -> &str {
         self.item_property_type.c_set_type()
     }
 }
@@ -394,8 +407,8 @@ pub struct Function {
     pub arguments: Vec<Argument>,
 }
 
-impl Function {
-    pub fn type_name(&self) -> &str {
+impl TypeName for Function {
+    fn type_name(&self) -> &str {
         self.return_type.name()
     }
 }
@@ -408,8 +421,8 @@ pub struct Argument {
     pub argument_type: SimpleType,
 }
 
-impl Argument {
-    pub fn type_name(&self) -> &str {
+impl TypeName for Argument {
+    fn type_name(&self) -> &str {
         self.argument_type.name()
     }
 }
@@ -450,17 +463,12 @@ fn post_process_object(
     for p in &a.1.properties {
         properties.insert(p.0.clone(), post_process_property(p, b, c)?);
     }
-    let mut column_count = 1;
-    for ip in &a.1.item_properties {
-        column_count = column_count.max(ip.1.roles.len());
-    }
     let object = Rc::new(Object {
         name: a.0.clone(),
         object_type: a.1.object_type,
         functions: a.1.functions.clone(),
         item_properties: a.1.item_properties.clone(),
         properties,
-        column_count,
     });
     b.insert(a.0.clone(), object);
     Ok(())
diff --git a/src/configuration_private.rs b/src/configuration_private.rs
new file mode 100644
index 0000000..0834902
--- /dev/null
+++ b/src/configuration_private.rs
@@ -0,0 +1,48 @@
+use std::collections::BTreeSet;
+
+pub trait ConfigPrivate {
+    fn types(&self) -> BTreeSet<String>;
+    fn optional_types(&self) -> BTreeSet<String>;
+    fn has_list_or_tree(&self) -> bool;
+}
+
+pub trait ObjectPrivate {
+    fn contains_object(&self) -> bool;
+    fn column_count(&self) -> usize;
+}
+
+pub trait TypeName {
+    fn type_name(&self) -> &str;
+}
+
+pub trait TypePrivate {
+    fn is_object(&self) -> bool;
+    fn is_complex(&self) -> bool;
+    fn name(&self) -> &str;
+    fn cpp_set_type(&self) -> &str;
+    fn c_set_type(&self) -> &str;
+    fn rust_type(&self) -> &str;
+    fn rust_type_init(&self) -> &str;
+}
+
+pub trait PropertyPrivate {
+    fn is_object(&self) -> bool;
+    fn is_complex(&self) -> bool;
+    fn c_get_type(&self) -> String;
+}
+
+pub trait SimpleTypePrivate {
+    fn name(&self) -> &str;
+    fn cpp_set_type(&self) -> &str;
+    fn c_set_type(&self) -> &str;
+    fn rust_type(&self) -> &str;
+    fn rust_type_init(&self) -> &str;
+    fn is_complex(self) -> bool;
+}
+
+pub trait ItemPropertyPrivate {
+    fn is_complex(&self) -> bool;
+    fn cpp_set_type(&self) -> String;
+    fn c_get_type(&self) -> String;
+    fn c_set_type(&self) -> &str;
+}
diff --git a/src/cpp.rs b/src/cpp.rs
index 01ece0d..d03c0be 100644
--- a/src/cpp.rs
+++ b/src/cpp.rs
@@ -1,4 +1,5 @@
-use configuration::{Config, Function, ItemProperty, Object, ObjectType, Type};
+use configuration::*;
+use configuration_private::*;
 use std::io::{Result, Write};
 use util::{snake_case, write_if_different};
 
@@ -421,7 +422,7 @@ fn write_cpp_object(w: &mut Vec<u8>, o: &Object, conf: &Config) -> Result<()> {
     )?;
     if o.object_type != ObjectType::Object {
         writeln!(w, "void {}::initHeaderData() {{", o.name)?;
-        for col in 0..o.column_count {
+        for col in 0..o.column_count() {
             for (name, ip) in &o.item_properties {
                 let empty = Vec::new();
                 let roles = ip.roles.get(col).unwrap_or(&empty);
@@ -893,7 +894,9 @@ void {0}::fetchMore(const QModelIndex &parent)
     }}
 }}
 void {0}::updatePersistentIndexes() {{}}",
-            o.name, lcname, o.column_count
+            o.name,
+            lcname,
+            o.column_count()
         )?;
     } else {
         writeln!(
@@ -1002,7 +1005,9 @@ void {0}::updatePersistentIndexes() {{
     }}
     changePersistentIndexList(from, to);
 }}",
-            o.name, lcname, o.column_count
+            o.name,
+            lcname,
+            o.column_count()
         )?;
     }
     writeln!(
@@ -1017,7 +1022,7 @@ Qt::ItemFlags {0}::flags(const QModelIndex &i) const
     auto flags = QAbstractItemModel::flags(i);",
         o.name, lcname
     )?;
-    for col in 0..o.column_count {
+    for col in 0..o.column_count() {
         if is_column_write(o, col) {
             writeln!(w, "    if (i.column() == {}) {{", col)?;
             writeln!(w, "        flags |= Qt::ItemIsEditable;\n    }}")?;
@@ -1036,7 +1041,7 @@ Qt::ItemFlags {0}::flags(const QModelIndex &i) const
         o.name
     )?;
 
-    for col in 0..o.column_count {
+    for col in 0..o.column_count() {
         writeln!(w, "    case {}:", col)?;
         writeln!(w, "        switch (role) {{")?;
         for (i, (name, ip)) in o.item_properties.iter().enumerate() {
@@ -1125,7 +1130,7 @@ bool {0}::setHeaderData(int section, Qt::Orientation orientation, const QVariant
             "bool {}::setData(const QModelIndex &index, const QVariant &value, int role)\n{{",
             o.name
         )?;
-        for col in 0..o.column_count {
+        for col in 0..o.column_count() {
             if !is_column_write(o, col) {
                 continue;
             }
@@ -1294,7 +1299,7 @@ fn constructor_args(w: &mut Vec<u8>, prefix: &str, o: &Object, conf: &Config) ->
             o->endRemoveRows();
         }}",
             o.name,
-            o.column_count - 1
+            o.column_count() - 1
         )?;
     }
     if o.object_type == ObjectType::Tree {
@@ -1368,7 +1373,7 @@ fn constructor_args(w: &mut Vec<u8>, prefix: &str, o: &Object, conf: &Config) ->
         }}",
             o.name,
             lcname,
-            o.column_count - 1
+            o.column_count() - 1
         )?;
     }
     Ok(())
diff --git a/src/lib.rs b/src/lib.rs
index 2677df8..72e5f08 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -3,7 +3,8 @@ extern crate regex;
 extern crate serde_derive;
 extern crate serde_json;
 
-mod configuration;
+pub mod configuration;
+mod configuration_private;
 mod cpp;
 mod rust;
 mod util;
@@ -11,8 +12,17 @@ mod util;
 use std::error::Error;
 use std::fmt::Display;
 use std::path::Path;
+use configuration::Config;
 
-pub fn generate_rust_qt_bindings<P: AsRef<Path> + Display>(
+pub fn generate_bindings(config: &Config) -> Result<(), Box<Error>> {
+    cpp::write_header(config)?;
+    cpp::write_cpp(config)?;
+    rust::write_interface(config)?;
+    rust::write_implementation(config)?;
+    Ok(())
+}
+
+pub fn generate_bindings_from_config_file<P: AsRef<Path> + Display>(
     config_file: P,
     overwrite_implementation: bool,
 ) -> Result<(), Box<Error>> {
@@ -20,9 +30,5 @@ pub fn generate_rust_qt_bindings<P: AsRef<Path> + Display>(
     if overwrite_implementation {
         config.overwrite_implementation = true;
     }
-    cpp::write_header(&config)?;
-    cpp::write_cpp(&config)?;
-    rust::write_interface(&config)?;
-    rust::write_implementation(&config)?;
-    Ok(())
+    generate_bindings(&config)
 }
diff --git a/src/rust.rs b/src/rust.rs
index c13d003..e1d8186 100644
--- a/src/rust.rs
+++ b/src/rust.rs
@@ -1,6 +1,5 @@
-use configuration::{
-    Config, Function, ItemProperty, Object, ObjectType, Property, SimpleType, Type,
-};
+use configuration::*;
+use configuration_private::*;
 use std::io::{Result, Write};
 use util::{snake_case, write_if_different};
 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic