use std::path::PathBuf;
use syn::{
parse::{Parse, ParseStream},
LitInt, LitStr,
};
pub(super) struct CompressParams {
pub(super) file_path: PathBuf,
pub(super) compression_level: u8,
}
impl Parse for CompressParams {
fn parse(input: ParseStream) -> Result<Self, syn::Error> {
let file_path_lit: LitStr = input.parse()?;
input.parse::<syn::Token![,]>()?;
let compression_level_lit: LitInt = input.parse()?;
if !input.is_empty() {
return Err(
input.error("Just file path + compression params are supported at this moment")
);
}
let full_file_path = {
let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").map_err(|err| {
syn::Error::new(
file_path_lit.span(),
format_args!("`CARGO_MANIFEST_DIR` variable is not available: {}", err),
)
})?;
PathBuf::from(manifest_dir).join(file_path_lit.value())
};
if !full_file_path.exists() {
return Err(syn::Error::new(
file_path_lit.span(),
format_args!("File `{}` does not exist", full_file_path.display()),
));
}
let compression_level = compression_level_lit.base10_parse::<u8>()?;
if !(1_u8..=9_u8).contains(&compression_level) {
return Err(syn::Error::new(
compression_level_lit.span(),
"Compression level must be in range `1..=9`",
));
}
Ok(CompressParams {
file_path: full_file_path,
compression_level,
})
}
}