rust_anonfiles_api/
lib.rs1use 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}