diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/client.rs | 75 | ||||
| -rw-r--r-- | src/lib.rs | 41 | ||||
| -rw-r--r-- | src/main.rs | 3 |
3 files changed, 116 insertions, 3 deletions
diff --git a/src/client.rs b/src/client.rs new file mode 100644 index 0000000..39f7d4b --- /dev/null +++ b/src/client.rs @@ -0,0 +1,75 @@ +use std::error::Error; + +use serde::Deserialize; +use serde_json::json; +use serde_repr::{Deserialize_repr, Serialize_repr}; + +type Result<T> = std::result::Result<T, Box<dyn Error>>; + +pub struct HydrusClient { + apikey: Option<String>, + url: String, +} + +#[derive(Serialize_repr, Deserialize_repr, PartialEq, Debug)] +#[repr(u8)] +pub enum HydrusPermissions { + ImportAndEditURLs = 0, + ImportAndEditFiles, + EditFileTags, + SearchAndFetchFiles, + ManagePages, + ManageCookiesAndHeaders, + ManageDatabase, + EditFileNotes, + EditFileRelationships, + EditFileRatings, + ManagePopups, + EditFileTimes, + CommitPending, + SeeLocalPaths, +} + +#[derive(Deserialize)] +struct SessionKey { + session_key: String, +} + +impl HydrusClient { + pub fn new(url: String) -> HydrusClient { + return HydrusClient { + apikey: None, + url: url, + }; + } + + pub fn set_api_key(&mut self, key: String) { + self.apikey = Some(key) + } + + pub fn request_new_permissions( + &self, + name: String, + permissions: &[HydrusPermissions], + ) -> Result<String> { + let mut req_url = self.url.to_owned(); + req_url.push_str("/request_new_permissions?name="); + req_url.push_str(&name); + + if permissions.len() == 0 { + req_url.push_str("&permit_everything=true"); + } else { + req_url.push_str("&basic_permissions="); + let json_string = serde_json::to_string(&json!(permissions))?; + let encoded = urlencoding::encode(&json_string); + req_url.push_str(&encoded); + }; + + let respose = ureq::get(req_url) + .call()? + .body_mut() + .read_json::<SessionKey>()?; + + return Ok(respose.session_key); + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..50e4c25 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,41 @@ +pub mod client; + +#[cfg(test)] +mod tests { + use serde_json::json; + + use crate::client::HydrusPermissions; + + use super::*; + + #[test] + fn correct_permissions_number() { + assert_eq!(HydrusPermissions::ImportAndEditURLs as u8, 0); + assert_eq!(HydrusPermissions::ImportAndEditFiles as u8, 1); + assert_eq!(HydrusPermissions::EditFileTags as u8, 2); + assert_eq!(HydrusPermissions::SearchAndFetchFiles as u8, 3); + assert_eq!(HydrusPermissions::ManagePages as u8, 4); + assert_eq!(HydrusPermissions::ManageCookiesAndHeaders as u8, 5); + assert_eq!(HydrusPermissions::ManageDatabase as u8, 6); + assert_eq!(HydrusPermissions::EditFileNotes as u8, 7); + assert_eq!(HydrusPermissions::EditFileRelationships as u8, 8); + assert_eq!(HydrusPermissions::EditFileRatings as u8, 9); + assert_eq!(HydrusPermissions::ManagePopups as u8, 10); + assert_eq!(HydrusPermissions::EditFileTimes as u8, 11); + assert_eq!(HydrusPermissions::CommitPending as u8, 12); + assert_eq!(HydrusPermissions::SeeLocalPaths as u8, 13); + } + + #[test] + fn correct_url_encode() { + let perms: [HydrusPermissions; 3] = [ + HydrusPermissions::ImportAndEditURLs, + HydrusPermissions::ImportAndEditFiles, + HydrusPermissions::SeeLocalPaths, + ]; + let json_string = serde_json::to_string(&json!(perms)).unwrap(); + let encoded = urlencoding::encode(&json_string); + + assert_eq!(encoded, "%5B0%2C1%2C13%5D") + } +} diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index e7a11a9..0000000 --- a/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println!("Hello, world!"); -} |
