#! /usr/bin/env python

"""
Command line translator.  Use --parser (-p) and --generator (-g) to
name the module containing the Parser and Generator you want.


TODO:
   - we should have a list of modules we import and they
     should tell us the languages/suffixes/content-types
     they handle
   - allow input to be a URL; use its Content-Type
"""

__version__ = "$Revision: 1.1 $"

from optparse import OptionParser
import sys


def guess_language(filename):
    if filename.endswith(".asn"):
        return "asn0701"
    if filename.endswith(".asn0701"):
        return "asn0701"
    if filename.endswith(".rnc"):
        return "rnc"
    if filename.endswith(".owl"):
        return "owl"
    if filename.endswith(".rdf"):
        return "rdf"
    if filename.endswith(".dot"):
        return "graphviz"
    if filename.endswith(".py"):
        return "python"


parser = OptionParser(usage="%prog [options] [input [output]]",
                      version=__version__)
parser.add_option("-i", "--input", dest="input",
                  help="name of file (URL) to read from")
parser.add_option("-p", "--parser", dest="parser",
                  help="parser (input language) to use")
parser.add_option("-o", "--output", dest="output",
                  help="name of file to write to")
parser.add_option("-g", "--generator", dest="generator",
                  help="generator (output language) to use")
parser.add_option("-q", "--quiet",
                  action="store_false", dest="verbose", default=True,
                  help="don't print status messages to stdout")

(options, args) = parser.parse_args()

#print repr(options)
#print repr(args)

if not options.input:
    try:
        options.input = args.pop(0)
    except IndexError:
        options.input = "-"
if not options.output:
    try:
        options.output = args.pop(0)
    except IndexError:
        options.output = "-"
if args:
    parser.print_help()
    sys.exit(1)

#print repr(options)
#print "translating from", options.input, "to", options.output

if options.input == "-":
    inp = sys.stdin
else:
    inp = open(options.input, "r")

if options.output == "-":
    out = sys.stdout
else:
    out = open(options.output, "w")

if not options.parser:
    options.parser = guess_language(options.input)
    if not options.parser:
        print >>sys.stderr, "can't guess a parser; please specify one"
        sys.exit(1)
        
pmod=__import__(options.parser, globals(), locals(), [])    
p = pmod.Parser()
model = p.readModel(inp)

if not options.generator:
    options.generator = guess_language(options.output)
    if not options.generator:
        print >>sys.stderr, "can't guess a generator; please specify one"
        sys.exit(1)

gmod=__import__(options.generator, globals(), locals(), [])    

g = gmod.Generator()
g.writeModel(out, model)

