summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client.rs75
-rw-r--r--src/lib.rs41
-rw-r--r--src/main.rs3
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!");
-}