summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakka <jakka@jakka.su>2025-09-13 21:27:26 +0300
committerjakka <jakka@jakka.su>2025-09-13 21:27:26 +0300
commitdfab573a0de95ff95e24653901e0ddecdd7c5459 (patch)
treecaad49784baba7b2da92c8643d95953ca8d3bca1
parentd7cdf6cd80fb25deb4bbcb7af37e569c404bd0c0 (diff)
json de/serialization via serdeserde
-rw-r--r--Cargo.lock664
-rw-r--r--Cargo.toml7
-rw-r--r--src/client.rs70
-rw-r--r--src/tests.rs18
-rw-r--r--src/types.rs108
5 files changed, 466 insertions, 401 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 34d785e..f40d177 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -9,15 +9,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
-name = "aho-corasick"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
-dependencies = [
- "memchr",
-]
-
-[[package]]
name = "base64"
version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -31,9 +22,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
[[package]]
name = "cc"
-version = "1.2.36"
+version = "1.2.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54"
+checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44"
dependencies = [
"find-msvc-tools",
"shlex",
@@ -46,6 +37,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9"
[[package]]
+name = "cookie"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
+dependencies = [
+ "percent-encoding",
+ "time",
+ "version_check",
+]
+
+[[package]]
+name = "cookie_store"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fc4bff745c9b4c7fb1e97b25d13153da2bc7796260141df62378998d070207f"
+dependencies = [
+ "cookie",
+ "document-features",
+ "idna",
+ "indexmap",
+ "log",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "time",
+ "url",
+]
+
+[[package]]
name = "crc32fast"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -55,6 +75,41 @@ dependencies = [
]
[[package]]
+name = "deranged"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc"
+dependencies = [
+ "powerfmt",
+]
+
+[[package]]
+name = "displaydoc"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "document-features"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d"
+dependencies = [
+ "litrs",
+]
+
+[[package]]
+name = "equivalent"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+
+[[package]]
name = "find-msvc-tools"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -77,17 +132,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
-name = "generator"
-version = "0.8.7"
+name = "form_urlencoded"
+version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2"
+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
dependencies = [
- "cc",
- "cfg-if",
- "libc",
- "log",
- "rustversion",
- "windows",
+ "percent-encoding",
]
[[package]]
@@ -102,10 +152,10 @@ dependencies = [
]
[[package]]
-name = "heck"
-version = "0.5.0"
+name = "hashbrown"
+version = "0.15.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
[[package]]
name = "http"
@@ -128,118 +178,183 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
name = "hydrus-api-rs"
version = "0.1.0"
dependencies = [
- "musli",
- "strum_macros",
+ "serde",
+ "serde_json",
+ "serde_repr",
"thiserror",
"ureq",
"urlencoding",
]
[[package]]
-name = "itoa"
-version = "1.0.15"
+name = "icu_collections"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
+dependencies = [
+ "displaydoc",
+ "potential_utf",
+ "yoke",
+ "zerofrom",
+ "zerovec",
+]
[[package]]
-name = "lazy_static"
-version = "1.5.0"
+name = "icu_locale_core"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
+dependencies = [
+ "displaydoc",
+ "litemap",
+ "tinystr",
+ "writeable",
+ "zerovec",
+]
[[package]]
-name = "libc"
-version = "0.2.175"
+name = "icu_normalizer"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
+checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
+dependencies = [
+ "displaydoc",
+ "icu_collections",
+ "icu_normalizer_data",
+ "icu_properties",
+ "icu_provider",
+ "smallvec",
+ "zerovec",
+]
[[package]]
-name = "log"
-version = "0.4.28"
+name = "icu_normalizer_data"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
+checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
[[package]]
-name = "loom"
-version = "0.7.2"
+name = "icu_properties"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca"
+checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
dependencies = [
- "cfg-if",
- "generator",
- "scoped-tls",
- "tracing",
- "tracing-subscriber",
+ "displaydoc",
+ "icu_collections",
+ "icu_locale_core",
+ "icu_properties_data",
+ "icu_provider",
+ "potential_utf",
+ "zerotrie",
+ "zerovec",
]
[[package]]
-name = "matchers"
-version = "0.2.0"
+name = "icu_properties_data"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
-dependencies = [
- "regex-automata",
-]
+checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
[[package]]
-name = "memchr"
-version = "2.7.5"
+name = "icu_provider"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
+checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
+dependencies = [
+ "displaydoc",
+ "icu_locale_core",
+ "stable_deref_trait",
+ "tinystr",
+ "writeable",
+ "yoke",
+ "zerofrom",
+ "zerotrie",
+ "zerovec",
+]
[[package]]
-name = "miniz_oxide"
-version = "0.8.9"
+name = "idna"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
dependencies = [
- "adler2",
+ "idna_adapter",
+ "smallvec",
+ "utf8_iter",
]
[[package]]
-name = "musli"
-version = "0.0.145"
+name = "idna_adapter"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "403945d9998f1403f4092f11bf6719939e41d7654a2ca81b5b4a5442f51d2cee"
+checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
dependencies = [
- "itoa",
- "loom",
- "musli-core",
- "ryu",
- "serde",
- "simdutf8",
+ "icu_normalizer",
+ "icu_properties",
]
[[package]]
-name = "musli-core"
-version = "0.0.145"
+name = "indexmap"
+version = "2.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0069e76d4073daec321fe495793a872b1d2e3a50c732ba5bf7c127ace301918b"
+checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921"
dependencies = [
- "musli-macros",
+ "equivalent",
+ "hashbrown",
]
[[package]]
-name = "musli-macros"
-version = "0.0.145"
+name = "itoa"
+version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a05448d5422b02ab67f83adab2f1bf50ad16aa605b1b22dfe5b514f678a04be1"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
+checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+
+[[package]]
+name = "libc"
+version = "0.2.175"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
+
+[[package]]
+name = "litemap"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
+
+[[package]]
+name = "litrs"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed"
+
+[[package]]
+name = "log"
+version = "0.4.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
+
+[[package]]
+name = "memchr"
+version = "2.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
-name = "nu-ansi-term"
-version = "0.50.1"
+name = "miniz_oxide"
+version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399"
+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
dependencies = [
- "windows-sys",
+ "adler2",
]
[[package]]
+name = "num-conv"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
+
+[[package]]
name = "once_cell"
version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -252,10 +367,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
-name = "pin-project-lite"
-version = "0.2.16"
+name = "potential_utf"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a"
+dependencies = [
+ "zerovec",
+]
+
+[[package]]
+name = "powerfmt"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "proc-macro2"
@@ -276,23 +400,6 @@ dependencies = [
]
[[package]]
-name = "regex-automata"
-version = "0.4.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
-
-[[package]]
name = "ring"
version = "0.17.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -341,9 +448,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
-version = "0.103.4"
+version = "0.103.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc"
+checksum = "b5a37813727b78798e53c2bec3f5e8fe12a6d6f8389bf9ca7802add4c9905ad8"
dependencies = [
"ring",
"rustls-pki-types",
@@ -351,24 +458,12 @@ dependencies = [
]
[[package]]
-name = "rustversion"
-version = "1.0.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
-
-[[package]]
name = "ryu"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]]
-name = "scoped-tls"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
-
-[[package]]
name = "serde"
version = "1.0.219"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -389,25 +484,33 @@ dependencies = [
]
[[package]]
-name = "sharded-slab"
-version = "0.1.7"
+name = "serde_json"
+version = "1.0.143"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a"
dependencies = [
- "lazy_static",
+ "itoa",
+ "memchr",
+ "ryu",
+ "serde",
]
[[package]]
-name = "shlex"
-version = "1.3.0"
+name = "serde_repr"
+version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
[[package]]
-name = "simdutf8"
-version = "0.1.5"
+name = "shlex"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "smallvec"
@@ -416,16 +519,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
-name = "strum_macros"
-version = "0.27.2"
+name = "stable_deref_trait"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote",
- "syn",
-]
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
[[package]]
name = "subtle"
@@ -445,6 +542,17 @@ dependencies = [
]
[[package]]
+name = "synstructure"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
name = "thiserror"
version = "2.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -465,61 +573,43 @@ dependencies = [
]
[[package]]
-name = "thread_local"
-version = "1.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "tracing"
-version = "0.1.41"
+name = "time"
+version = "0.3.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
+checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031"
dependencies = [
- "pin-project-lite",
- "tracing-core",
+ "deranged",
+ "num-conv",
+ "powerfmt",
+ "serde",
+ "time-core",
+ "time-macros",
]
[[package]]
-name = "tracing-core"
-version = "0.1.34"
+name = "time-core"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
-dependencies = [
- "once_cell",
- "valuable",
-]
+checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b"
[[package]]
-name = "tracing-log"
-version = "0.2.0"
+name = "time-macros"
+version = "0.2.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
+checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3"
dependencies = [
- "log",
- "once_cell",
- "tracing-core",
+ "num-conv",
+ "time-core",
]
[[package]]
-name = "tracing-subscriber"
-version = "0.3.20"
+name = "tinystr"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5"
+checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
dependencies = [
- "matchers",
- "nu-ansi-term",
- "once_cell",
- "regex-automata",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
+ "displaydoc",
+ "zerovec",
]
[[package]]
@@ -541,12 +631,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99ba1025f18a4a3fc3e9b48c868e9beb4f24f4b4b1a325bada26bd4119f46537"
dependencies = [
"base64",
+ "cookie_store",
"flate2",
"log",
"percent-encoding",
"rustls",
"rustls-pemfile",
"rustls-pki-types",
+ "serde",
+ "serde_json",
"ureq-proto",
"utf-8",
"webpki-roots",
@@ -565,6 +658,18 @@ dependencies = [
]
[[package]]
+name = "url"
+version = "2.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+ "serde",
+]
+
+[[package]]
name = "urlencoding"
version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -577,10 +682,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
[[package]]
-name = "valuable"
-version = "0.1.1"
+name = "utf8_iter"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+
+[[package]]
+name = "version_check"
+version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wasi"
@@ -598,108 +709,6 @@ dependencies = [
]
[[package]]
-name = "windows"
-version = "0.61.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
-dependencies = [
- "windows-collections",
- "windows-core",
- "windows-future",
- "windows-link",
- "windows-numerics",
-]
-
-[[package]]
-name = "windows-collections"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
-dependencies = [
- "windows-core",
-]
-
-[[package]]
-name = "windows-core"
-version = "0.61.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
-dependencies = [
- "windows-implement",
- "windows-interface",
- "windows-link",
- "windows-result",
- "windows-strings",
-]
-
-[[package]]
-name = "windows-future"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
-dependencies = [
- "windows-core",
- "windows-link",
- "windows-threading",
-]
-
-[[package]]
-name = "windows-implement"
-version = "0.60.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "windows-interface"
-version = "0.59.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "windows-link"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
-
-[[package]]
-name = "windows-numerics"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
-dependencies = [
- "windows-core",
- "windows-link",
-]
-
-[[package]]
-name = "windows-result"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "windows-strings"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
name = "windows-sys"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -725,15 +734,6 @@ dependencies = [
]
[[package]]
-name = "windows-threading"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -782,7 +782,91 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
+name = "writeable"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
+
+[[package]]
+name = "yoke"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
+dependencies = [
+ "serde",
+ "stable_deref_trait",
+ "yoke-derive",
+ "zerofrom",
+]
+
+[[package]]
+name = "yoke-derive"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "synstructure",
+]
+
+[[package]]
+name = "zerofrom"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
+dependencies = [
+ "zerofrom-derive",
+]
+
+[[package]]
+name = "zerofrom-derive"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "synstructure",
+]
+
+[[package]]
name = "zeroize"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
+
+[[package]]
+name = "zerotrie"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
+dependencies = [
+ "displaydoc",
+ "yoke",
+ "zerofrom",
+]
+
+[[package]]
+name = "zerovec"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b"
+dependencies = [
+ "yoke",
+ "zerofrom",
+ "zerovec-derive",
+]
+
+[[package]]
+name = "zerovec-derive"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
diff --git a/Cargo.toml b/Cargo.toml
index c9ba256..90dea2d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,8 +4,9 @@ version = "0.1.0"
edition = "2024"
[dependencies]
-musli = { version = "0.0.145", features = ["json"] }
-strum_macros = "0.27.2"
+serde = { version = "1.0.219", features = ["derive"] }
+serde_json = { version = "1.0.143", features = ["alloc"] }
+serde_repr = "0.1.20"
thiserror = "2.0.16"
-ureq = "3.1.0"
+ureq = { version = "3.1.0", features = ["json"] }
urlencoding = "2.1.3"
diff --git a/src/client.rs b/src/client.rs
index 49d903e..e13750d 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -38,13 +38,11 @@ impl HydrusClient {
req_url.push_str("&permit_everything=true");
} else {
req_url.push_str("&basic_permissions=");
- let json_string = musli::json::to_string(&permissions)?;
+ let json_string = serde_json::to_string(&permissions)?;
req_url.push_str(&urlencoding::encode(&json_string));
};
- let response = ureq::get(req_url).call()?.body_mut().read_to_vec()?;
-
- let key: AccessKey = musli::json::decode(response.as_slice())?;
+ let key: AccessKey = ureq::get(req_url).call()?.body_mut().read_json()?;
Ok(key.access_key)
}
@@ -59,9 +57,7 @@ impl HydrusClient {
request = request.header("Hydrus-Client-API-Access-Key", key);
}
- let response = request.call()?.body_mut().read_to_vec()?;
-
- let key: SessionKey = musli::json::decode(response.as_slice())?;
+ let key: SessionKey = request.call()?.body_mut().read_json()?;
Ok(key.session_key)
}
@@ -69,38 +65,80 @@ impl HydrusClient {
pub fn verify_access_key(&self, key: &str) -> Result<KeyInfo> {
let mut req_url = self.url.to_owned();
req_url.push_str("verify_access_key");
- let response = ureq::get(req_url)
+ let keyinfo: KeyInfo = ureq::get(req_url)
.header("Hydrus-Client-API-Access-Key", key)
.call()?
.body_mut()
- .read_to_vec()?;
-
- let data: KeyInfo = musli::json::decode(response.as_slice())?;
+ .read_json()?;
- Ok(data)
+ Ok(keyinfo)
}
pub fn get_service_name(&self, name: &str) -> Result<Service> {
let mut req_url = self.url.to_owned();
req_url.push_str("get_service?service_name=");
req_url.push_str(&urlencoding::encode(name));
- let response = if let Some(key) = &self.sessionkey {
+ let service: Service = if let Some(key) = &self.sessionkey {
+ ureq::get(req_url)
+ .header("Hydrus-Client-API-Access-Key", key)
+ .call()?
+ .body_mut()
+ .read_json()?
+ } else if let Some(key) = &self.apikey {
+ ureq::get(req_url)
+ .header("Hydrus-Client-API-Access-Key", key)
+ .call()?
+ .body_mut()
+ .read_json()?
+ } else {
+ return Err(HydrusError::KeyNotSupplied);
+ };
+
+ Ok(service)
+ }
+
+ pub fn get_service_key(&self, name: &str) -> Result<Service> {
+ let mut req_url = self.url.to_owned();
+ req_url.push_str("get_service?service_key=");
+ req_url.push_str(&urlencoding::encode(name));
+ let service: Service = if let Some(key) = &self.sessionkey {
ureq::get(req_url)
.header("Hydrus-Client-API-Access-Key", key)
.call()?
.body_mut()
- .read_to_vec()?
+ .read_json()?
} else if let Some(key) = &self.apikey {
ureq::get(req_url)
.header("Hydrus-Client-API-Access-Key", key)
.call()?
.body_mut()
- .read_to_vec()?
+ .read_json()?
} else {
return Err(HydrusError::KeyNotSupplied);
};
- let service: Service = musli::json::decode(response.as_slice())?;
Ok(service)
}
+
+ pub fn get_services(&self) -> Result<Vec<Service>> {
+ let mut req_url = self.url.to_owned();
+ req_url.push_str("get_services");
+ let response: ServiceResponse = if let Some(key) = &self.sessionkey {
+ ureq::get(req_url)
+ .header("Hydrus-Client-API-Access-Key", key)
+ .call()?
+ .body_mut()
+ .read_json()?
+ } else if let Some(key) = &self.apikey {
+ ureq::get(req_url)
+ .header("Hydrus-Client-API-Access-Key", key)
+ .call()?
+ .body_mut()
+ .read_json()?
+ } else {
+ return Err(HydrusError::KeyNotSupplied);
+ };
+ println!("{:?}", response);
+ Ok(vec![])
+ }
}
diff --git a/src/tests.rs b/src/tests.rs
index 3fafdbe..9dc56e1 100644
--- a/src/tests.rs
+++ b/src/tests.rs
@@ -8,7 +8,7 @@ fn correct_hydruspermissions_url_encode() {
HydrusPermissions::ImportAndEditFiles,
HydrusPermissions::SeeLocalPaths,
];
- let json_string = musli::json::to_string(&perms).unwrap();
+ let json_string = serde_json::to_string(&perms).unwrap();
let encoded = urlencoding::encode(&json_string);
assert_eq!(encoded, "%5B0%2C1%2C13%5D")
@@ -21,9 +21,9 @@ fn correct_hydruspermissions_decode() {
HydrusPermissions::ImportAndEditFiles,
HydrusPermissions::SeeLocalPaths,
];
- let json_string = musli::json::to_string(&perms).unwrap();
+ let json_string = serde_json::to_string(&perms).unwrap();
- let res: [HydrusPermissions; 3] = musli::json::from_str(&json_string).unwrap();
+ let res: [HydrusPermissions; 3] = serde_json::from_str(&json_string).unwrap();
assert_eq!(res, perms)
}
@@ -35,14 +35,16 @@ fn correct_hydrusservice_decode() {
ServiceType::Trash,
];
- let json_string = musli::json::to_string(&input).unwrap();
+ let json_string = serde_json::to_string(&input).unwrap();
- let res: [ServiceType; 3] = musli::json::from_str(&json_string).unwrap();
+ let res: [ServiceType; 3] = serde_json::from_str(&json_string).unwrap();
assert_eq!(res, input)
}
#[test]
-fn get_keys() {
- let client: HydrusClient = HydrusClient::new("http://127.0.0.1:51251/");
- let _ = client.request_new_permissions("test client", &[]).unwrap();
+fn client_test() {
+ let mut client: HydrusClient = HydrusClient::new("http://127.0.0.1:51251/");
+ client.set_api_key("7ab7accf6cf12b2c6c30436cd8fe16361aee33679dbd90da279b5c22b33d622a");
+ let test = client.get_services().unwrap();
+ println!("{:?}", test);
}
diff --git a/src/types.rs b/src/types.rs
index ed00efb..6f720c6 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -1,5 +1,6 @@
-use musli::{Allocator, Decode, Decoder, Encode, Encoder};
-use strum_macros::FromRepr;
+use serde::Deserialize;
+use serde_repr::{Deserialize_repr, Serialize_repr};
+use std::collections::HashMap;
use thiserror::Error;
#[derive(Error, Debug)]
@@ -7,13 +8,13 @@ pub enum HydrusError {
#[error("failed to connect to Hydrus")]
NetworkError(ureq::Error),
#[error("failed to deserialize data")]
- DeserializeError(musli::json::Error),
+ DeserializeError(serde_json::Error),
#[error("api or session key needed")]
KeyNotSupplied,
}
-impl From<musli::json::Error> for HydrusError {
- fn from(value: musli::json::Error) -> Self {
+impl From<serde_json::Error> for HydrusError {
+ fn from(value: serde_json::Error) -> Self {
HydrusError::DeserializeError(value)
}
}
@@ -24,7 +25,7 @@ impl From<ureq::Error> for HydrusError {
}
}
-#[derive(PartialEq, Debug, Clone, FromRepr)]
+#[derive(PartialEq, Debug, Clone, Deserialize_repr, Serialize_repr)]
#[repr(u8)]
pub enum HydrusPermissions {
ImportAndEditURLs = 0,
@@ -44,51 +45,17 @@ pub enum HydrusPermissions {
Null = 255,
}
-impl<M> Encode<M> for HydrusPermissions {
- type Encode = Self;
-
- #[inline]
- fn encode<E>(&self, encoder: E) -> Result<(), E::Error>
- where
- E: Encoder<Mode = M>,
- {
- encoder.encode(self.clone() as u8)
- }
-
- #[inline]
- fn as_encode(&self) -> &Self::Encode {
- self
- }
-}
-
-impl<'de, M, A> Decode<'de, M, A> for HydrusPermissions
-where
- A: Allocator,
-{
- #[inline]
- fn decode<D>(decoder: D) -> Result<Self, D::Error>
- where
- D: Decoder<'de>,
- {
- if let Some(val) = HydrusPermissions::from_repr(decoder.decode()?) {
- return Ok(val);
- } else {
- return Ok(Self::Null);
- }
- }
-}
-
-#[derive(Decode, Debug)]
+#[derive(Deserialize, Debug)]
pub struct AccessKey {
pub access_key: String,
}
-#[derive(Decode, Debug)]
+#[derive(Deserialize, Debug)]
pub struct SessionKey {
pub session_key: String,
}
-#[derive(Decode, Debug)]
+#[derive(Deserialize, Debug)]
pub struct KeyInfo {
pub name: String,
pub permits_everything: bool,
@@ -96,7 +63,7 @@ pub struct KeyInfo {
pub human_permissions: String,
}
-#[derive(PartialEq, Debug, Clone, FromRepr)]
+#[derive(PartialEq, Debug, Clone, Deserialize_repr, Serialize_repr)]
#[repr(u8)]
pub enum ServiceType {
TagRepository = 0,
@@ -121,51 +88,24 @@ pub enum ServiceType {
Null = 255,
}
-impl<M> Encode<M> for ServiceType {
- type Encode = Self;
-
- #[inline]
- fn encode<E>(&self, encoder: E) -> Result<(), E::Error>
- where
- E: Encoder<Mode = M>,
- {
- encoder.encode(self.clone() as u8)
- }
-
- #[inline]
- fn as_encode(&self) -> &Self::Encode {
- self
- }
-}
-
-impl<'de, M, A> Decode<'de, M, A> for ServiceType
-where
- A: Allocator,
-{
- #[inline]
- fn decode<D>(decoder: D) -> Result<Self, D::Error>
- where
- D: Decoder<'de>,
- {
- if let Some(val) = ServiceType::from_repr(decoder.decode()?) {
- return Ok(val);
- } else {
- return Ok(Self::Null);
- }
- }
-}
-
-#[derive(Decode)]
+#[derive(Deserialize, Debug)]
pub struct Service {
pub name: String,
- #[musli(default)]
+ #[serde(default)]
pub service_key: String,
- pub servicetype: ServiceType,
+ pub r#type: ServiceType,
pub type_pretty: String,
- #[musli(default)]
+ #[serde(default)]
pub star_shape: String,
- #[musli(default)]
+ #[serde(default)]
pub min_stars: u8,
- #[musli(default)]
+ #[serde(default)]
pub max_stars: u8,
}
+
+#[derive(Deserialize, Debug)]
+pub struct ServiceResponse {
+ pub services: HashMap<String, Service>,
+ #[serde(flatten)]
+ _extra: HashMap<String, serde_json::Value>,
+}