From a5e6f4ab5a99cf1b29d9ed3f4fff814c73819d8d Mon Sep 17 00:00:00 2001 From: MilkFeng <3107055729@qq.com> Date: Sun, 8 Sep 2024 14:37:32 +0800 Subject: [PATCH] support wasm --- .idea/eparser.iml | 2 + Cargo.lock | 1043 ++++++++++++++++++++++++++++++++- Cargo.toml | 13 +- example/Cargo.lock | 1156 ++++++++++++++++++++++++++++++++++++- example/Cargo.toml | 3 +- example/src/main.rs | 43 +- src/book.rs | 53 +- src/file/local.rs | 26 +- src/file/mod.rs | 17 +- src/file/remote.rs | 70 +++ src/file/remote_epub.rs | 77 +++ src/lib.rs | 4 +- src/oebps.rs | 42 +- src/package/manifest.rs | 38 +- src/package/media_type.rs | 63 +- src/package/metadata.rs | 45 +- src/package/mod.rs | 6 +- src/package/nav.rs | 10 +- src/package/parser.rs | 208 +++++-- src/package/prefix.rs | 8 +- src/package/property.rs | 19 +- src/package/spine.rs | 5 +- src/xhtml.rs | 1 - 23 files changed, 2682 insertions(+), 270 deletions(-) create mode 100644 src/file/remote_epub.rs diff --git a/.idea/eparser.iml b/.idea/eparser.iml index 905396c..41543c6 100644 --- a/.idea/eparser.iml +++ b/.idea/eparser.iml @@ -5,9 +5,11 @@ + + diff --git a/Cargo.lock b/Cargo.lock index 0c731f0..d7dc446 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -43,12 +52,51 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + [[package]] name = "block-buffer" version = "0.10.4" @@ -165,6 +213,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -268,6 +326,15 @@ dependencies = [ "syn", ] +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + [[package]] name = "eparser" version = "0.0.0" @@ -275,6 +342,8 @@ dependencies = [ "chrono", "minidom", "once_cell", + "reqwest", + "reqwest-wasm", "thiserror", "url", "zip", @@ -286,6 +355,22 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + [[package]] name = "flate2" version = "1.0.31" @@ -296,6 +381,27 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -305,6 +411,67 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -326,12 +493,62 @@ dependencies = [ "wasi", ] +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hmac" version = "0.12.1" @@ -341,6 +558,184 @@ dependencies = [ "digest", ] +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.1", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper 0.14.30", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.4.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.4.1", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -393,6 +788,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "itoa" version = "1.0.11" @@ -423,6 +824,12 @@ version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + [[package]] name = "lockfree-object-pool" version = "0.1.6" @@ -451,6 +858,12 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minidom" version = "0.16.0" @@ -469,6 +882,35 @@ dependencies = [ "adler", ] +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi", + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -484,12 +926,65 @@ dependencies = [ "autocfg", ] +[[package]] +name = "object" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "openssl" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "pbkdf2" version = "0.12.2" @@ -507,11 +1002,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] -name = "pkg-config" -version = "0.3.30" +name = "pin-project" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + [[package]] name = "powerfmt" version = "0.2.0" @@ -575,6 +1102,161 @@ dependencies = [ "getrandom", ] +[[package]] +name = "reqwest" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-rustls", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "reqwest-wasm" +version = "0.11.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fdca8934fccbd5aec3e208bdb5a76107ce8690aa51c6c292c31f21541b52b9" +dependencies = [ + "base64 0.13.1", + "bytes", + "encoding_rs", + "futures", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-tls 0.5.0", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.23.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" + +[[package]] +name = "rustls-webpki" +version = "0.102.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84678086bd54edf2b415183ed7a94d0efb049f1b646a33e22a36f3794be6ae56" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.17" @@ -606,6 +1288,38 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.207" @@ -626,6 +1340,30 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -643,6 +1381,37 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "static_assertions" version = "1.1.0" @@ -666,6 +1435,49 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "thiserror" version = "1.0.63" @@ -720,6 +1532,107 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tokio" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "typenum" version = "1.17.0" @@ -747,6 +1660,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.2" @@ -758,12 +1677,27 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -795,6 +1729,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.92" @@ -824,6 +1770,38 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-core" version = "0.52.0" @@ -833,6 +1811,54 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -897,6 +1923,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + [[package]] name = "zerocopy" version = "0.7.35" diff --git a/Cargo.toml b/Cargo.toml index 120b822..2132050 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,15 +5,16 @@ edition = "2021" description = "A simple parser for the EPUB" license = "MIT" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[features] -local = ["zip"] - [dependencies] url = "2.5.2" once_cell = "1.19.0" chrono = "0.4.38" -zip = { version = "2.1.6", optional = true } minidom = "0.16.0" thiserror = "1.0.63" + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +zip = "2.1.6" +reqwest = "0.12.7" + +[target.'cfg(target_arch = "wasm32")'.dependencies] +reqwest-wasm = "0.11.16" \ No newline at end of file diff --git a/example/Cargo.lock b/example/Cargo.lock index 94772ab..0304748 100644 --- a/example/Cargo.lock +++ b/example/Cargo.lock @@ -2,12 +2,27 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "aes" version = "0.8.4" @@ -43,12 +58,51 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.7.4", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + [[package]] name = "block-buffer" version = "0.10.4" @@ -162,9 +216,19 @@ dependencies = [ [[package]] name = "constant_time_eq" -version = "0.3.0" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] [[package]] name = "core-foundation-sys" @@ -174,9 +238,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -269,6 +333,15 @@ dependencies = [ "syn", ] +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + [[package]] name = "eparser" version = "0.0.0" @@ -276,6 +349,8 @@ dependencies = [ "chrono", "minidom", "once_cell", + "reqwest", + "reqwest-wasm", "thiserror", "url", "zip", @@ -287,23 +362,61 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "example" version = "0.1.0" dependencies = [ "eparser", + "tokio", ] +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + [[package]] name = "flate2" -version = "1.0.31" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.8.0", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -313,6 +426,67 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -334,12 +508,62 @@ dependencies = [ "wasi", ] +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hmac" version = "0.12.1" @@ -349,6 +573,184 @@ dependencies = [ "digest", ] +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.1", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper 0.14.30", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.4.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.4.1", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -401,6 +803,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "itoa" version = "1.0.11" @@ -431,6 +839,22 @@ version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "lockfree-object-pool" version = "0.1.6" @@ -459,6 +883,12 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minidom" version = "0.16.0" @@ -477,6 +907,44 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi", + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -492,6 +960,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "object" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -499,20 +976,119 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] -name = "pbkdf2" -version = "0.12.2" +name = "openssl" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "digest", - "hmac", + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", ] [[package]] -name = "percent-encoding" -version = "2.3.1" +name = "openssl-macros" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" @@ -583,6 +1159,170 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags", +] + +[[package]] +name = "reqwest" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-rustls", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "reqwest-wasm" +version = "0.11.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fdca8934fccbd5aec3e208bdb5a76107ce8690aa51c6c292c31f21541b52b9" +dependencies = [ + "base64 0.13.1", + "bytes", + "encoding_rs", + "futures", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-tls 0.5.0", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.23.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" + +[[package]] +name = "rustls-webpki" +version = "0.102.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84678086bd54edf2b415183ed7a94d0efb049f1b646a33e22a36f3794be6ae56" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.17" @@ -614,6 +1354,44 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.208" @@ -634,6 +1412,30 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -651,12 +1453,52 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "simd-adler32" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "static_assertions" version = "1.1.0" @@ -680,6 +1522,49 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "thiserror" version = "1.0.63" @@ -734,6 +1619,121 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tokio" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "typenum" version = "1.17.0" @@ -761,6 +1761,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.2" @@ -772,12 +1778,27 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -810,6 +1831,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.93" @@ -839,6 +1872,38 @@ version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-core" version = "0.52.0" @@ -848,6 +1913,54 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -912,6 +2025,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -955,9 +2077,9 @@ dependencies = [ [[package]] name = "zip" -version = "2.1.6" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40dd8c92efc296286ce1fbd16657c5dbefff44f1b4ca01cc5f517d8b7b3d3e2e" +checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494" dependencies = [ "aes", "arbitrary", diff --git a/example/Cargo.toml b/example/Cargo.toml index fb0c104..c6b599d 100644 --- a/example/Cargo.toml +++ b/example/Cargo.toml @@ -4,4 +4,5 @@ version = "0.1.0" edition = "2021" [dependencies] -eparser = { path = "../", features = ["local"] } +eparser = { path = "../" } +tokio = { version = "1.40.0", features = ["full", "macros", "rt"] } \ No newline at end of file diff --git a/example/src/main.rs b/example/src/main.rs index de44e41..c57e71f 100644 --- a/example/src/main.rs +++ b/example/src/main.rs @@ -1,27 +1,28 @@ -use std::fs::File; - use eparser::book::parse_book; +use eparser::file::read_from_epub_url_str; +use eparser::file::read_from_url_str; use eparser::file::Files; -use eparser::file::local::{read_from_dir, read_from_file, read_from_zip, ZipArchive}; +use eparser::file::{read_from_dir, read_from_file, read_from_zip, ZipArchive}; use eparser::package::manifest::ResourceMap; +use std::fs::File; -fn read1() { +async fn read1() { let file = File::open("./res/example.epub").unwrap(); let mut zip = ZipArchive::new(file).unwrap(); let mut files = read_from_zip(&mut zip).unwrap(); - let book = parse_book(&mut files).unwrap(); + let book = parse_book(&mut files).await.unwrap(); println!("{:?}", book); } -fn read2() { +async fn read2() { let file = File::open("./res/example.epub").unwrap(); let mut files = read_from_file(file).unwrap(); - let book = parse_book(&mut files).unwrap(); + let book = parse_book(&mut files).await.unwrap(); let pkg = book.packages().first().unwrap(); let sref = pkg.spine.get(12).unwrap(); let res = pkg.get_res_by_ref(sref).unwrap(); - let data = files.get_by_res(&res).unwrap(); + let data = files.get_by_res(&res).await.unwrap(); let s = String::from_utf8(data.clone()).unwrap(); let xhtml = eparser::xhtml::parse_xhtml(&s).unwrap(); @@ -31,13 +32,33 @@ fn read2() { println!("{:?}", body); } -fn read3() { +async fn read3() { let dir = "./res/example"; let mut files = read_from_dir(dir).unwrap(); - let book = parse_book(&mut files).unwrap(); + let book = parse_book(&mut files).await.unwrap(); + println!("{:?}", book); +} + +async fn read4() { + let url = "http://localhost:8000/example/"; + let mut files = read_from_url_str(url).await.unwrap(); + let book = parse_book(&mut files).await.unwrap(); + println!("{:?}", book); +} + +async fn read5() { + let url = "http://localhost:8000/example.epub"; + let mut files = read_from_epub_url_str(url).unwrap(); + let book = parse_book(&mut files).await.unwrap(); println!("{:?}", book); } fn main() { - read2() + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + read5().await; + }) } diff --git a/src/book.rs b/src/book.rs index 274849e..a911314 100644 --- a/src/book.rs +++ b/src/book.rs @@ -1,13 +1,11 @@ -use std::fmt::{Debug, Display}; -use std::ops::{Deref, DerefMut}; - -use thiserror::Error; - use crate::file::Files; -use crate::oebps::{Container, ContainerError}; -use crate::package::Package; +use crate::oebps::{parse_container, ContainerError}; use crate::package::parser::{PackageError, PackageParseOptions, PackageParser}; use crate::package::prefix::Prefixes; +use crate::package::Package; +use std::fmt::{Debug, Display}; +use std::ops::{Deref, DerefMut}; +use thiserror::Error; #[derive(Debug)] pub struct EpubBook(Vec); @@ -36,7 +34,6 @@ impl DerefMut for EpubBook { } } - #[derive(Debug, Error)] pub enum ParseBookError { #[error("The book is missing a META-INF/container.xml file")] @@ -59,20 +56,20 @@ pub enum ParseBookError { } /// Parse an EPUB book. -pub fn parse_book(files: &mut F) -> Result { +pub async fn parse_book(files: &mut F) -> Result { let container = { - let url = files.root_url() + let root_url = files.root_url().clone(); + let url = root_url .join("META-INF/container.xml") .map_err(ParseBookError::UrlParseError)?; - - let data = files.get(&url) + let data = files + .get(&url) + .await .ok_or(ParseBookError::MissingContainer)?; - let str = std::str::from_utf8(data) - .map_err(ParseBookError::Utf8Error)?; + let str = std::str::from_utf8(data).map_err(ParseBookError::Utf8Error)?; - str.parse::() - .map_err(ParseBookError::ParseContainerError)? + parse_container(str, &root_url).map_err(ParseBookError::ParseContainerError)? }; let package_parse_options = PackageParseOptions { @@ -82,18 +79,20 @@ pub fn parse_book(files: &mut F) -> Result { let mut package_parser = PackageParser::new(package_parse_options); - let packages = container.rootfiles.iter() - .map(|rootfile| { - let data = files.get(&rootfile.full_path) - .ok_or_else(|| ParseBookError::MissingPackage(rootfile.full_path.to_string()))?; + let mut packages = Vec::new(); + for rootfile in &container.rootfiles { + let data = files + .get(&rootfile.full_path) + .await + .ok_or_else(|| ParseBookError::MissingPackage(rootfile.full_path.to_string()))?; - let str = std::str::from_utf8(data) - .map_err(ParseBookError::Utf8Error)?; + let str = std::str::from_utf8(data).map_err(ParseBookError::Utf8Error)?; - package_parser.parse(str) - .map_err(ParseBookError::ParsePackageError) - }) - .collect::, _>>()?; + let package = package_parser + .parse(str) + .map_err(ParseBookError::ParsePackageError)?; + packages.push(package); + } Ok(EpubBook(packages)) -} \ No newline at end of file +} diff --git a/src/file/local.rs b/src/file/local.rs index 46182f6..b12111b 100644 --- a/src/file/local.rs +++ b/src/file/local.rs @@ -1,6 +1,6 @@ use std::collections::BTreeMap; use std::fmt::Debug; -use std::fs::{File, read_dir}; +use std::fs::{read_dir, File}; use std::io::{Read, Seek}; use std::path::{Path, PathBuf}; @@ -22,13 +22,13 @@ impl Files for LocalFiles { &self.root_url } - fn get(&mut self, url: &Url) -> Option<&Vec> { + async fn get(&mut self, url: &Url) -> Option<&Vec> { // remove the fragment from the URL - return if url.path_segments().is_none() { + if url.path_segments().is_none() { self.files.get(url) } else { self.files.get(&url.join("").unwrap()) - }; + } } } @@ -97,7 +97,7 @@ impl Files for LazyLocalFiles { &self.root_url } - fn get(&mut self, url: &Url) -> Option<&Vec> { + async fn get(&mut self, url: &Url) -> Option<&Vec> { let LazyLocalFiles { files, .. } = self; // remove the fragment from the URL @@ -113,7 +113,7 @@ impl Files for LazyLocalFiles { let lazy_file = lazy_file.unwrap(); - return if let LazyFile::Loaded(bytes) = lazy_file { + if let LazyFile::Loaded(bytes) = lazy_file { // if the file is already loaded, return the bytes Some(bytes) } else { @@ -127,8 +127,8 @@ impl Files for LazyLocalFiles { *lazy_file = LazyFile::Loaded(content); // return the bytes - Some(lazy_file.bytes().unwrap()) - }; + Some(lazy_file.bytes()?) + } } } @@ -142,7 +142,9 @@ pub enum LocalFilesError { } /// Read files from a ZIP archive. -pub fn read_from_zip(zip: &mut ZipArchive) -> Result { +pub fn read_from_zip( + zip: &mut ZipArchive, +) -> Result { let mut files = LocalFiles::empty(); for i in 0..zip.len() { let mut file = zip.by_index(i)?; @@ -212,7 +214,9 @@ pub fn lazy_read_from_dir(path: impl AsRef) -> Result let rel_path = file_path.strip_prefix(&path).unwrap(); let rel_path_str = rel_path.to_str().unwrap().replace("\\", "/"); let url = Url::parse(&format!("epub:/{}", rel_path_str)).unwrap(); - files.files.insert(url, LazyFile::NotLoaded(File::open(&file_path)?)); + files + .files + .insert(url, LazyFile::NotLoaded(File::open(&file_path)?)); } Ok(files) } @@ -220,4 +224,4 @@ pub fn lazy_read_from_dir(path: impl AsRef) -> Result /// Read files from a ZIP file. pub fn read_from_file(file: File) -> Result { Ok(read_from_zip(&mut ZipArchive::new(file)?)?) -} \ No newline at end of file +} diff --git a/src/file/mod.rs b/src/file/mod.rs index 60e14ea..4ca1975 100644 --- a/src/file/mod.rs +++ b/src/file/mod.rs @@ -9,9 +9,18 @@ pub trait Files { fn root_url(&self) -> &Url; /// Get the content of a file by its URL. - fn get(&mut self, url: &Url) -> Option<&Vec>; + async fn get(&mut self, url: &Url) -> Option<&Vec>; } -#[cfg(feature = "local")] -pub mod local; -mod remote; \ No newline at end of file +#[cfg(not(target_arch = "wasm32"))] +mod local; +#[cfg(not(target_arch = "wasm32"))] +pub use local::*; + +#[cfg(not(target_arch = "wasm32"))] +mod remote_epub; +#[cfg(not(target_arch = "wasm32"))] +pub use remote_epub::*; + +mod remote; +pub use remote::*; diff --git a/src/file/remote.rs b/src/file/remote.rs index e69de29..30e5424 100644 --- a/src/file/remote.rs +++ b/src/file/remote.rs @@ -0,0 +1,70 @@ +use crate::file::Files; +use std::collections::BTreeMap; +use std::fmt::Debug; +use thiserror::Error; +use url::Url; + +#[cfg(target_arch = "wasm32")] +use reqwest_wasm as reqwest; + +#[derive(Clone, Debug)] +pub struct RemoteFiles { + url: Url, + client: reqwest::Client, + cache: BTreeMap>, +} + +impl Files for RemoteFiles { + fn root_url(&self) -> &Url { + &self.url + } + + async fn get(&mut self, url: &Url) -> Option<&Vec> { + if !self.cache.contains_key(url) { + // fetch the file from the remote server + let response = self.client.get(url.clone()).send().await; + if let Ok(response) = response { + let data = response.bytes().await; + if let Ok(data) = data { + self.cache.insert(url.clone(), data.to_vec()); + } + } + } + self.cache.get(url) + } +} + +impl RemoteFiles { + pub fn new(url: Url) -> Self { + RemoteFiles { + url, + cache: BTreeMap::new(), + client: reqwest::Client::builder().build().unwrap(), + } + } + + pub fn new_with_client(url: Url, client: reqwest::Client) -> Self { + RemoteFiles { + url, + cache: BTreeMap::new(), + client, + } + } +} + +#[derive(Debug, Error)] +pub enum RemoteError { + #[error("Failed to parse URL")] + UrlParseError(#[from] url::ParseError), +} + +/// Read files from a remote URL. +pub async fn read_from_url_str(url: &str) -> Result { + let url = Url::parse(url).map_err(RemoteError::UrlParseError)?; + Ok(RemoteFiles::new(url)) +} + +/// Read files from a remote URL. +pub async fn read_from_url(url: Url) -> RemoteFiles { + RemoteFiles::new(url) +} diff --git a/src/file/remote_epub.rs b/src/file/remote_epub.rs new file mode 100644 index 0000000..493a42b --- /dev/null +++ b/src/file/remote_epub.rs @@ -0,0 +1,77 @@ +use crate::file::Files; +use std::collections::BTreeMap; +use std::error::Error; +use std::io::{Cursor, Read}; +use url::Url; +use zip::ZipArchive; + +#[derive(Debug)] +pub struct RemoteEpub { + original_url: Url, + logical_root_url: Url, + client: reqwest::Client, + + has_fetched_zip: bool, + fetch_zip_error: bool, + files: BTreeMap>, +} + +impl RemoteEpub { + async fn fetch_zip(&mut self) -> Result<(), Box> { + // fetch zip file from original_url and extract files + let response = self.client.get(self.original_url.clone()).send().await?; + let stream = response.bytes().await?; + let mut reader = Cursor::new(stream); + let mut zip = ZipArchive::new(&mut reader)?; + for i in 0..zip.len() { + let mut file = zip.by_index(i)?; + let mut content = Vec::new(); + file.read_to_end(&mut content)?; + let url = self.logical_root_url.join(file.name())?; + self.files.insert(url, content); + } + Ok(()) + } +} + +impl Files for RemoteEpub { + fn root_url(&self) -> &Url { + &self.logical_root_url + } + + async fn get(&mut self, url: &Url) -> Option<&Vec> { + // if `has_fetched_zip` is false, fetch zip file from original_url and extract files + if !self.has_fetched_zip { + if self.fetch_zip_error { + return None; + } + if self.fetch_zip().await.is_err() { + self.fetch_zip_error = true; + } else { + self.has_fetched_zip = true; + } + if self.fetch_zip_error { + return None; + } + } + self.files.get(url) + } +} + +/// Read files from an EPUB URL. +pub fn read_from_epub_url(url: Url) -> RemoteEpub { + RemoteEpub { + original_url: url.clone(), + logical_root_url: url, + client: reqwest::Client::builder().build().unwrap(), + has_fetched_zip: false, + fetch_zip_error: false, + files: BTreeMap::new(), + } +} + +/// Read files from an EPUB URL string. +pub fn read_from_epub_url_str(url: &str) -> Result { + let url = Url::parse(url)?; + Ok(read_from_epub_url(url)) +} diff --git a/src/lib.rs b/src/lib.rs index fbaa821..171d159 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,6 @@ pub mod book; -pub mod package; pub mod file; -pub mod utils; pub mod oebps; +pub mod package; +pub mod utils; pub mod xhtml; diff --git a/src/oebps.rs b/src/oebps.rs index e14b163..3697393 100644 --- a/src/oebps.rs +++ b/src/oebps.rs @@ -48,52 +48,26 @@ pub enum ContainerError { ParseError(#[from] minidom::Error), } -impl FromStr for Container { - type Err = ContainerError; - - /// Parse the container.xml file. - /// - /// Note that if the `full-path` attribute of the `rootfile` element starts with `OPS/`, it will be replaced with `OEBPS/`. - /// - /// The structure of the container.xml file is as follows: - /// - /// ```xml - /// - /// - /// - /// - /// - /// - /// ``` - fn from_str(s: &str) -> Result { - parse_container(s) - } -} - - /// Parse the container.xml file. -fn parse_container(str: &str) -> Result { - let rootfiles = str.parse::() +pub fn parse_container(str: &str, root_path: &Url) -> Result { + let rootfiles = str + .parse::() .map_err(ContainerError::ParseError)? - // container .children() .find(|n| n.name() == "rootfiles") .ok_or(ContainerError::MissingRootfiles)? - // container -> rootfiles .children() .filter(|n| n.name() == "rootfile") - // container -> rootfiles -> rootfile .map(|n| { - let full_path_str = n.attr("full-path") - .ok_or(ContainerError::MissingFullPath)?; - let media_type_str = n.attr("media-type") + let full_path_str = n.attr("full-path").ok_or(ContainerError::MissingFullPath)?; + let media_type_str = n + .attr("media-type") .ok_or(ContainerError::MissingMediaType)?; - let full_path_url_str = format!("epub:/{}", full_path_str); - let full_path = Url::parse(&full_path_url_str)?; + let full_path = root_path.join(full_path_str)?; let media_type = MediaType::new(media_type_str); if &media_type != OEBPS.deref() { @@ -127,4 +101,4 @@ mod tests { assert_eq!(container.rootfiles.len(), 1); } -} \ No newline at end of file +} diff --git a/src/package/manifest.rs b/src/package/manifest.rs index 570b9e0..dbf1800 100644 --- a/src/package/manifest.rs +++ b/src/package/manifest.rs @@ -8,7 +8,6 @@ use url::Url; use crate::file::Files; use crate::package::media_type::MediaType; -use crate::package::nav::{Nav, parse_nav}; use crate::package::prefix::prefixes::*; use crate::package::property::{Properties, Property}; @@ -46,19 +45,17 @@ pub struct Resource { pub properties: Option, } - pub trait ResourceMap { /// Get a resource content by [Resource]. - fn get_by_res(&mut self, res: &Resource) -> Option<&Vec>; + async fn get_by_res(&mut self, res: &Resource) -> Option<&Vec>; } impl ResourceMap for F { - fn get_by_res(&mut self, res: &Resource) -> Option<&Vec> { - self.get(&res.href) + async fn get_by_res(&mut self, res: &Resource) -> Option<&Vec> { + self.get(&res.href).await } } - #[derive(Debug, Error)] pub enum ManifestCheckError { #[error("The id of the resource must be unique, but {0} is duplicated")] @@ -95,9 +92,7 @@ pub struct Manifest { nav_resource: usize, } -static NAV: Lazy = Lazy::new(|| { - Property::from_prefix(&OPF, "nav".to_string()) -}); +static NAV: Lazy = Lazy::new(|| Property::from_prefix(&OPF, "nav".to_string())); impl Manifest { /// Create a new Manifest @@ -120,17 +115,23 @@ impl Manifest { // check fallback for resource in resources.iter() { if let Some(fallback) = &resource.fallback { - id_to_resource.get(fallback) + id_to_resource + .get(fallback) .ok_or_else(|| ManifestCheckError::IdNotFound(fallback.clone()))?; } } // check nav - let nav_resource = resources.iter().position(|resource| { - resource.properties.as_ref() - .map(|properties| properties.contains(&NAV)) - .unwrap_or(false) - }).ok_or(ManifestCheckError::NavResourceNotFound)?; + let nav_resource = resources + .iter() + .position(|resource| { + resource + .properties + .as_ref() + .map(|properties| properties.contains(&NAV)) + .unwrap_or(false) + }) + .ok_or(ManifestCheckError::NavResourceNotFound)?; Ok(Manifest { id: id.map(|id| id.to_string()), @@ -143,13 +144,15 @@ impl Manifest { /// Get a resource by id pub fn get_resource_by_id(&self, id: &str) -> Option<&Resource> { - self.id_to_resource.get(id) + self.id_to_resource + .get(id) .map(|index| &self.resources[*index]) } /// Get a resource by href pub fn get_resource_by_href(&self, href: &Url) -> Option<&Resource> { - self.href_to_resource.get(href) + self.href_to_resource + .get(href) .map(|index| &self.resources[*index]) } @@ -171,4 +174,3 @@ impl DerefMut for Manifest { &mut self.resources } } - diff --git a/src/package/media_type.rs b/src/package/media_type.rs index eea13cb..c1e9b6a 100644 --- a/src/package/media_type.rs +++ b/src/package/media_type.rs @@ -54,7 +54,8 @@ impl MediaType { /// Check if the media type is a core media type pub fn is_core_media_type(&self) -> bool { - media_types::ALL_CORE_MEDIA_TYPES.iter() + media_types::ALL_CORE_MEDIA_TYPES + .iter() .any(|&core_media_type| core_media_type.eq(self)) } } @@ -87,42 +88,68 @@ pub mod media_types { pub static WOFF: Lazy = Lazy::new(|| MediaType("font/woff".to_string())); pub static WOFF2: Lazy = Lazy::new(|| MediaType("font/woff2".to_string())); pub static SFNT: Lazy = Lazy::new(|| MediaType("application/font-sfnt".to_string())); - pub static VND_MS: Lazy = Lazy::new(|| MediaType("application/vnd.ms-opentype".to_string())); - pub static APP_WOFF: Lazy = Lazy::new(|| MediaType("application/font-woff".to_string())); + pub static VND_MS: Lazy = + Lazy::new(|| MediaType("application/vnd.ms-opentype".to_string())); + pub static APP_WOFF: Lazy = + Lazy::new(|| MediaType("application/font-woff".to_string())); // other - pub static XHTML: Lazy = Lazy::new(|| MediaType("application/xhtml+xml".to_string())); - pub static TEXT_JAVASCRIPT: Lazy = Lazy::new(|| MediaType("text/javascript".to_string())); - pub static APP_JAVASCRIPT: Lazy = Lazy::new(|| MediaType("application/javascript".to_string())); - pub static ECMASCRIPT: Lazy = Lazy::new(|| MediaType("application/ecmascript".to_string())); - pub static NCX: Lazy = Lazy::new(|| MediaType("application/x-dtbncx+xml".to_string())); + pub static XHTML: Lazy = + Lazy::new(|| MediaType("application/xhtml+xml".to_string())); + pub static TEXT_JAVASCRIPT: Lazy = + Lazy::new(|| MediaType("text/javascript".to_string())); + pub static APP_JAVASCRIPT: Lazy = + Lazy::new(|| MediaType("application/javascript".to_string())); + pub static ECMASCRIPT: Lazy = + Lazy::new(|| MediaType("application/ecmascript".to_string())); + pub static NCX: Lazy = + Lazy::new(|| MediaType("application/x-dtbncx+xml".to_string())); pub static SMIL: Lazy = Lazy::new(|| MediaType("application/smil+xml".to_string())); // all media types pub static ALL_CORE_MEDIA_TYPES: [&Lazy; 22] = [ - &GIF, &JPG, &PNG, &SVG, &WEBP, - &MP3, &MP4, &OGG, + &GIF, + &JPG, + &PNG, + &SVG, + &WEBP, + &MP3, + &MP4, + &OGG, &CSS, - &TTF, &OTF, &WOFF, &WOFF2, &SFNT, &VND_MS, &APP_WOFF, - &XHTML, &TEXT_JAVASCRIPT, &APP_JAVASCRIPT, &ECMASCRIPT, &NCX, &SMIL + &TTF, + &OTF, + &WOFF, + &WOFF2, + &SFNT, + &VND_MS, + &APP_WOFF, + &XHTML, + &TEXT_JAVASCRIPT, + &APP_JAVASCRIPT, + &ECMASCRIPT, + &NCX, + &SMIL, ]; // epub media type pub static EPUB: Lazy = Lazy::new(|| MediaType("application/epub+zip".to_string())); // oebps media type - pub static OEBPS: Lazy = Lazy::new(|| MediaType("application/oebps-package+xml".to_string())); + pub static OEBPS: Lazy = + Lazy::new(|| MediaType("application/oebps-package+xml".to_string())); } - #[cfg(test)] mod tests { use super::*; #[test] fn test_all_core_media_types() { - media_types::ALL_CORE_MEDIA_TYPES.iter().for_each(|&media_type| { - assert!(media_type.is_core_media_type()); - }); + media_types::ALL_CORE_MEDIA_TYPES + .iter() + .for_each(|&media_type| { + assert!(media_type.is_core_media_type()); + }); } -} \ No newline at end of file +} diff --git a/src/package/metadata.rs b/src/package/metadata.rs index d81485b..90a8a3f 100644 --- a/src/package/metadata.rs +++ b/src/package/metadata.rs @@ -35,7 +35,6 @@ pub struct MetadataElement { pub tag_name: WithNamespace, } - /// Establishes an association between the current expression and /// the element or resource identified by its value. /// EPUB creators MUST use as the value a path-relative-scheme-less-URL string, @@ -144,7 +143,6 @@ pub struct Link { pub value: String, } - #[derive(Debug, Error)] pub enum MetadataCheckError { #[error("The metadata section MUST contain exactly at least one {0} element.")] @@ -158,6 +156,9 @@ pub enum MetadataCheckError { DateParseError(#[from] chrono::ParseError), } +fn x() { +} + /// The metadata section of an EPUB Publication. #[derive(Debug, Clone)] pub struct Metadata { @@ -184,21 +185,17 @@ pub struct Metadata { _private: PhantomData<()>, } -static DCTERMS_MODIFIED: Lazy = Lazy::new(|| { - Property::from_prefix(&DCTERMS, "modified".to_string()) -}); +static DCTERMS_MODIFIED: Lazy = + Lazy::new(|| Property::from_prefix(&DCTERMS, "modified".to_string())); -static DC_TITLE: Lazy = Lazy::new(|| { - WithNamespace::from_prefix(&DC, "title".to_string()) -}); +static DC_TITLE: Lazy = + Lazy::new(|| WithNamespace::from_prefix(&DC, "title".to_string())); -static DC_LANGUAGE: Lazy = Lazy::new(|| { - WithNamespace::from_prefix(&DC, "language".to_string()) -}); +static DC_LANGUAGE: Lazy = + Lazy::new(|| WithNamespace::from_prefix(&DC, "language".to_string())); -static DC_IDENTIFIER: Lazy = Lazy::new(|| { - WithNamespace::from_prefix(&DC, "identifier".to_string()) -}); +static DC_IDENTIFIER: Lazy = + Lazy::new(|| WithNamespace::from_prefix(&DC, "identifier".to_string())); impl Metadata { /// Create a new Metadata @@ -213,9 +210,7 @@ impl Metadata { // group metadata elements by property for elem in elems { let wn = elem.tag_name.clone(); - elems_map.entry(wn) - .or_insert_with(Vec::new) - .push(elem); + elems_map.entry(wn).or_insert_with(Vec::new).push(elem); } elems_map }; @@ -228,7 +223,9 @@ impl Metadata { ) -> Result<(), MetadataCheckError> { let elems = elems_map.get(&tag_name); if elems.is_none() || elems.unwrap().is_empty() { - Err(MetadataCheckError::MissingElementError(tag_name.reference.clone())) + Err(MetadataCheckError::MissingElementError( + tag_name.reference.clone(), + )) } else { Ok(()) } @@ -241,12 +238,14 @@ impl Metadata { // check lastModified let last_modified = { - let last_modified = metas.iter() + let last_modified = metas + .iter() .find(|&meta| meta.property.eq(&DCTERMS_MODIFIED)) - .ok_or(MetadataCheckError::MissingLastModifiedError("dcterms:modified".to_string()))?; + .ok_or(MetadataCheckError::MissingLastModifiedError( + "dcterms:modified".to_string(), + ))?; - DateTime::parse_from_rfc3339(&last_modified.value)? - .to_utc() + DateTime::parse_from_rfc3339(&last_modified.value)?.to_utc() }; Ok(Metadata { @@ -272,4 +271,4 @@ impl Metadata { pub fn identifiers(&self) -> &Vec { self.elems.get(&DC_IDENTIFIER).unwrap() } -} \ No newline at end of file +} diff --git a/src/package/mod.rs b/src/package/mod.rs index 142953f..4767bbc 100644 --- a/src/package/mod.rs +++ b/src/package/mod.rs @@ -6,13 +6,13 @@ use crate::package::manifest::Resource; use crate::package::spine::SpineReference; pub mod manifest; -pub mod property; -pub mod spine; pub mod media_type; pub mod metadata; pub mod nav; pub mod parser; pub mod prefix; +pub mod property; +pub mod spine; /// A Package is made up of: /// - A [Metadata]: provides a standard way to include publication metadata. @@ -64,4 +64,4 @@ impl Package { pub fn nav_resource(&self) -> Option<&Resource> { self.manifest.nav_resource() } -} \ No newline at end of file +} diff --git a/src/package/nav.rs b/src/package/nav.rs index 4b9e1fc..1d47512 100644 --- a/src/package/nav.rs +++ b/src/package/nav.rs @@ -1,7 +1,6 @@ use minidom::Element; use thiserror::Error; use url::Url; -use crate::oebps::ContainerError; /// The type of the nav. pub enum NavType { @@ -84,16 +83,13 @@ pub enum NavParseError { /// /// ``` pub fn parse_nav(str: &str) -> Result { - let root_elem = str.parse::() - .map_err(ContainerError::ParseError)?; + let root_elem = str.parse::()?; if root_elem.name() != "nav" { return Err(NavParseError::InvalidRoot(root_elem.name().to_string())); } - let ty = root_elem.attr("epub:type") - .map(|s| s.to_string()); - + let ty = root_elem.attr("epub:type").map(|s| s.to_string()); unimplemented!() -} \ No newline at end of file +} diff --git a/src/package/parser.rs b/src/package/parser.rs index 9adfd0e..19260d5 100644 --- a/src/package/parser.rs +++ b/src/package/parser.rs @@ -6,12 +6,14 @@ use thiserror::Error; use url::Url; use crate::package::manifest::{Manifest, ManifestCheckError, Resource}; -use crate::package::metadata::{Link, Meta, Metadata, MetadataCheckError, MetadataElement, Refines}; -use crate::package::Package; -use crate::package::prefix::{Prefixes, PrefixesStack}; +use crate::package::metadata::{ + Link, Meta, Metadata, MetadataCheckError, MetadataElement, Refines, +}; use crate::package::prefix::prefixes::*; +use crate::package::prefix::{Prefixes, PrefixesStack}; use crate::package::property::{Properties, Property, WithNamespace}; use crate::package::spine::{Spine, SpineReference}; +use crate::package::Package; use crate::utils::invert; #[derive(Debug, Error)] @@ -59,13 +61,14 @@ pub struct PackageParser { _private: PhantomData<()>, } - impl PackageParser { /// Create a new package parser. pub fn new(options: PackageParseOptions) -> Self { PackageParser { options, - parse_state: ParseState { prefixes_stack: PrefixesStack::default() }, + parse_state: ParseState { + prefixes_stack: PrefixesStack::default(), + }, _private: Default::default(), } } @@ -82,23 +85,28 @@ impl PackageParser { /// - `str` - A string slice that holds the package document. pub fn parse(&mut self, str: &str) -> Result { self.clear(); - self.parse_state.prefixes_stack.push(self.options.reserved_prefixes.clone()); + self.parse_state + .prefixes_stack + .push(self.options.reserved_prefixes.clone()); let root = Element::from_reader_with_prefixes( str.as_bytes(), self.options.reserved_prefixes.inner().clone(), - ).map_err(PackageError::ParseError)?; + ) + .map_err(PackageError::ParseError)?; if root.name() != "package" { - return Err(PackageError::InvalidElementError("root element is not package".to_string())); + return Err(PackageError::InvalidElementError( + "root element is not package".to_string(), + )); } let package_elem = root; - let prefixes = package_elem.prefixes - .declared_prefixes() - .clone(); - self.parse_state.prefixes_stack.push(Prefixes::new(prefixes)); + let prefixes = package_elem.prefixes.declared_prefixes().clone(); + self.parse_state + .prefixes_stack + .push(Prefixes::new(prefixes)); let res = self.parse_package(&package_elem); self.parse_state.prefixes_stack.pop(); @@ -124,27 +132,46 @@ impl PackageParser { let lang = parse_attr(&package_elem, "xml:lang")?; // get metadata - let metadata_elem = package_elem.children() + let metadata_elem = package_elem + .children() .find(|n| n.name() == "metadata") - .ok_or(PackageError::InvalidElementError("metadata is missing".to_string()))?; + .ok_or(PackageError::InvalidElementError( + "metadata is missing".to_string(), + ))?; let metadata = self.parse_metadata(metadata_elem)?; // get manifest - let manifest_elem = package_elem.children() + let manifest_elem = package_elem + .children() .find(|n| n.name() == "manifest") - .ok_or(PackageError::InvalidElementError("manifest is missing".to_string()))?; + .ok_or(PackageError::InvalidElementError( + "manifest is missing".to_string(), + ))?; let manifest = self.parse_manifest(manifest_elem)?; // get spine - let spine_elem = package_elem.children() + let spine_elem = package_elem + .children() .find(|n| n.name() == "spine") - .ok_or(PackageError::InvalidElementError("spine is missing".to_string()))?; + .ok_or(PackageError::InvalidElementError( + "spine is missing".to_string(), + ))?; let spine = self.parse_spine(spine_elem)?; - Ok(Package { unique_identifier_ref, version, prefix, dir, id, lang, metadata, manifest, spine }) + Ok(Package { + unique_identifier_ref, + version, + prefix, + dir, + id, + lang, + metadata, + manifest, + spine, + }) } /// Parse a metadata element to [Metadata]. @@ -154,11 +181,15 @@ impl PackageParser { let mut links = Vec::new(); let metadata_prefixes = metadata_elem.prefixes.declared_prefixes().clone(); - self.parse_state.prefixes_stack.push(Prefixes::new(metadata_prefixes)); + self.parse_state + .prefixes_stack + .push(Prefixes::new(metadata_prefixes)); for elem in metadata_elem.children() { let elem_prefixes = elem.prefixes.declared_prefixes().clone(); - self.parse_state.prefixes_stack.push(Prefixes::new(elem_prefixes)); + self.parse_state + .prefixes_stack + .push(Prefixes::new(elem_prefixes)); let res = self.parse_metadata_elem(elem, &mut elems, &mut metas, &mut links); self.parse_state.prefixes_stack.pop(); @@ -183,15 +214,26 @@ impl PackageParser { let id = parse_attr(elem, "id")?; let lang = parse_attr(elem, "xml:lang")?; let dir = parse_attr(elem, "dir")?; - let property = parse_attr_some_fn(elem, "property", |s| Property::from_str(s, &self.parse_state.prefixes_stack))?; - let refines = parse_attr_fn( - elem, "refines", - |s| Refines::from_relative_url(s, &self.options.base_url), - )?; - let scheme = parse_attr_fn(elem, "scheme", |s| Property::from_str(s, &self.parse_state.prefixes_stack))?; + let property = parse_attr_some_fn(elem, "property", |s| { + Property::from_str(s, &self.parse_state.prefixes_stack) + })?; + let refines = parse_attr_fn(elem, "refines", |s| { + Refines::from_relative_url(s, &self.options.base_url) + })?; + let scheme = parse_attr_fn(elem, "scheme", |s| { + Property::from_str(s, &self.parse_state.prefixes_stack) + })?; let value = elem.text(); - metas.push(Meta { id, lang, dir, property, refines, scheme, value }); + metas.push(Meta { + id, + lang, + dir, + property, + refines, + scheme, + value, + }); Ok(()) } @@ -200,16 +242,28 @@ impl PackageParser { let id = parse_attr(elem, "id")?; let href = parse_attr_some_fn(elem, "href", |s| self.options.base_url.join(s))?; let hreflang = parse_attr(elem, "hreflang")?; - let rel = parse_attr_some_fn(elem, "rel", |s| Properties::from_str(s, &self.parse_state.prefixes_stack))?; + let rel = parse_attr_some_fn(elem, "rel", |s| { + Properties::from_str(s, &self.parse_state.prefixes_stack) + })?; let media_type = parse_attr(elem, "media-type")?; - let property = parse_attr_fn(elem, "properties", |s| Property::from_str(s, &self.parse_state.prefixes_stack))?; - let refines = parse_attr_fn( - elem, "refines", - |s| Refines::from_relative_url(s, &self.options.base_url), - )?; + let property = parse_attr_fn(elem, "properties", |s| { + Property::from_str(s, &self.parse_state.prefixes_stack) + })?; + let refines = parse_attr_fn(elem, "refines", |s| { + Refines::from_relative_url(s, &self.options.base_url) + })?; let value = elem.text(); - links.push(Link { id, href, rel, hreflang, media_type, property, refines, value }); + links.push(Link { + id, + href, + rel, + hreflang, + media_type, + property, + refines, + value, + }); Ok(()) } @@ -225,10 +279,18 @@ impl PackageParser { reference: elem.name().to_string(), }; - elems.push(MetadataElement { id, lang, dir, tag_name }); + elems.push(MetadataElement { + id, + lang, + dir, + tag_name, + }); Ok(()) } else { - Err(PackageError::InvalidElementError(format!("Invalid metadata element: {}", elem.name()))) + Err(PackageError::InvalidElementError(format!( + "Invalid metadata element: {}", + elem.name() + ))) } } } @@ -237,10 +299,13 @@ impl PackageParser { /// Parse a manifest element to [Manifest]. fn parse_manifest(&mut self, manifest_elem: &Element) -> Result { let id = manifest_elem.attr("id"); - let resources = manifest_elem.children() + let resources = manifest_elem + .children() .map(|elem| { let elem_prefixes = elem.prefixes.declared_prefixes().clone(); - self.parse_state.prefixes_stack.push(Prefixes::new(elem_prefixes)); + self.parse_state + .prefixes_stack + .push(Prefixes::new(elem_prefixes)); let res = self.parse_manifest_elem(elem); self.parse_state.prefixes_stack.pop(); @@ -254,27 +319,41 @@ impl PackageParser { /// Parse a manifest item element to [Resource]. fn parse_manifest_elem(&self, elem: &Element) -> Result { if elem.name() != "item" { - return Err(PackageError::InvalidElementError("Invalid manifest item".to_string())); + return Err(PackageError::InvalidElementError( + "Invalid manifest item".to_string(), + )); } let id = parse_attr_some(elem, "id")?; let href = parse_attr_some_fn(elem, "href", |s| self.options.base_url.join(s))?; let media_type = parse_attr_some(elem, "media-type")?; - let properties = parse_attr_fn(elem, "properties", |s| Properties::from_str(s, &self.parse_state.prefixes_stack))?; + let properties = parse_attr_fn(elem, "properties", |s| { + Properties::from_str(s, &self.parse_state.prefixes_stack) + })?; let fallback = parse_attr(elem, "fallback")?; let media_overlay = parse_attr(elem, "media-overlay")?; - Ok(Resource { id, href, media_type, properties, fallback, media_overlay }) + Ok(Resource { + id, + href, + media_type, + properties, + fallback, + media_overlay, + }) } /// Parse a spine element to [Spine]. fn parse_spine(&mut self, spine_elem: &Element) -> Result { let id = parse_attr(spine_elem, "id")?; let dir = parse_attr(spine_elem, "page-progression-direction")?; - let refs = spine_elem.children() + let refs = spine_elem + .children() .map(|elem| { let elem_prefixes = elem.prefixes.declared_prefixes().clone(); - self.parse_state.prefixes_stack.push(Prefixes::new(elem_prefixes)); + self.parse_state + .prefixes_stack + .push(Prefixes::new(elem_prefixes)); let res = self.parse_spine_elem(elem); self.parse_state.prefixes_stack.pop(); @@ -288,7 +367,9 @@ impl PackageParser { /// Parse a spine itemref element to [SpineReference]. fn parse_spine_elem(&self, elem: &Element) -> Result { if elem.name() != "itemref" { - return Err(PackageError::InvalidElementError("Invalid spine itemref".to_string())); + return Err(PackageError::InvalidElementError( + "Invalid spine itemref".to_string(), + )); } let id = parse_attr_some(elem, "idref")?; @@ -298,7 +379,6 @@ impl PackageParser { } } - fn parse_attr(elem: &Element, name: &str) -> Result, PackageError> where T: FromStr, @@ -306,24 +386,23 @@ where parse_attr_fn(elem, name, |s| s.parse::()) } -fn parse_attr_fn( - elem: &Element, - name: &str, - f: F, -) -> Result, PackageError> +fn parse_attr_fn(elem: &Element, name: &str, f: F) -> Result, PackageError> where F: FnOnce(&str) -> Result, { let attr_str = elem.attr(name); let res = attr_str.map(f); - invert(res) - .map_err(|_| PackageError::InvalidElementAttrError(format!("{} is invalid: {}", name, attr_str.unwrap()))) + invert(res).map_err(|_| { + PackageError::InvalidElementAttrError(format!("{} is invalid: {}", name, attr_str.unwrap())) + }) } -fn parse_attr_primitive<'a>(elem: &'a Element, name: &str) -> Result<&'a str, PackageError> -{ +fn parse_attr_primitive<'a>(elem: &'a Element, name: &str) -> Result<&'a str, PackageError> { elem.attr(name) - .ok_or(PackageError::InvalidElementAttrError(format!("{} is missing", name))) + .ok_or(PackageError::InvalidElementAttrError(format!( + "{} is missing", + name + ))) } fn parse_attr_some(elem: &Element, name: &str) -> Result @@ -333,15 +412,16 @@ where parse_attr_some_fn(elem, name, |s| s.parse::()) } -fn parse_attr_some_fn( - elem: &Element, - name: &str, - f: F, -) -> Result +fn parse_attr_some_fn(elem: &Element, name: &str, f: F) -> Result where F: FnOnce(&str) -> Result, { let attr_str = elem.attr(name); - let res = attr_str.ok_or(PackageError::InvalidElementAttrError(format!("{} is missing", name)))?; - f(res).map_err(|_| PackageError::InvalidElementAttrError(format!("{} is invalid: {}", name, attr_str.unwrap()))) -} \ No newline at end of file + let res = attr_str.ok_or(PackageError::InvalidElementAttrError(format!( + "{} is missing", + name + )))?; + f(res).map_err(|_| { + PackageError::InvalidElementAttrError(format!("{} is invalid: {}", name, attr_str.unwrap())) + }) +} diff --git a/src/package/prefix.rs b/src/package/prefix.rs index 847f307..a2206b6 100644 --- a/src/package/prefix.rs +++ b/src/package/prefix.rs @@ -1,8 +1,8 @@ use std::collections::BTreeMap; use std::ops::{Deref, DerefMut}; -use once_cell::sync::Lazy; use crate::package::prefix::prefixes::*; +use once_cell::sync::Lazy; /// A map of prefixes to namespaces. /// @@ -21,7 +21,6 @@ pub trait PrefixMap { fn get(&self, prefix: &Option) -> Option<&String>; } - /// A prefix for a namespace. /// /// There are a number of predefined prefixes for common namespaces: @@ -114,7 +113,6 @@ pub mod prefixes { uri: "http://www.prismstandard.org/specifications/3.0/PRISM_CV_Spec_3.0.htm#".to_string(), }); - /// The default prefix for the OPF namespace. pub static OPF: Lazy = Lazy::new(|| Prefix { name: None, @@ -124,7 +122,6 @@ pub mod prefixes { pub type PrefixesInner = BTreeMap, String>; - /// A map of prefixes to namespaces. #[derive(Debug, PartialEq, Clone)] pub struct Prefixes(PrefixesInner); @@ -225,7 +222,6 @@ impl DerefMut for PrefixesStack { } } - impl PrefixesStack { /// Create a new PrefixesStack from a list of Prefixes. pub fn new(prefixes: Vec) -> Self { @@ -246,4 +242,4 @@ impl PrefixMap for PrefixesStack { } None } -} \ No newline at end of file +} diff --git a/src/package/property.rs b/src/package/property.rs index 3341a92..1befc4b 100644 --- a/src/package/property.rs +++ b/src/package/property.rs @@ -1,7 +1,6 @@ use std::cmp::PartialEq; use std::fmt::Display; use std::ops::{Deref, DerefMut}; - use thiserror::Error; use crate::package::prefix::{Prefix, PrefixMap}; @@ -10,7 +9,6 @@ use crate::package::prefix::{Prefix, PrefixMap}; #[error("Invalid namespace: {0:?}")] pub struct NamespaceError(Option); - /// A value with a namespace. /// /// It can be used to represent a property or a tag name. @@ -70,8 +68,13 @@ impl WithNamespace { /// ``` pub fn from_str(s: &str, prefixes: &impl PrefixMap) -> Result { let split: Vec<&str> = s.split(':').collect(); - let prefix = if split.len() == 2 { Some(split[0].to_string()) } else { None }; - let namespace = prefixes.get(&prefix) + let prefix = if split.len() == 2 { + Some(split[0].to_string()) + } else { + None + }; + let namespace = prefixes + .get(&prefix) .ok_or(NamespaceError(prefix.clone()))? .clone(); let reference = split.last().unwrap().to_string(); @@ -82,7 +85,6 @@ impl WithNamespace { } } - /// The property data type is a compact means of expressing a URL and /// consists of an OPTIONAL prefix separated from a reference by a colon. /// @@ -109,7 +111,6 @@ impl DerefMut for Property { } } - impl Property { /// Create a new Property pub fn new(ns: String, reference: String) -> Self { @@ -129,7 +130,6 @@ impl Property { } } - /// A white space-separated list of property values. #[derive(Debug, PartialEq, Clone)] pub struct Properties(Vec); @@ -146,7 +146,8 @@ impl Properties { /// /// See [Property::from_str] for more information . pub fn from_str(s: &str, prefixes: &impl PrefixMap) -> Result { - let properties = s.split_whitespace() + let properties = s + .split_whitespace() .map(|property| Property::from_str(property, prefixes)) .collect::, NamespaceError>>()?; Ok(Properties(properties)) @@ -170,4 +171,4 @@ impl DerefMut for Properties { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } -} \ No newline at end of file +} diff --git a/src/package/spine.rs b/src/package/spine.rs index 72a6a55..3959536 100644 --- a/src/package/spine.rs +++ b/src/package/spine.rs @@ -10,7 +10,6 @@ pub struct SpineReference { pub linear: Option, } - /// The spine element defines the default reading order of the publication. /// /// It is made up of a list of spine references that point to resources in the manifest. @@ -26,7 +25,6 @@ pub struct Spine { pub refs: Vec, } - impl Deref for Spine { type Target = Vec; @@ -35,9 +33,8 @@ impl Deref for Spine { } } - impl DerefMut for Spine { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.refs } -} \ No newline at end of file +} diff --git a/src/xhtml.rs b/src/xhtml.rs index 81edbc0..880cdca 100644 --- a/src/xhtml.rs +++ b/src/xhtml.rs @@ -74,7 +74,6 @@ pub enum XHTMLParseError { } - pub fn parse_xhtml(s: &str) -> Result { let xhtml = s.parse::()?; XHTML::new(xhtml)