use argh::FromArgs;
use clipboard::{ClipboardContext, ClipboardProvider};
use std::io::Write;
use std::process::{Command, Stdio};
fn main() {
let args: Args = argh::from_env();
if args.trigger_function {
run_clipboard_tests();
} else {
run_clipboard_code();
}
}
#[derive(FromArgs, Debug)]
struct Args {
#[argh(switch, short = 't')]
trigger_function: bool,
}
fn run_clipboard_tests() {
let mut clipboard: ClipboardContext =
ClipboardProvider::new().expect("Failed to access clipboard.");
let code = clipboard
.get_contents()
.expect("Failed to read clipboard contents.");
let mut rustc_process_test = Command::new("rustc")
.arg("--test")
.arg("-")
.arg("-o")
.arg("/tmp/clipboard_test_program") .stdin(Stdio::piped())
.stdout(Stdio::inherit())
.stderr(Stdio::inherit())
.spawn()
.expect("Failed to start rustc process");
{
let stdin_t = rustc_process_test
.stdin
.as_mut()
.expect("Failed to open rustc stdin");
stdin_t
.write_all(code.as_bytes())
.expect("Failed to write code to rustc");
}
let rust_status = rustc_process_test
.wait()
.expect("Failed to wait for rustc test");
if !rust_status.success() {
eprintln!("Compilation failed");
return;
}
let run_status = Command::new("/tmp/clipboard_test_program")
.stdout(Stdio::inherit())
.stderr(Stdio::inherit())
.status()
.expect("Failed to execute compiled program");
if !run_status.success() {
eprintln!("Execution failed");
}
}
fn run_clipboard_code() {
let mut clipboard: ClipboardContext =
ClipboardProvider::new().expect("Failed to access clipboard.");
let code = clipboard
.get_contents()
.expect("Failed to read clipboard contents.");
let mut rustc_process = Command::new("rustc")
.arg("-o")
.arg("/tmp/clipboard_program") .arg("-")
.stdin(Stdio::piped())
.stdout(Stdio::inherit())
.stderr(Stdio::inherit())
.spawn()
.expect("Failed to start rustc process");
{
let stdin = rustc_process
.stdin
.as_mut()
.expect("Failed to open rustc stdin");
stdin
.write_all(code.as_bytes())
.expect("Failed to write code to rustc");
}
let rustc_status = rustc_process.wait().expect("Failed to wait for rustc");
if !rustc_status.success() {
eprintln!("Compilation failed");
return;
}
let run_status = Command::new("/tmp/clipboard_program")
.stdout(Stdio::inherit())
.stderr(Stdio::inherit())
.status()
.expect("Failed to execute compiled program");
if !run_status.success() {
eprintln!("Execution failed");
}
}