2024-08-02 22:22:11 +02:00
|
|
|
use reqwest::blocking::Response;
|
|
|
|
use reqwest::blocking::Client;
|
2024-08-01 18:30:14 +02:00
|
|
|
use std::error::Error;
|
|
|
|
|
|
|
|
// TODO: implement dry-run logic
|
|
|
|
pub struct HedgeDoc {
|
|
|
|
server_url : String,
|
|
|
|
is_dry_run : bool,
|
|
|
|
client : Client,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl HedgeDoc {
|
|
|
|
pub fn new( server_url: &str, is_dry_run: bool ) -> Self {
|
|
|
|
Self { server_url: server_url.to_string(), is_dry_run, client: Client::new() }
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn format_url( &self, pad_name: &str ) -> String {
|
|
|
|
format!( "{}/{}", self.server_url, pad_name )
|
|
|
|
}
|
|
|
|
|
|
|
|
fn format_action( &self, pad_name: &str, verb: &str ) -> String {
|
|
|
|
format!( "{}/{}/{}", self.server_url, pad_name, verb )
|
|
|
|
}
|
|
|
|
|
2024-08-02 22:22:11 +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
|
|
|
}
|
|
|
|
|
|
|
|
fn get_id_from_response( &self, res : Response ) -> String {
|
|
|
|
res.url().to_string().trim_start_matches( &format!( "{}/", self.server_url ) ).to_string()
|
|
|
|
}
|
|
|
|
|
2024-08-02 22:22:11 +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:22:11 +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:22:11 +02:00
|
|
|
Err( format!("Failed to create pad {}", res.status()).into() )
|
2024-08-01 18:30:14 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-02 22:22:11 +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 {
|
|
|
|
Some(id) => self.format_url( &format!( "new/{id}" ) ),
|
|
|
|
None => self.format_url("new"),
|
|
|
|
};
|
|
|
|
|
|
|
|
let res = self.client.post(&url)
|
|
|
|
.header( "Content-Type", "text/markdown" )
|
|
|
|
.body(content)
|
2024-08-02 22:22:11 +02:00
|
|
|
.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:22:11 +02:00
|
|
|
Err( format!("Failed to import note: {}", res.status()).into() )
|
2024-08-01 18:30:14 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|