use std::fmt::{Display, Formatter, Result};
use {Argument, Assignment, Class, Comment, Function, FunctionCall, KeywordArgument};
#[derive(Debug, Clone)]
pub enum Statement {
Argument(Argument),
Assignment(Assignment),
Class(Class),
Comment(Comment),
Function(Function),
FunctionCall(FunctionCall),
KeywordArgument(KeywordArgument),
}
impl Display for Statement {
fn fmt(&self, f: &mut Formatter) -> Result {
let s: String = match self {
&Statement::Argument(ref s) => format!("{}", s),
&Statement::Assignment(ref s) => format!("{}", s),
&Statement::Comment(ref s) => format!("{}", s),
&Statement::Class(ref s) => format!("{}", s),
&Statement::FunctionCall(ref s) => format!("{}", s),
&Statement::Function(ref s) => format!("{}", s),
&Statement::KeywordArgument(ref s) => format!("{}", s),
};
write!(f, "{}", s)
}
}
impl Statement {
pub fn variable<T: Display>(name: T) -> Statement {
Statement::Argument(Argument::variable(name))
}
pub fn unnamed_variable<T: Display>(value: T) -> Statement {
Statement::Argument(Argument::Unnamed(value.to_string()))
}
pub fn function_call<T: Display>(name: T, arguments: Vec<Statement>) -> Statement {
Statement::FunctionCall(FunctionCall {
name: name.to_string(),
arguments: arguments,
})
}
}