use std::process;
use std::path::Path;
use super::Error;
use super::query::*;
pub fn compile(sketch: &Path) -> Result<(), Error> {
let path = sketch_to_str(sketch)?;
let fqbn = query(Query::Fqbn)?;
let compilation_result = process::Command::new("arduino-cli")
.args(&["compile", "--fqbn", &fqbn[..], path])
.stdout(process::Stdio::null())
.stderr(process::Stdio::null())
.status();
match compilation_result {
Ok(status) if status.success() => Ok(()),
_ => Err(Error::CommandFailure),
}
}
pub fn upload(sketch: &Path) -> Result<(), Error> {
let path = sketch_to_str(sketch)?;
let fqbn = query(Query::Fqbn)?;
let port = query(Query::Port)?;
let compilation_result = process::Command::new("arduino-cli")
.args(&["upload", "--port", &port[..], "--fqbn", &fqbn[..], path])
.stdout(process::Stdio::null())
.stderr(process::Stdio::null())
.status();
match compilation_result {
Ok(status) if status.success() => Ok(()),
_ => Err(Error::CommandFailure),
}
}
fn sketch_to_str(sketch: &Path) -> Result<&str, Error> {
match sketch.to_str() {
Some(path) if sketch.is_dir() => Ok(path),
_ => Err(Error::InvalidSketchPath),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn invalid_sketch_path() {
let invalid_path = Path::new(":X/\\:y/z");
let result = sketch_to_str(invalid_path);
let err = result.unwrap_err();
assert_eq!(err, Error::InvalidSketchPath);
}
}