rust_anonfiles_api/
lib.rs

1use curl::easy::{Easy, Form};
2use regex::Regex;
3use std::error;
4use std::str;
5
6fn send_post_req(url: &str, form_data: Option<Form>) -> Result<Vec<u8>, Box<dyn error::Error>> {
7    const STATUS_OK: u32 = 200;
8    let mut easy = Easy::new();
9
10    easy.url(url)?;
11    easy.post(true)?;
12
13    if let Some(form_data) = form_data {
14        easy.httppost(form_data)?;
15    }
16
17    let mut response_data = Vec::new();
18    {
19        let mut transfer = easy.transfer();
20        transfer.write_function(|new_data| {
21            response_data.extend_from_slice(new_data);
22            Ok(new_data.len())
23        })?;
24        transfer.perform()?;
25    }
26
27    let response_code = easy.response_code().unwrap();
28    if response_code != STATUS_OK {
29        return Err(format!(
30            "Error sending POST request! Response code: {}",
31            response_code
32        )
33        .into());
34    }
35
36    Ok(response_data)
37}
38
39fn get_load_link_fron_resp(data: Vec<u8>) -> Result<String, Box<dyn error::Error>> {
40    const SHORT_LINK_INDEX: u8 = 2;
41
42    let response = match str::from_utf8(&data) {
43        Ok(str_resp) => str_resp,
44        Err(e) => return Err(format!("Invalid UTF-8 sequence from response: {}", e).into()),
45    };
46
47    let regex = Regex::new(r#"("short":")(\S+)("},"metadata")"#).unwrap();
48    if let Some(captures) = regex.captures(response) {
49        if let Some(capture) = captures.get(SHORT_LINK_INDEX.into()) {
50            return Ok(capture.as_str().to_string());
51        }
52    }
53
54    Err(format!("Failed to parse json response! Response - {}", response).into())
55}
56
57pub fn upload_file(
58    path_to_file: impl AsRef<std::path::Path>,
59) -> Result<String, Box<dyn error::Error>> {
60    const ANONFILE_URL: &str = "https://anonfile.com/api/upload";
61
62    let file_path = path_to_file.as_ref();
63    if !file_path.exists() {
64        return Err(format!("File does not exist: {}", file_path.display()).into());
65    }
66
67    let mut form_data = Form::new();
68    if let Err(err) = form_data.part("file").file(&path_to_file).add() {
69        return Err(format!("Anonfile: Error uploading file! {}", err.description()).into());
70    }
71
72    let resp_data = send_post_req(ANONFILE_URL, Some(form_data))?;
73    get_load_link_fron_resp(resp_data).into()
74}