#!/usr/bin/env ruby # frozen_string_literal: true require "optparse" require_relative "../lib/code-ruby" options = { timeout: 0, profile: false, profiler: "text", input: "", parse: false } argv = OptionParser .new do |opts| opts.banner = "Usage: code INPUT\n\n" opts.on("-v", "--version", "Version of Code") do |_input| puts Code::Version exit end opts.on( "-i INPUT", "--input INPUT", "Input in the Code language (String or File)" ) do |input| input = File.read(input) if File.exist?(input) options[:input] = input end opts.on("-p", "--parse", "Parser tree for input") do |parse| options[:parse] = parse end opts.on( "-t TIMEOUT", "--timeout TIMEOUT", "Set timeout in seconds" ) { |timeout| options[:timeout] = timeout.to_f } opts.on( "-z TIME_ZONE", "--time-zone TIME_ZONE", "Set time zone" ) { |time_zone| Time.zone = time_zone } opts.on("--profile", "Profile Ruby code") do |_timeout| require "ruby-prof" options[:profile] = true end opts.on( "--profiler TYPE", "Profiler output type (text (default) or html)" ) do |profiler| require "ruby-prof" options[:profile] = true options[:profiler] = profiler end end .parse! options[:input] = argv.join(" ") if options[:input].empty? abort <<~HELP if options[:input].empty? Usage: code INPUT -v, --version Version of Code -i, --input INPUT Input in the Code language (String or File) -p, --parse Parser tree for input -t, --timeout TIMEOUT Set timeout in seconds --profile Profile Ruby code --profiler TYPE Profiler output type (text (default) or html) HELP RubyProf.start if options[:profile] if options[:parse] pp Code::Parser.parse(options[:input]).to_raw else print Code.evaluate( options[:input], output: $stdout, error: $stderr, timeout: options[:timeout] ) end if options[:profile] result = RubyProf.stop if options[:profiler] == "text" printer = RubyProf::FlatPrinter.new(result) printer.print($stdout) elsif options[:profiler] == "html" printer = RubyProf::GraphHtmlPrinter.new(result) printer.print($stdout) else abort "#{options[:profiler]} not recognized" end end