changeset 1:b90e49ab734b

Factorise conversion of Python str into Rust String.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Tue, 31 May 2016 00:52:00 +0100
parents 211b0df72e64
children 5fc7c2790d8c
files src/ast_convert.rs src/ast_dump.rs src/python_ast.rs src/python_dump.rs
diffstat 4 files changed, 43 insertions(+), 80 deletions(-) [+]
line wrap: on
line diff
--- a/src/ast_convert.rs
+++ b/src/ast_convert.rs
@@ -3,6 +3,12 @@ use python_ast::{Module, Statement, Expr
 use cpython::{Python, PyObject};
 use cpython::ObjectProtocol; //for call method
 
+fn get_str(py: Python, object: PyObject) -> String {
+    let pystring = object.str(py).unwrap();
+    let mut string = pystring.to_string(py).unwrap();
+    string.to_mut().to_string()
+}
+
 fn parse_expr_vec(py: Python, ast: PyObject) -> Vec<Expr> {
     let builtins_module = py.import("builtins").unwrap();
     let isinstance = builtins_module.get(py, "isinstance").unwrap();
@@ -84,44 +90,24 @@ fn parse_expr(py: Python, ast: PyObject)
     assert!(is_instance(&ast, &ast_type));
 
     if is_instance(&ast, &arg_type) {
-        let arg = {
-            let arg = ast.getattr(py, "arg").unwrap();
-            let arg = arg.str(py).unwrap();
-            let mut arg = arg.to_string(py).unwrap();
-            arg.to_mut().to_string()
-        };
+        let arg = ast.getattr(py, "arg").unwrap();
+        let arg = get_str(py, arg);
         Expr::Name(arg)
     } else if is_instance(&ast, &name_type) {
-        let id = {
-            let id = ast.getattr(py, "id").unwrap();
-            let id = id.str(py).unwrap();
-            let mut id = id.to_string(py).unwrap();
-            id.to_mut().to_string()
-        };
+        let id = ast.getattr(py, "id").unwrap();
+        let id = get_str(py, id);
         Expr::Name(id)
     } else if is_instance(&ast, &name_constant_type) {
-        let value = {
-            let value = ast.getattr(py, "value").unwrap();
-            let value = value.str(py).unwrap();
-            let mut value = value.to_string(py).unwrap();
-            value.to_mut().to_string()
-        };
+        let value = ast.getattr(py, "value").unwrap();
+        let value = get_str(py, value);
         Expr::NameConstant(value)
     } else if is_instance(&ast, &num_type) {
-        let n = {
-            let n = ast.getattr(py, "n").unwrap();
-            let n = n.str(py).unwrap();
-            let mut n = n.to_string(py).unwrap();
-            n.to_mut().to_string()
-        };
+        let n = ast.getattr(py, "n").unwrap();
+        let n = get_str(py, n);
         Expr::Num(n)
     } else if is_instance(&ast, &str_type) {
-        let s = {
-            let s = ast.getattr(py, "s").unwrap();
-            let s = s.str(py).unwrap();
-            let mut s = s.to_string(py).unwrap();
-            s.to_mut().to_string()
-        };
+        let s = ast.getattr(py, "s").unwrap();
+        let s = get_str(py, s);
         Expr::Str(s)
     } else if is_instance(&ast, &bin_op_type) {
         let left = ast.getattr(py, "left").unwrap();
@@ -151,21 +137,11 @@ fn parse_expr(py: Python, ast: PyObject)
         let name = ast.getattr(py, "name").unwrap();
         let asname = ast.getattr(py, "asname").unwrap();
 
-        let name = {
-            let name = name.str(py).unwrap();
-            let mut name = name.to_string(py).unwrap();
-            name.to_mut().to_string()
-        };
-
-        let asname = {
-            let asname = asname.str(py).unwrap();
-            let mut asname = asname.to_string(py).unwrap();
-            let asname = asname.to_mut().to_string();
-            if asname == "None" {
-                "".to_string()
-            } else {
-                asname
-            }
+        let name = get_str(py, name);
+        let asname = if asname == py.None() {
+            None
+        } else {
+            Some(get_str(py, asname))
         };
 
         Expr::Alias(name, asname)
@@ -241,12 +217,7 @@ fn parse_statement(py: Python, ast: PyOb
         let args = ast.getattr(py, "args").unwrap();
         let body = ast.getattr(py, "body").unwrap();
 
-        let name = {
-            let name = name.str(py).unwrap();
-            let mut name = name.to_string(py).unwrap();
-            name.to_mut().to_string()
-        };
-
+        let name = get_str(py, name);
         let args = parse_expr_vec(py, args);
         /*
         let mut arguments = vec!();
@@ -268,11 +239,8 @@ fn parse_statement(py: Python, ast: PyOb
 
         let mut globals = vec!();
         for name in names.iter(py).unwrap() {
-            let name = {
-                let name = name.unwrap().str(py).unwrap();
-                let mut name = name.to_string(py).unwrap();
-                name.to_mut().to_string()
-            };
+            let name = name.unwrap();
+            let name = get_str(py, name);
             globals.push(name);
         }
 
@@ -286,13 +254,15 @@ fn parse_statement(py: Python, ast: PyOb
 
         let mut statements = vec!();
         for statement in body.iter(py).unwrap() {
-            let statement = parse_statement(py, statement.unwrap());
+            let statement = statement.unwrap();
+            let statement = parse_statement(py, statement);
             statements.push(statement);
         }
 
         let mut orelse_ = vec!();
         for statement in orelse.iter(py).unwrap() {
-            let statement = parse_statement(py, statement.unwrap());
+            let statement = statement.unwrap();
+            let statement = parse_statement(py, statement);
             orelse_.push(statement);
         }
 
@@ -303,7 +273,8 @@ fn parse_statement(py: Python, ast: PyOb
 
         let mut arguments = vec!();
         for target in targets.iter(py).unwrap() {
-            let target = parse_expr(py, target.unwrap());
+            let target = target.unwrap();
+            let target = parse_expr(py, target);
             arguments.push(target);
         }
 
@@ -315,11 +286,7 @@ fn parse_statement(py: Python, ast: PyOb
         let names = ast.getattr(py, "names").unwrap();
         //let level = ast.getattr(py, "level").unwrap();
 
-        let module = {
-            let module = module.str(py).unwrap();
-            let mut module = module.to_string(py).unwrap();
-            module.to_mut().to_string()
-        };
+        let module = get_str(py, module);
 
         let mut names_ = vec!();
         for alias in names.iter(py).unwrap() {
--- a/src/ast_dump.rs
+++ b/src/ast_dump.rs
@@ -46,10 +46,9 @@ impl Expr {
                 arguments.join(", ")
             }),
             Expr::Alias(name, asname) => {
-                if asname.is_empty() {
-                    format!("{}", name)
-                } else {
-                    format!("{} as {}", name, asname)
+                match asname {
+                    None => format!("{}", name),
+                    Some(asname) => format!("{} as {}", name, asname)
                 }
             }
             Expr::Name(name) => format!("{}", name),
--- a/src/python_ast.rs
+++ b/src/python_ast.rs
@@ -21,7 +21,7 @@ pub enum Expr {
     BinOp(Box<Expr>, BinOp, Box<Expr>),
     Compare(Box<Expr>, Vec<BinOp>, Vec<Expr>),
     Call(Box<Expr>, Vec<Expr>),
-    Alias(String, String),
+    Alias(String, Option<String>),
     Name(String),
     NameConstant(String),
     Str(String),
--- a/src/python_dump.rs
+++ b/src/python_dump.rs
@@ -52,6 +52,12 @@ fn dump(py: Python, indent: usize, ast: 
     };
     */
 
+    fn get_str(py: Python, object: PyObject) -> String {
+        let pystring = object.str(py).unwrap();
+        let mut string = pystring.to_string(py).unwrap();
+        string.to_mut().to_string()
+    }
+
     if is_instance(&ast, &function_def_type) {
         let name = ast.getattr(py, "name").unwrap();
         let args = ast.getattr(py, "args").unwrap();
@@ -181,17 +187,8 @@ fn dump(py: Python, indent: usize, ast: 
         let name = ast.getattr(py, "name").unwrap();
         let asname = ast.getattr(py, "asname").unwrap();
 
-        let name = {
-            let name = name.str(py).unwrap();
-            let mut name = name.to_string(py).unwrap();
-            name.to_mut().to_string()
-        };
-
-        let asname = {
-            let asname = asname.str(py).unwrap();
-            let mut asname = asname.to_string(py).unwrap();
-            asname.to_mut().to_string()
-        };
+        let name = get_str(py, name);
+        let asname = get_str(py, asname);
 
         if asname == "None" {
             format!("{}", name)