pythonic 0.3.0

pythonic is a Rust AST builder that generates Python
Documentation
extern crate pythonic;

use pythonic::{Argument, Assignment, Block, Class, Function, KeywordArgument, Statement};

fn main() {
    let mut program = Block::new();
    let mut class = Class::new("Greeter", &program);
    class.add_docstring("Greeter is a class to say Hello!");
    let arguments = vec![
      Argument::new("self", None, None, None),
      Argument::new("name", Some("\"World\""), Some("str"), Some("The name to greet")),
    ];
    let mut init = Function::new("__init__", arguments, &class.block);

    init.add_docstring("Set up name variable for the Greeter");
    init.add_statement(
      Statement::Assignment(
        Assignment::new(
          Argument::variable("self.name"), Statement::variable("name"))));
    class.add_statement(Statement::Function(init));
    let arguments = vec![
      Argument::new("self", None, None, None),
    ];
    let mut hello = Function::new("hello", arguments, &class.block);
    hello.add_docstring("Say hello to self.name");
    let print = Statement::function_call(
      "print",
      vec![
        Statement::unnamed_variable("Hello"),
        Statement::variable("self.name"),
        Statement::unnamed_variable("!"),
      ]);
    hello.add_statement(print);
    class.add_statement(Statement::Function(hello));
    program.add_statement(Statement::Class(class));
    program.add_statement(
        Statement::Assignment(Assignment::new(
            Argument::variable("g"),
            Statement::function_call(
                "Greeter",
                vec![
                    Statement::KeywordArgument(KeywordArgument::new("name", "\"Chris\""))
                ]
            )
    )));
    let function_call = Statement::function_call(
      "g.hello",
      vec![]);
    program.add_statement(function_call);
    let expected = r#"class Greeter:
    """
    Greeter is a class to say Hello!
    """

    def __init__(self, name="World"):
        """
        Set up name variable for the Greeter

        :param name: str The name to greet
        """
        self.name = name

    def hello(self):
        """
        Say hello to self.name
        """
        print("Hello", self.name, "!")


g = Greeter(name="Chris")
g.hello()
"#;
    let actual = format!("{}", program);

    assert_eq!(expected, actual);

    println!("{}", actual);
}