Add integrated server
This commit is contained in:
		
							
								
								
									
										393
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										393
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @@ -2,6 +2,24 @@ | ||||
| # It is not intended for manual editing. | ||||
| version = 3 | ||||
|  | ||||
| [[package]] | ||||
| name = "adler" | ||||
| version = "1.0.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" | ||||
|  | ||||
| [[package]] | ||||
| name = "aes" | ||||
| version = "0.7.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "cipher", | ||||
|  "cpufeatures", | ||||
|  "opaque-debug", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "aho-corasick" | ||||
| version = "0.7.20" | ||||
| @@ -23,29 +41,74 @@ version = "0.13.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" | ||||
|  | ||||
| [[package]] | ||||
| name = "base64ct" | ||||
| version = "1.5.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf" | ||||
|  | ||||
| [[package]] | ||||
| name = "bitflags" | ||||
| version = "1.3.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" | ||||
|  | ||||
| [[package]] | ||||
| name = "block-buffer" | ||||
| version = "0.10.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" | ||||
| dependencies = [ | ||||
|  "generic-array", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "bumpalo" | ||||
| version = "3.11.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" | ||||
|  | ||||
| [[package]] | ||||
| name = "byteorder" | ||||
| version = "1.4.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" | ||||
|  | ||||
| [[package]] | ||||
| name = "bytes" | ||||
| version = "1.3.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" | ||||
|  | ||||
| [[package]] | ||||
| name = "bzip2" | ||||
| version = "0.4.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6afcd980b5f3a45017c57e57a2fcccbb351cc43a356ce117ef760ef8052b89b0" | ||||
| dependencies = [ | ||||
|  "bzip2-sys", | ||||
|  "libc", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "bzip2-sys" | ||||
| version = "0.1.11+1.0.8" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" | ||||
| dependencies = [ | ||||
|  "cc", | ||||
|  "libc", | ||||
|  "pkg-config", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "cc" | ||||
| version = "1.0.78" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" | ||||
| dependencies = [ | ||||
|  "jobserver", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "cfg-if" | ||||
| @@ -53,6 +116,21 @@ version = "1.0.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" | ||||
|  | ||||
| [[package]] | ||||
| name = "cipher" | ||||
| version = "0.3.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" | ||||
| dependencies = [ | ||||
|  "generic-array", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "constant_time_eq" | ||||
| version = "0.1.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" | ||||
|  | ||||
| [[package]] | ||||
| name = "core-foundation" | ||||
| version = "0.9.3" | ||||
| @@ -69,6 +147,54 @@ version = "0.8.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" | ||||
|  | ||||
| [[package]] | ||||
| name = "cpufeatures" | ||||
| version = "0.2.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "crc32fast" | ||||
| version = "1.3.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "crossbeam-utils" | ||||
| version = "0.8.14" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "crypto-common" | ||||
| version = "0.1.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" | ||||
| dependencies = [ | ||||
|  "generic-array", | ||||
|  "typenum", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "digest" | ||||
| version = "0.10.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" | ||||
| dependencies = [ | ||||
|  "block-buffer", | ||||
|  "crypto-common", | ||||
|  "subtle", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "encoding_rs" | ||||
| version = "0.8.31" | ||||
| @@ -121,6 +247,16 @@ dependencies = [ | ||||
|  "instant", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "flate2" | ||||
| version = "1.0.25" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" | ||||
| dependencies = [ | ||||
|  "crc32fast", | ||||
|  "miniz_oxide", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "fnv" | ||||
| version = "1.0.7" | ||||
| @@ -190,16 +326,41 @@ dependencies = [ | ||||
|  "pin-utils", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "generic-array" | ||||
| version = "0.14.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" | ||||
| dependencies = [ | ||||
|  "typenum", | ||||
|  "version_check", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "getrandom" | ||||
| version = "0.2.8" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "libc", | ||||
|  "wasi", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "grammalecte_client" | ||||
| version = "0.1.0" | ||||
| dependencies = [ | ||||
|  "env_logger", | ||||
|  "log", | ||||
|  "mktemp", | ||||
|  "port_scanner", | ||||
|  "rand", | ||||
|  "reqwest", | ||||
|  "serde", | ||||
|  "serde_json", | ||||
|  "tokio", | ||||
|  "zip", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| @@ -245,6 +406,15 @@ dependencies = [ | ||||
|  "libc", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "hmac" | ||||
| version = "0.12.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" | ||||
| dependencies = [ | ||||
|  "digest", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "http" | ||||
| version = "0.2.8" | ||||
| @@ -385,6 +555,15 @@ version = "1.0.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" | ||||
|  | ||||
| [[package]] | ||||
| name = "jobserver" | ||||
| version = "0.1.25" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "js-sys" | ||||
| version = "0.3.60" | ||||
| @@ -443,6 +622,15 @@ version = "0.3.16" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" | ||||
|  | ||||
| [[package]] | ||||
| name = "miniz_oxide" | ||||
| version = "0.6.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" | ||||
| dependencies = [ | ||||
|  "adler", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "mio" | ||||
| version = "0.8.5" | ||||
| @@ -455,6 +643,15 @@ dependencies = [ | ||||
|  "windows-sys 0.42.0", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "mktemp" | ||||
| version = "0.5.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "4bdc1f74dd7bb717d39f784f844e490d935b3aa7e383008006dbbf29c1f7820a" | ||||
| dependencies = [ | ||||
|  "uuid", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "native-tls" | ||||
| version = "0.2.11" | ||||
| @@ -489,6 +686,12 @@ version = "1.16.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" | ||||
|  | ||||
| [[package]] | ||||
| name = "opaque-debug" | ||||
| version = "0.3.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" | ||||
|  | ||||
| [[package]] | ||||
| name = "openssl" | ||||
| version = "0.10.44" | ||||
| @@ -557,6 +760,29 @@ dependencies = [ | ||||
|  "windows-sys 0.42.0", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "password-hash" | ||||
| version = "0.4.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" | ||||
| dependencies = [ | ||||
|  "base64ct", | ||||
|  "rand_core", | ||||
|  "subtle", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "pbkdf2" | ||||
| version = "0.11.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" | ||||
| dependencies = [ | ||||
|  "digest", | ||||
|  "hmac", | ||||
|  "password-hash", | ||||
|  "sha2", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "percent-encoding" | ||||
| version = "2.2.0" | ||||
| @@ -581,6 +807,18 @@ version = "0.3.26" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" | ||||
|  | ||||
| [[package]] | ||||
| name = "port_scanner" | ||||
| version = "0.1.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "325a6d2ac5dee293c3b2612d4993b98aec1dff096b0a2dae70ed7d95784a05da" | ||||
|  | ||||
| [[package]] | ||||
| name = "ppv-lite86" | ||||
| version = "0.2.17" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" | ||||
|  | ||||
| [[package]] | ||||
| name = "proc-macro2" | ||||
| version = "1.0.47" | ||||
| @@ -599,6 +837,36 @@ dependencies = [ | ||||
|  "proc-macro2", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "rand" | ||||
| version = "0.8.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
|  "rand_chacha", | ||||
|  "rand_core", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "rand_chacha" | ||||
| version = "0.3.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" | ||||
| dependencies = [ | ||||
|  "ppv-lite86", | ||||
|  "rand_core", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "rand_core" | ||||
| version = "0.6.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" | ||||
| dependencies = [ | ||||
|  "getrandom", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "redox_syscall" | ||||
| version = "0.2.16" | ||||
| @@ -773,6 +1041,28 @@ dependencies = [ | ||||
|  "serde", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "sha1" | ||||
| version = "0.10.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "cpufeatures", | ||||
|  "digest", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "sha2" | ||||
| version = "0.10.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "cpufeatures", | ||||
|  "digest", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "signal-hook-registry" | ||||
| version = "1.4.0" | ||||
| @@ -807,6 +1097,12 @@ dependencies = [ | ||||
|  "winapi", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "subtle" | ||||
| version = "2.4.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" | ||||
|  | ||||
| [[package]] | ||||
| name = "syn" | ||||
| version = "1.0.105" | ||||
| @@ -841,6 +1137,33 @@ dependencies = [ | ||||
|  "winapi-util", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "time" | ||||
| version = "0.3.17" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" | ||||
| dependencies = [ | ||||
|  "itoa", | ||||
|  "serde", | ||||
|  "time-core", | ||||
|  "time-macros", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "time-core" | ||||
| version = "0.1.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" | ||||
|  | ||||
| [[package]] | ||||
| name = "time-macros" | ||||
| version = "0.2.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" | ||||
| dependencies = [ | ||||
|  "time-core", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "tinyvec" | ||||
| version = "1.6.0" | ||||
| @@ -943,6 +1266,12 @@ version = "0.2.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" | ||||
|  | ||||
| [[package]] | ||||
| name = "typenum" | ||||
| version = "1.16.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" | ||||
|  | ||||
| [[package]] | ||||
| name = "unicode-bidi" | ||||
| version = "0.3.8" | ||||
| @@ -975,12 +1304,27 @@ dependencies = [ | ||||
|  "percent-encoding", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "uuid" | ||||
| version = "1.2.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" | ||||
| dependencies = [ | ||||
|  "getrandom", | ||||
| ] | ||||
|  | ||||
| [[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.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" | ||||
|  | ||||
| [[package]] | ||||
| name = "want" | ||||
| version = "0.3.0" | ||||
| @@ -1212,3 +1556,52 @@ checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" | ||||
| dependencies = [ | ||||
|  "winapi", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "zip" | ||||
| version = "0.6.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "537ce7411d25e54e8ae21a7ce0b15840e7bfcff15b51d697ec3266cc76bdf080" | ||||
| dependencies = [ | ||||
|  "aes", | ||||
|  "byteorder", | ||||
|  "bzip2", | ||||
|  "constant_time_eq", | ||||
|  "crc32fast", | ||||
|  "crossbeam-utils", | ||||
|  "flate2", | ||||
|  "hmac", | ||||
|  "pbkdf2", | ||||
|  "sha1", | ||||
|  "time", | ||||
|  "zstd", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "zstd" | ||||
| version = "0.11.2+zstd.1.5.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" | ||||
| dependencies = [ | ||||
|  "zstd-safe", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "zstd-safe" | ||||
| version = "5.0.2+zstd.1.5.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
|  "zstd-sys", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "zstd-sys" | ||||
| version = "2.0.4+zstd.1.5.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "4fa202f2ef00074143e219d15b62ffc317d17cc33909feac471c044087cad7b0" | ||||
| dependencies = [ | ||||
|  "cc", | ||||
|  "libc", | ||||
| ] | ||||
|   | ||||
| @@ -13,6 +13,13 @@ serde_json = "1.0.89" | ||||
| reqwest = { version = "0.11.13", features = ["json"] } | ||||
| serde = { version = "1.0.151", features = ["derive"] } | ||||
| log = "0.4.17" | ||||
| zip = { version = "0.6.3", optional = true } | ||||
| mktemp = { version = "0.5.0", optional = true } | ||||
| rand = { version = "0.8.5", optional = true } | ||||
| port_scanner = {version = "0.1.5", optional = true} | ||||
|  | ||||
| [features] | ||||
| embedded-server = ["zip", "mktemp", "rand", "port_scanner"] | ||||
|  | ||||
| [dev-dependencies] | ||||
| env_logger = "0.10.0" | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								src/GrammalecteDist.zip
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/GrammalecteDist.zip
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										38
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								src/lib.rs
									
									
									
									
									
								
							| @@ -1,6 +1,11 @@ | ||||
| #[cfg(feature = "embedded-server")] | ||||
| use crate::server::EmbeddedServer; | ||||
| use std::collections::HashMap; | ||||
| use std::error::Error; | ||||
|  | ||||
| #[cfg(feature = "embedded-server")] | ||||
| mod server; | ||||
|  | ||||
| /// Spell check options | ||||
| #[derive(Hash, Debug, Eq, PartialEq)] | ||||
| pub enum GramOpt { | ||||
| @@ -255,12 +260,17 @@ pub struct SuggestResult { | ||||
|  | ||||
| pub struct GrammalecteClient { | ||||
|     base_url: String, | ||||
|  | ||||
|     #[cfg(feature = "embedded-server")] | ||||
|     _server: Option<EmbeddedServer>, | ||||
| } | ||||
|  | ||||
| impl Default for GrammalecteClient { | ||||
|     fn default() -> Self { | ||||
|         Self { | ||||
|             base_url: "http://localhost:8080".to_string(), | ||||
|             #[cfg(feature = "embedded-server")] | ||||
|             _server: None, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -270,9 +280,24 @@ impl GrammalecteClient { | ||||
|     pub fn new(base_url: &str) -> Self { | ||||
|         Self { | ||||
|             base_url: base_url.to_string(), | ||||
|             #[cfg(feature = "embedded-server")] | ||||
|             _server: None, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// Construct a new Grammalecte client, spinning up an associated | ||||
|     /// temporary web server. | ||||
|     /// | ||||
|     /// Python 3.7 or higher must is required at runtime | ||||
|     #[cfg(feature = "embedded-server")] | ||||
|     pub fn start_server() -> Result<Self, Box<dyn Error>> { | ||||
|         let server = EmbeddedServer::start()?; | ||||
|         Ok(Self { | ||||
|             base_url: server.base_url(), | ||||
|             _server: Some(server), | ||||
|         }) | ||||
|     } | ||||
|  | ||||
|     /// Run spell check on text | ||||
|     pub async fn spell_check(&self, text: &str) -> Result<CheckResult, Box<dyn Error>> { | ||||
|         self.spell_check_with_options(text, HashMap::new()).await | ||||
| @@ -327,6 +352,7 @@ impl GrammalecteClient { | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| #[cfg(feature = "embedded-server")] | ||||
| mod test { | ||||
|     use crate::{GramOpt, GrammalecteClient}; | ||||
|     use std::collections::HashMap; | ||||
| @@ -336,7 +362,11 @@ mod test { | ||||
|         let _ = env_logger::builder().is_test(true).try_init(); | ||||
|  | ||||
|         let msg = "Les ange sont inssuportables!"; | ||||
|         let res = GrammalecteClient::default().spell_check(msg).await.unwrap(); | ||||
|         let res = GrammalecteClient::start_server() | ||||
|             .unwrap() | ||||
|             .spell_check(msg) | ||||
|             .await | ||||
|             .unwrap(); | ||||
|         println!("RESULT = {:#?}", res); | ||||
|     } | ||||
|  | ||||
| @@ -347,7 +377,8 @@ mod test { | ||||
|         let msg = "Bonjour !"; | ||||
|         let mut opts = HashMap::new(); | ||||
|         opts.insert(GramOpt::EspacesInsecables, false); | ||||
|         let res = GrammalecteClient::default() | ||||
|         let res = GrammalecteClient::start_server() | ||||
|             .unwrap() | ||||
|             .spell_check_with_options(msg, opts) | ||||
|             .await | ||||
|             .unwrap(); | ||||
| @@ -359,7 +390,8 @@ mod test { | ||||
|     async fn simple_suggestion() { | ||||
|         let _ = env_logger::builder().is_test(true).try_init(); | ||||
|  | ||||
|         let res = GrammalecteClient::default() | ||||
|         let res = GrammalecteClient::start_server() | ||||
|             .unwrap() | ||||
|             .suggest("bonjou") | ||||
|             .await | ||||
|             .unwrap(); | ||||
|   | ||||
							
								
								
									
										107
									
								
								src/server.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								src/server.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| use crate::server::utils::{get_free_port, wait_for_port}; | ||||
| use mktemp::Temp; | ||||
| use std::error::Error; | ||||
| use std::io::{Cursor, Read}; | ||||
| use std::process::Child; | ||||
| use zip::ZipArchive; | ||||
|  | ||||
| pub struct EmbeddedServer { | ||||
|     _srv_dir: Temp, | ||||
|     port: u16, | ||||
|     child: Child, | ||||
| } | ||||
|  | ||||
| impl EmbeddedServer { | ||||
|     /// Start embedded Grammalecte server | ||||
|     pub fn start() -> Result<Self, Box<dyn Error>> { | ||||
|         log::info!("Will start server"); | ||||
|         // First, unpack server | ||||
|         let dest = mktemp::Temp::new_dir()?; | ||||
|         let cursor = Cursor::new(include_bytes!("GrammalecteDist.zip")); | ||||
|         let mut zip = ZipArchive::new(cursor)?; | ||||
|         for i in 0..zip.len() { | ||||
|             let mut file = zip.by_index(i)?; | ||||
|             if file.is_dir() { | ||||
|                 log::debug!("Create directory: {}", file.name()); | ||||
|                 std::fs::create_dir_all(dest.join(file.name()))?; | ||||
|             } else { | ||||
|                 log::debug!("Decompress file: {}", file.name()); | ||||
|  | ||||
|                 let mut buff = Vec::with_capacity(file.size() as usize); | ||||
|                 file.read_to_end(&mut buff)?; | ||||
|  | ||||
|                 std::fs::write(dest.join(file.name()), buff)?; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Get a free port | ||||
|         let port = get_free_port()?; | ||||
|         log::info!("Will start to listen on port {}", port); | ||||
|  | ||||
|         let server_file = dest | ||||
|             .join("grammalecte/grammalecte-server.py") | ||||
|             .to_string_lossy() | ||||
|             .to_string(); | ||||
|         log::info!("Will execute file {}", server_file); | ||||
|  | ||||
|         // Start server | ||||
|         let child = std::process::Command::new("/usr/bin/python3") | ||||
|             .arg(server_file) | ||||
|             .arg("-p") | ||||
|             .arg(port.to_string()) | ||||
|             .spawn()?; | ||||
|  | ||||
|         wait_for_port(port)?; | ||||
|  | ||||
|         Ok(Self { | ||||
|             _srv_dir: dest, | ||||
|             port, | ||||
|             child, | ||||
|         }) | ||||
|     } | ||||
|  | ||||
|     /// Get embedde instance base URL | ||||
|     pub fn base_url(&self) -> String { | ||||
|         format!("http://localhost:{}", self.port) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl Drop for EmbeddedServer { | ||||
|     fn drop(&mut self) { | ||||
|         let _ = self.child.kill(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| mod utils { | ||||
|     use std::io::ErrorKind; | ||||
|     use std::time::Duration; | ||||
|  | ||||
|     /// Get a free port | ||||
|     pub fn get_free_port() -> std::io::Result<u16> { | ||||
|         let mut port = 0; | ||||
|  | ||||
|         while !(2000..=64000).contains(&port) { | ||||
|             port = rand::random::<u16>() % 64000; | ||||
|         } | ||||
|  | ||||
|         while port_scanner::scan_port(port) { | ||||
|             port += 1; | ||||
|         } | ||||
|  | ||||
|         Ok(port) | ||||
|     } | ||||
|  | ||||
|     pub fn wait_for_port(port: u16) -> std::io::Result<()> { | ||||
|         for _ in 0..50 { | ||||
|             if port_scanner::scan_port(port) { | ||||
|                 return Ok(()); | ||||
|             } | ||||
|             std::thread::sleep(Duration::from_millis(100)); | ||||
|         } | ||||
|  | ||||
|         Err(std::io::Error::new( | ||||
|             ErrorKind::Other, | ||||
|             format!("Port {} did not open in time!", port), | ||||
|         ))? | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user