#!/usr/bin/env ruby
#-*-ruby-*-
require "dpklib/command"
require "dpklib/file"
require "dpklib/parsearg"
require "misen/util"

module Misen
  class MisenExpandProgram < Dpklib::CommandLineProgram
    DEFAULT_STYLE_EXPR = "Misen::STYLE_SGML"

    def start
      opts = Dpklib.parse_args(argv, "r::s:ef", "help") || usage
      usage if opts[:help] || opts.empty?
      unless opts[:e] || opts[:f]
        die("Either -e or -f option must be given. Try '#{progname} --help'.")
      end
      
      for feature in opts[:r]
        require(feature)
      end

      style = opts[:s] || DEFAULT_STYLE_EXPR
      style = eval(style)
      style.kind_of?(Misen::Style) || die("Style object is not given.")
      
      src = if opts[:e]
              opts.shift
            elsif opts[:s]
              Dpklib.read_file(opts.shift)
            end
      data = eval(src)
      result = Misen.expand_text(style, stdin.read, data)
      stdout.print(result)
    end

    def usage
      die "
This program reads text from standard input, then expands it with
given data and prints result into starndard output.

usage: #{progname} [OPTIONS] (-e|-f) EXPR_OR_FILE
OPTIONS:
  -r FEATURE:
    Loads FEATURE.
  -s STYLE: (default: #{DEFAULT_STYLE_EXPR})
    Text style. Expression STYLE must give a Misen::Style object.
-e:
  Evaluates string EXPR_OR_FILE as data.
-f:
  Reads script from file EXPR_OR_FILE, then evaluates it as data.
"
    end
  end #/MisenExpandProgram
end #/Misen

Misen::MisenExpandProgram.execute
