Sha256: 8583b25256f788a4c6f2f3e6a9d6dbb7f594c4ade8025a6a30b29ba9d8b89592

Contents?: true

Size: 982 Bytes

Versions: 1

Compression:

Stored size: 982 Bytes

Contents

require "readline"
require "tmpdir"
require "open3"

module IRust
  module_function

  def read
    Readline.readline("irust> ", true)
  end

  def rust_program(line)
<<-RUST
#[feature(globs, macro_rules, struct_variant)];
extern mod extra;

fn main() {
  let r = {
    fn type_of<T>(_: &T) -> &'static str { unsafe {
    (*std::unstable::intrinsics::get_tydesc::<T>()).name } } struct
    Foo<T>(T);
    #{line}
  };
  println!("{:?}", r)
}
RUST
  end

  def compile(tmpdir)
    Dir.chdir(tmpdir) do
      stdin, stderr, status = Open3.capture3("rustc irust.rs")

      if status.success?
        true
      else
        STDERR.puts stderr
        false
      end
    end
  end

  def eval(line)
    exit 0 if line.nil?

    Dir.mktmpdir do |tmpdir|
      input_src = File.join(tmpdir, "irust.rs")
      File.write input_src, rust_program(line)

      if compile(tmpdir)
        system input_src.sub(/\.rs$/, '')
      end
    end
  end

  def run
    loop { eval read }
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
irust-1.0.1 lib/irust.rb