use std:: {
error::Error,
fs::{create_dir_all, File},
io::{Error as io_error, Read, Write, },
path::{Path, PathBuf},
fmt,
};
use serde::de;
use reqwest::Url;
#[allow(dead_code)]
pub fn get_folder_path(base_url: &str, endpoint: &str) -> String {
let parsed_url = Url::parse(base_url).unwrap_or_else(|_| panic!("Failed to parse URL: {}", base_url));
parsed_url.domain().map(|domain| format!("{}/{}/", endpoint, domain)).unwrap_or("/temp".to_string())
}
pub fn build_path(folder_name: &str, file_name: &str) -> PathBuf {
let file_name = file_name.to_lowercase();
let file_name = format!("{}.json", file_name);
let path = Path::new("./files").join(folder_name).join(file_name);
if let Some(parent_path) = path.parent() {
create_dir_all(parent_path).expect("Unable to create directory!");
}
path
}
pub fn data_to_json(
folder_name: &str,
file_name: &str,
data: &str,
) -> Result<(), Box<dyn Error>> {
let path = build_path(folder_name, file_name);
let mut file = File::create(path)?;
file.write_all(data.as_bytes())?;
Ok(())
}
pub fn data_from_json(folder_name: &str, file_name: &str) -> Result<String, io_error> {
let path = build_path(folder_name, file_name);
let mut file = File::open(path)?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
Ok(contents)
}
struct F64Visitor;
impl<'de> de::Visitor<'de> for F64Visitor {
type Value = f64;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a string representation of f64")
}
fn visit_str<E>(self, value: &str) -> Result<f64, E>
where
E: de::Error,
{
value.parse::<f64>().map_err(E::custom)
}
}
pub fn string_to_f64<'de, D>(deserializer: D) -> Result<f64, D::Error>
where
D: de::Deserializer<'de>,
{
deserializer.deserialize_string(F64Visitor)
}
#[derive(Debug)]
pub struct CustomError(String);
impl fmt::Display for CustomError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.0) }
}
impl Error for CustomError {}
impl CustomError {
pub fn new(msg: String) -> CustomError { CustomError(msg) }
}