2020-10-25 18:53:24 +00:00
|
|
|
use anyhow::Result;
|
|
|
|
use cargo_toml::Manifest;
|
|
|
|
use std::fs::{self, File};
|
|
|
|
use std::io::Read;
|
|
|
|
|
|
|
|
fn get_file_as_byte_vec(filename: &str) -> Option<Vec<u8>> {
|
|
|
|
let f = File::open(&filename);
|
|
|
|
if f.is_err() {
|
2020-10-25 19:37:16 +00:00
|
|
|
log::debug!("can't read from Cargo.toml: {:?}", f.unwrap_err());
|
2020-10-25 18:53:24 +00:00
|
|
|
return None;
|
|
|
|
}
|
|
|
|
let mut f = f.unwrap();
|
|
|
|
let metadata = fs::metadata(&filename).expect("unable to read metadata");
|
|
|
|
let mut buffer = vec![0; metadata.len() as usize];
|
|
|
|
f.read(&mut buffer).expect("buffer overflow");
|
|
|
|
|
|
|
|
Some(buffer)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn read() -> Result<Option<String>> {
|
2020-10-25 19:37:16 +00:00
|
|
|
log::debug!("reading version from Cargo.toml");
|
2020-10-25 18:53:24 +00:00
|
|
|
let bytes = get_file_as_byte_vec("Cargo.toml");
|
2020-10-25 19:37:16 +00:00
|
|
|
log::debug!("{:?}", bytes);
|
2020-10-25 18:53:24 +00:00
|
|
|
|
|
|
|
match bytes {
|
|
|
|
Some(bytes) => {
|
2020-10-25 19:37:16 +00:00
|
|
|
log::trace!("reading toml");
|
|
|
|
let pkg : Result<Manifest, _> = toml::from_slice(&bytes);
|
|
|
|
match pkg {
|
|
|
|
Err(why) => {
|
|
|
|
log::error!("error parsing Cargo.toml: {:?}", why);
|
|
|
|
Err(why.into())
|
|
|
|
}
|
|
|
|
Ok(pkg) => {
|
|
|
|
let version = pkg.package.unwrap().version;
|
|
|
|
log::trace!("got version {}", version);
|
|
|
|
Ok(Some(version))
|
|
|
|
}
|
|
|
|
}
|
2020-10-25 18:53:24 +00:00
|
|
|
}
|
|
|
|
None => Ok(None)
|
|
|
|
}
|
|
|
|
}
|
2020-10-25 19:04:04 +00:00
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
#[test]
|
|
|
|
fn read() {
|
|
|
|
use super::read;
|
|
|
|
read().unwrap().unwrap();
|
|
|
|
}
|
|
|
|
}
|