use std::fs::File;
use std::io::BufReader;
use std::path::Path;
use serde_json::Value;
use crate::error::ErrorKind;
use crate::Result;
fn overwrite(home_dir: impl AsRef<Path>, value: Value) -> Result<()> {
let home_dir = home_dir.as_ref();
let config_file =
File::open(home_dir.join("config.json")).map_err(|err| ErrorKind::Io.custom(err))?;
let config = BufReader::new(config_file);
let mut config: Value =
serde_json::from_reader(config).map_err(|err| ErrorKind::DataConversion.custom(err))?;
json_patch::merge(&mut config, &value);
let config_file =
File::create(home_dir.join("config.json")).map_err(|err| ErrorKind::Io.custom(err))?;
serde_json::to_writer(config_file, &config).map_err(|err| ErrorKind::Io.custom(err))?;
Ok(())
}
fn parse_env<T>(env_var: &str) -> Result<Option<T>>
where
T: std::str::FromStr,
T::Err: std::error::Error + Send + Sync + 'static,
{
match std::env::var(env_var) {
Ok(val) => {
let val = val
.parse::<T>()
.map_err(|err| ErrorKind::DataConversion.custom(err))?;
Ok(Some(val))
}
Err(_err) => Ok(None),
}
}
pub(crate) fn set_sandbox_configs(home_dir: impl AsRef<Path>) -> Result<()> {
overwrite(
home_dir,
serde_json::json!({
"rpc": {
"limits_config": {
"json_payload_max_size": parse_env("UNC_SANDBOX_MAX_PAYLOAD_SIZE")?.unwrap_or(1024 * 1024 * 1024),
},
},
"store": {
"max_open_files": parse_env("UNC_SANDBOX_MAX_FILES")?.unwrap_or(3000),
}
}),
)
}