#!python
import sys
from thrift import generator
from thrift import cpp_generator
from thrift import php_generator
from thrift import parser

def thrift(source, cpp=False, java=False, perl=False, php=False, python=False, ruby=False, debug=False):

    generators = []

    if cpp:
	generators.append(cpp_generator.CPPGenerator())
    
    if php:
	generators.append(php_generator.PHPGenerator())
    
    p = parser.Parser(debug=debug)

    p.parse(source, False)

    for generator in generators:
	generator(p.program, source)

    if len(p.errors):
	return -1
    else:
	return 0

def main(args):

    cpp = False
    perl = False
    php = False
    python = False
    java = False
    ruby = False

    debug = False

    if "--cpp" in args:
	cpp = True
	args.remove("--cpp")
    if "--php" in args:
	php = True
	args.remove("--php")
    if "--debug" in args:
	debug = True
	args.remove("--debug")

    filename = args[-1]

    result = thrift(filename, cpp, java, perl, php, python, ruby, debug)

    sys.exit(result)

if __name__ == '__main__':
    main(sys.argv)

