use std::env;
use std::fs::File;
use std::io::Write;
use std::str::FromStr;
fn parse_value_from_config_with_default<T: FromStr>(
key: &str,
default: Option<T>,
) -> Result<T, String> {
match env::var(key) {
Ok(value) => match value.parse::<T>() {
Ok(val) => Ok(val),
Err(_) => {
Err(format!("env var '{}' with value '{}' cannot be parsed into type '{2}'. Please set an env var can be parsed into '{2}'", key, value, std::any::type_name::<T>()))
}
},
Err(_) => match default {
Some(val) => Ok(val),
None => {
eprintln!("MAX_LOGGER_CAPACITY environment variable is not set");
Err(format!("env '{}' is not set and there are no defaults for it. Please set it in your env.", key))
}
},
}
}
fn main() {
println!("cargo:rerun-if-env-changed=QUICKLOG_MAX_SERIALIZE_BUFFER_CAPACITY");
let max_buffer_capacity = match parse_value_from_config_with_default(
"QUICKLOG_MAX_SERIALIZE_BUFFER_CAPACITY",
Some(1_000_000_usize),
) {
Ok(val) => val,
Err(err) => {
println!("cargo:warning={}", err);
1_000_000
}
};
println!("cargo:rerun-if-env-changed=QUICKLOG_MAX_LOGGER_CAPACITY");
let max_logger_capacity = match parse_value_from_config_with_default(
"QUICKLOG_MAX_LOGGER_CAPACITY",
Some(1_000_000_usize),
) {
Ok(val) => val,
Err(err) => {
println!("cargo:warning={}", err);
1_000_000
}
};
let rust_code = format!(
"// This file was generated by `build.rs`, do not modify this file manually!
/// Sets max capacity of logging queue, can be set through env var `QUICKLOG_MAX_LOGGER_CAPACITY`.
pub const MAX_LOGGER_CAPACITY: usize = {};
/// Sets max capacity of byte buffer used for serialization with `^` prefix in logging, can be set through `QUICKLOG_MAX_SERIALIZE_BUFFER_CAPACITY`.
pub const MAX_SERIALIZE_BUFFER_CAPACITY: usize = {};
",
max_logger_capacity, max_buffer_capacity
);
let dest_path = std::path::Path::new("").join("src/constants.rs");
match File::create(dest_path) {
Ok(mut file) => {
if let Err(err) = file.write_all(rust_code.as_bytes()) {
println!("cargo:warning={}", err)
}
}
Err(err) => println!("cargo:warning={}", err),
}
}