2024-08-02 22:22:11 +02:00
|
|
|
use reqwest::blocking::Client;
|
2024-08-02 22:29:22 +02:00
|
|
|
use reqwest::blocking::Response;
|
2024-08-01 18:30:14 +02:00
|
|
|
use std::error::Error;
|
|
|
|
|
|
|
|
// TODO: implement dry-run logic
|
|
|
|
pub struct HedgeDoc {
|
2024-08-02 22:29:22 +02:00
|
|
|
server_url: String,
|
|
|
|
is_dry_run: bool,
|
|
|
|
client: Client,
|
2024-08-01 18:30:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
impl HedgeDoc {
|
2024-08-02 22:29:22 +02:00
|
|
|
pub fn new(server_url: &str, is_dry_run: bool) -> Self {
|
2024-08-01 18:30:14 +02:00
|
|
|
Self { server_url: server_url.to_string(), is_dry_run, client: Client::new() }
|
|
|
|
}
|
|
|
|
|
2024-08-02 22:29:22 +02:00
|
|
|
pub fn format_url(&self, pad_name: &str) -> String {
|
|
|
|
format!("{}/{}", self.server_url, pad_name)
|
2024-08-01 18:30:14 +02:00
|
|
|
}
|
|
|
|
|
2024-08-02 22:29:22 +02:00
|
|
|
fn format_action(&self, pad_name: &str, verb: &str) -> String {
|
|
|
|
format!("{}/{}/{}", self.server_url, pad_name, verb)
|
2024-08-01 18:30:14 +02:00
|
|
|
}
|
|
|
|
|
2024-08-02 22:29:22 +02:00
|
|
|
fn do_request(&self, url: &str) -> Result<Response, Box<dyn Error>> {
|
|
|
|
Ok(self.client.get(url).send().unwrap())
|
2024-08-01 18:30:14 +02:00
|
|
|
}
|
|
|
|
|
2024-08-02 22:29:22 +02:00
|
|
|
fn get_id_from_response(&self, res: Response) -> String {
|
|
|
|
res.url().to_string().trim_start_matches(&format!("{}/", self.server_url)).to_string()
|
2024-08-01 18:30:14 +02:00
|
|
|
}
|
|
|
|
|
2024-08-02 22:29:22 +02:00
|
|
|
pub fn download(&self, pad_name: &str) -> Result<String, Box<dyn Error>> {
|
|
|
|
Ok(self.do_request(&self.format_action(pad_name, "download"))?.text()?)
|
2024-08-01 18:30:14 +02:00
|
|
|
}
|
|
|
|
|
2024-08-02 22:29:22 +02:00
|
|
|
pub fn create_pad(&self) -> Result<String, Box<dyn Error>> {
|
|
|
|
let res = self.do_request(&format!("{}/new", self.server_url)).unwrap();
|
2024-08-01 18:30:14 +02:00
|
|
|
if res.status().is_success() {
|
|
|
|
Ok(self.get_id_from_response(res))
|
|
|
|
} else {
|
2024-08-02 22:29:22 +02:00
|
|
|
Err(format!("Failed to create pad {}", res.status()).into())
|
2024-08-01 18:30:14 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-02 22:29:22 +02:00
|
|
|
pub fn import_note(&self, id: Option<&str>, content: String) -> Result<String, Box<dyn Error>> {
|
2024-08-01 18:30:14 +02:00
|
|
|
let url = match id {
|
2024-08-02 22:29:22 +02:00
|
|
|
Some(id) => self.format_url(&format!("new/{id}")),
|
2024-08-01 18:30:14 +02:00
|
|
|
None => self.format_url("new"),
|
|
|
|
};
|
|
|
|
|
2024-08-02 22:29:22 +02:00
|
|
|
let res =
|
|
|
|
self.client.post(&url).header("Content-Type", "text/markdown").body(content).send()?;
|
2024-08-01 18:30:14 +02:00
|
|
|
|
|
|
|
if res.status().is_success() {
|
|
|
|
Ok(self.get_id_from_response(res))
|
|
|
|
} else {
|
2024-08-02 22:29:22 +02:00
|
|
|
Err(format!("Failed to import note: {}", res.status()).into())
|
2024-08-01 18:30:14 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|