extern crate pythonic;
use pythonic::{Argument, Assignment, Block, Class, Function, FunctionCall, 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::input("self.name"), Statement::Argument(Argument::input("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 = FunctionCall::new(
"print",
vec![
Statement::Argument(Argument::bare("Hello")),
Statement::Argument(Argument::input("self.name")),
Statement::Argument(Argument::bare("!")),
]);
hello.add_statement(Statement::FunctionCall(print));
class.add_statement(Statement::Function(hello));
program.add_statement(Statement::Class(class));
program.add_statement(
Statement::Assignment(Assignment::new(
Argument::input("g"),
Statement::FunctionCall(FunctionCall::new(
"Greeter",
vec![
Statement::KeywordArgument(KeywordArgument::new("name", "\"Chris\""))
]
))
)));
let function_call = FunctionCall::new(
"g.hello",
vec![]);
program.add_statement(Statement::FunctionCall(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);
}