diff --git a/benches/Cargo.lock b/benches/Cargo.lock new file mode 100644 index 0000000..5bc0762 --- /dev/null +++ b/benches/Cargo.lock @@ -0,0 +1,1650 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "addr2line" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a49806b9dadc843c61e7c97e72490ad7f7220ae249012fbda9ad0609457c0543" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler32" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" + +[[package]] +name = "aho-corasick" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" +dependencies = [ + "memchr", +] + +[[package]] +name = "annotate-snippets" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78ea013094e5ea606b1c05fe35f1dd7ea1eb1ea259908d040b25bd5ec677ee5" +dependencies = [ + "yansi-term", +] + +[[package]] +name = "ansi_colours" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d0f302a81afc6a7f4350c04f0ba7cfab529cc009bca3324b3fb5764e6add8b6" +dependencies = [ + "cc", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" + +[[package]] +name = "askama" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a1fb9e41eb366cbcd267da2094be5b7e62fdbca9f82091e7503e80f885050d" +dependencies = [ + "askama_derive", + "askama_escape", + "askama_shared", +] + +[[package]] +name = "askama_derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1012c270085fa35ece6a48a569544fde85b6d9ee41074c7b706cc912a03f939" +dependencies = [ + "askama_shared", + "nom 5.1.1", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "askama_escape" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a577aeba5fec1aafb9f195d98cfcc38a78b588e4ebf9b15f62ca1c7aa33795a" + +[[package]] +name = "askama_shared" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee517f4e33c27b129928e71d8a044d54c513e72e0b72ec5c4f5f1823e9de353" +dependencies = [ + "askama_escape", + "humansize", + "num-traits", + "serde", + "toml", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" + +[[package]] +name = "backtrace" +version = "0.3.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0df2f85c8a2abbe3b7d7e748052fdd9b76a0458fdeb16ad4223f5eca78c7c130" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" + +[[package]] +name = "base64" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d1ccbaf7d9ec9537465a97bf19edc1a4e158ecb49fc16178202238c569cc42" + +[[package]] +name = "benches" +version = "0.0.1" +dependencies = [ + "askama", + "criterion", + "fomat-macros", + "horrorshow", + "markup", + "sailfish", + "sailfish-macros", + "yarte", +] + +[[package]] +name = "bincode" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" +dependencies = [ + "byteorder", + "serde", +] + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "blake2b_simd" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "bstr" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931" +dependencies = [ + "lazy_static", + "memchr", + "regex-automata", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5356f1d23ee24a1f785a56d1d1a5f0fd5b0f6a0c0fb2412ce11da71649ab78f6" + +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "cast" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "cc" +version = "1.0.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bbb73db36c1246e9034e307d0fba23f9a2e251faa47ade70c1bd252220c8311" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "chrono" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "clap" +version = "2.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" +dependencies = [ + "ansi_term 0.11.0", + "atty", + "bitflags", + "strsim 0.8.0", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clicolors-control" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90082ee5dcdd64dc4e9e0d37fbf3ee325419e39c0092191e0393df65518f741e" +dependencies = [ + "atty", + "lazy_static", + "libc", + "winapi", +] + +[[package]] +name = "console" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586208b33573b7f76ccfbe5adb076394c88deaf81b84d7213969805b0a952a7" +dependencies = [ + "clicolors-control", + "encode_unicode", + "lazy_static", + "libc", + "regex", + "terminal_size", + "termios", + "unicode-width", + "winapi", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "content_inspector" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" +dependencies = [ + "memchr", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63f696897c88b57f4ffe3c69d8e1a0613c7d0e6c4833363c8560fbde9c47b966" +dependencies = [ + "atty", + "cast", + "clap", + "criterion-plot", + "csv", + "itertools", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddeaf7989f00f2e1d871a26a110f3ed713632feac17f65f03ca938c542618b60" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-deque" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab6bffe714b6bb07e42f201352c34f51fefd355ace793f9e638ebd52d23f98d2" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg", + "cfg-if", + "lazy_static", +] + +[[package]] +name = "csv" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" +dependencies = [ + "bstr", + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + +[[package]] +name = "darling" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.9.3", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "derive_builder" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" +dependencies = [ + "darling", + "derive_builder_core", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_core" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "0.99.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2127768764f1556535c01b5326ef94bd60ff08dcfbdc544d53e69ed155610f5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "directories" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "551a778172a450d7fc12e629ca3b0428d00f6afa9a43da1b630d54604e97371c" +dependencies = [ + "cfg-if", + "dirs-sys", +] + +[[package]] +name = "dirs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" +dependencies = [ + "cfg-if", + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "either" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encoding" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" +dependencies = [ + "encoding-index-japanese", + "encoding-index-korean", + "encoding-index-simpchinese", + "encoding-index-singlebyte", + "encoding-index-tradchinese", +] + +[[package]] +name = "encoding-index-japanese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-korean" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-simpchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-singlebyte" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-tradchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding_index_tests" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" + +[[package]] +name = "error-chain" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd" +dependencies = [ + "backtrace", + "version_check 0.9.2", +] + +[[package]] +name = "flate2" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" +dependencies = [ + "cfg-if", + "crc32fast", + "libc", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fomat-macros" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe56556a8c9f9f556150eb6b390bc1a8b3715fd2ddbb4585f36b6a5672c6a833" + +[[package]] +name = "getrandom" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" + +[[package]] +name = "hermit-abi" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91780f809e750b0a89f5544be56617ff6b1227ee485bcb06ebe10cdf89bd3b71" +dependencies = [ + "libc", +] + +[[package]] +name = "horrorshow" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ce7e0a1bc8e4489896abc94e5664e811a502a151bebfe113b3214fa181d3fb" + +[[package]] +name = "humansize" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" +dependencies = [ + "autocfg", +] + +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" + +[[package]] +name = "js-sys" +version = "0.3.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce10c23ad2ea25ceca0093bd3192229da4c5b3c0f2de499c1ecac0d98d452177" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" + +[[package]] +name = "libc" +version = "0.2.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" + +[[package]] +name = "line-wrap" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] + +[[package]] +name = "log" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "markup" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6ac8a12a86863ec68a3e8ec002f85212f8731e9f7723a4cdda8b5a45b0ccb4" +dependencies = [ + "markup-proc-macro", +] + +[[package]] +name = "markup-proc-macro" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ca1e2e1d8b8c6aeb80d14be1d22c13bfb949545b0e0a2bc35e369978a8c66c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" + +[[package]] +name = "memoffset" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" +dependencies = [ + "adler32", +] + +[[package]] +name = "nom" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" +dependencies = [ + "memchr", + "version_check 0.1.5", +] + +[[package]] +name = "nom" +version = "5.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6" +dependencies = [ + "memchr", + "version_check 0.9.2", +] + +[[package]] +name = "num-integer" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cbca9424c482ee628fa549d9c812e2cd22f1180b9222c9200fdfa6eb31aecb2" + +[[package]] +name = "onig" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd91ccd8a02fce2f7e8a86655aec67bc6c171e6f8e704118a0e8c4b866a05a8a" +dependencies = [ + "bitflags", + "lazy_static", + "libc", + "onig_sys", +] + +[[package]] +name = "onig_sys" +version = "69.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3814583fad89f3c60ae0701d80e87e1fd3028741723deda72d0d4a0ecf0cb0db" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "oorandom" +version = "11.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94af325bc33c7f60191be4e2c984d48aaa21e2854f473b85398344b60c9b6358" + +[[package]] +name = "pkg-config" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" + +[[package]] +name = "plist" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b336d94e8e4ce29bf15bba393164629764744c567e8ad306cc1fdd0119967fd" +dependencies = [ + "base64 0.12.1", + "chrono", + "indexmap", + "line-wrap", + "serde", + "xml-rs", +] + +[[package]] +name = "plotters" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d1685fbe7beba33de0330629da9d955ac75bd54f33d7b79f9a895590124f6bb" +dependencies = [ + "js-sys", + "num-traits", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" + +[[package]] +name = "prettyprint" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9764c1ec675e49ff70c4f76f0df91875d57220c4e7c8587d659684e91dd0ac" +dependencies = [ + "ansi_colours", + "ansi_term 0.12.1", + "atty", + "clap", + "console", + "content_inspector", + "derive_builder", + "directories", + "encoding", + "error-chain", + "lazy_static", + "shell-words", + "syntect", +] + +[[package]] +name = "proc-macro2" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "proc-macro2-impersonated" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32df793782c132f437089d84b487d617a0baac886fa8519751dca07db9266e0" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quote-impersonated" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e3e450e6f50c99055b77f01eb206d8accbb7a1d14c2c7be2b0a829286296dc9" +dependencies = [ + "proc-macro2-impersonated", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" +dependencies = [ + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" +dependencies = [ + "crossbeam-deque", + "crossbeam-queue", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" + +[[package]] +name = "redox_users" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" +dependencies = [ + "getrandom", + "redox_syscall", + "rust-argon2", +] + +[[package]] +name = "regex" +version = "1.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-automata" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" +dependencies = [ + "byteorder", +] + +[[package]] +name = "regex-syntax" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" + +[[package]] +name = "remove_dir_all" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" +dependencies = [ + "winapi", +] + +[[package]] +name = "rust-argon2" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" +dependencies = [ + "base64 0.11.0", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + +[[package]] +name = "sailfish" +version = "0.0.1" +dependencies = [ + "itoa", + "ryu", +] + +[[package]] +name = "sailfish-compiler" +version = "0.0.1" +dependencies = [ + "memchr", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sailfish-macros" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "sailfish-compiler", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9124df5b40cbd380080b2cc6ab894c040a3070d995f5c9dc77e18c34a8ae37d" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2c3ac8e6ca1e9c80b8be1023940162bf81ae3cffbb1809474152f2ce1eb250" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "shell-words" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39acde55a154c4cd3ae048ac78cc21c25f3a0145e44111b523279113dce0d94a" + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strsim" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" + +[[package]] +name = "syn" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93a56fabc59dce20fe48b6c832cc249c713e7ed88fa28b0ee0a3bfcaae5fe4e2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "syn-impersonated" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c11664eb1aded8a1be30656bedb3c2ee3d6b594842c90ec635cf7b855a5d8478" +dependencies = [ + "proc-macro2-impersonated", + "quote-impersonated", + "unicode-xid", +] + +[[package]] +name = "syntect" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83b43a6ca1829ccb0c933b615c9ea83ffc8793ae240cecbd15119b13d741161d" +dependencies = [ + "bincode", + "bitflags", + "flate2", + "fnv", + "lazy_static", + "lazycell", + "onig", + "plist", + "regex-syntax", + "serde", + "serde_derive", + "serde_json", + "walkdir", +] + +[[package]] +name = "tempfile" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +dependencies = [ + "cfg-if", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "terminal_size" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8038f95fc7a6f351163f4b964af631bd26c9e828f7db085f2a84aca56f70d13b" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "termios" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0fcee7b24a25675de40d5bb4de6e41b0df07bc9856295e7e2b3a3600c400c2" +dependencies = [ + "libc", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tinytemplate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d3dc76004a03cec1c5932bca4cdc2e39aaa798e3f82363dd94f9adf6098c12f" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "toml" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" +dependencies = [ + "serde", +] + +[[package]] +name = "toolchain_find" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e458af37ead6107144c2e3bb892f605ddfad20251f12143cda8b9c9072b1ca45" +dependencies = [ + "dirs", + "lazy_static", + "regex", + "semver", + "walkdir", +] + +[[package]] +name = "unicode-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" + +[[package]] +name = "unicode-xid" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" + +[[package]] +name = "v_escape" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "660b101c07b5d0863deb9e7fb3138777e858d6d2a79f9e6049a27d1cc77c6da6" +dependencies = [ + "v_escape_derive", +] + +[[package]] +name = "v_escape_derive" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2ca2a14bc3fc5b64d188b087a7d3a927df87b152e941ccfbc66672e20c467ae" +dependencies = [ + "nom 4.2.3", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "v_eval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a419cdda656c514fbb974d5634994278be348867645cb65bf21a9b0676b9c2" +dependencies = [ + "regex", + "syn-impersonated", +] + +[[package]] +name = "v_htmlescape" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33e939c0d8cf047514fb6ba7d5aac78bc56677a6938b2ee67000b91f2e97e41" +dependencies = [ + "cfg-if", + "v_escape", +] + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" + +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" + +[[package]] +name = "walkdir" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasm-bindgen" +version = "0.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2dc4aa152834bc334f506c1a06b866416a8b6697d5c9f75b9a689c8486def0" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded84f06e0ed21499f6184df0e0cb3494727b0c5da89534e0fcc55c51d812101" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "838e423688dac18d73e31edce74ddfac468e37b1506ad163ffaf0a46f703ffe3" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3156052d8ec77142051a533cdd686cba889537b213f948cd1d20869926e68e92" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9ba19973a58daf4db6f352eda73dc0e289493cd29fb2632eb172085b6521acd" + +[[package]] +name = "web-sys" +version = "0.3.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b72fe77fd39e4bd3eaa4412fd299a0be6b3dfe9d2597e2f1c20beb968f41d17" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +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-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[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 = "xml-rs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a" + +[[package]] +name = "yansi-term" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" +dependencies = [ + "winapi", +] + +[[package]] +name = "yarte" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884cff3b02a11d026c493282e598a5c990b17fa22b91fb73aad2bfeee47f4f01" +dependencies = [ + "yarte_derive", + "yarte_helpers", +] + +[[package]] +name = "yarte_codegen" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a64e8ba00f9d77cd05b665b3515251544c5b1f4885e7e3f7ffc54ea27f52eabc" +dependencies = [ + "proc-macro2-impersonated", + "quote-impersonated", + "syn-impersonated", + "yarte_helpers", + "yarte_hir", +] + +[[package]] +name = "yarte_derive" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f11ebd841875bd9b906017844640aaac1571a4a188b3f7577efd6c02616da1" +dependencies = [ + "prettyprint", + "proc-macro2-impersonated", + "quote-impersonated", + "syn-impersonated", + "tempfile", + "toolchain_find", + "yarte_codegen", + "yarte_helpers", + "yarte_hir", + "yarte_parser", +] + +[[package]] +name = "yarte_helpers" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771250e834a31e39a6e34e48e3fd9032542d211cb3f194f9a71b603fb841a793" +dependencies = [ + "serde", + "toml", + "v_htmlescape", +] + +[[package]] +name = "yarte_hir" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86bad7da0c2ae56374390919fa1d7abaa067f6325a3e27865ae8598bfc24057" +dependencies = [ + "derive_more", + "proc-macro2-impersonated", + "quote-impersonated", + "syn-impersonated", + "v_eval", + "v_htmlescape", + "yarte_helpers", + "yarte_parser", +] + +[[package]] +name = "yarte_parser" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f855c622d29c8a8af4f4b7a3f81e83ac0be6e6074977a017c3945db05fba311" +dependencies = [ + "annotate-snippets", + "derive_more", + "proc-macro2-impersonated", + "quote-impersonated", + "syn-impersonated", + "unicode-xid", + "yarte_helpers", +] diff --git a/benches/Cargo.toml b/benches/Cargo.toml new file mode 100644 index 0000000..3b380de --- /dev/null +++ b/benches/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "benches" +version = "0.0.1" +authors = ["Ryohei Machida "] +edition = "2018" +publish = false + +[dependencies] +horrorshow = "0.8.3" +markup = "0.4.1" +askama = "0.9.0" +criterion = "0.3.2" +yarte = "0.8.3" +sailfish = { path = "../sailfish" } +sailfish-macros = { path = "../sailfish-macros" } +fomat-macros = "0.3.1" + +[[bench]] +name = "all" +harness = false diff --git a/benches/README.md b/benches/README.md new file mode 100644 index 0000000..43dcde0 --- /dev/null +++ b/benches/README.md @@ -0,0 +1,35 @@ +# Rust template engine benchmarks + +Performance comparison of template engines for Rust based on [criterion](https://github.com/bheisler/criterion.rs) crate + +## crates + +- [askama](https://github.com/djc/askama): Type-safe, compiled Jinja-like templates for Rust +- [fomat](https://github.com/krdln/fomat-macros): Alternative syntax for printing macros in Rust +- [horrorshow](https://github.com/Stebalien/horrorshow-rs): A macro-based html builder for rust +- [markup](https://github.com/utkarshkukreti/markup.rs): A blazing fast, type-safe template engine for Rust. +- [std::write!](https://doc.rust-lang.org/std/macro.write.html): the std library `write!` macro +- [yarte](https://github.com/botika/yarte): Yet Another Rust Template Engine, is the fastest template engine +- [sailfish](https://github.com/Kogia-sima/sailfish): Simple, small, and extremely fast template engine for Rust + +## Running the benchmarks + +```console +$ cargo bench +``` + +## Environment + +- OS: Ubuntu 20.04 LTS +- CPU Model Name: Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz +- BogoMIPS: 3600.00 + +## Results + +- Big table + +![Big table](./bigtable.png) + +- Teams + +![Teams](./teams.png) diff --git a/benches/benches/all.rs b/benches/benches/all.rs new file mode 100644 index 0000000..dbf421f --- /dev/null +++ b/benches/benches/all.rs @@ -0,0 +1,31 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use benches::{ + askama_bench, fomat, horrorshow_bench, markup_bench, sailfish, std_write, yarte_bench +}; + +fn big_table(c: &mut Criterion) { + let mut g = c.benchmark_group("Big table"); + g.bench_function("Askama", |b| askama_bench::big_table(b, &100)); + g.bench_function("fomat", |b| fomat::big_table(b, &100)); + g.bench_function("Horrorshow", |b| horrorshow_bench::big_table(b, &100)); + g.bench_function("Markup", |b| markup_bench::big_table(b, &100)); + g.bench_function("Yarte", |b| yarte_bench::big_table(b, &100)); + g.bench_function("write", |b| std_write::big_table(b, &100)); + g.bench_function("sailfish", |b| sailfish::big_table(b, &100)); + g.finish(); +} + +fn teams(c: &mut Criterion) { + let mut g = c.benchmark_group("Teams"); + g.bench_function("Askama", |b| askama_bench::teams(b, &0)); + g.bench_function("fomat", |b| fomat::teams(b, &0)); + g.bench_function("Horrorshow", |b| horrorshow_bench::teams(b, &0)); + g.bench_function("Markup", |b| markup_bench::teams(b, &0)); + g.bench_function("Yarte", |b| yarte_bench::teams(b)); + g.bench_function("write", |b| std_write::teams(b, &0)); + g.bench_function("sailfish", |b| sailfish::teams(b)); + g.finish(); +} + +criterion_group!(benches, big_table, teams); +criterion_main!(benches); diff --git a/benches/bigtable.png b/benches/bigtable.png new file mode 100644 index 0000000..59ffdb6 Binary files /dev/null and b/benches/bigtable.png differ diff --git a/benches/src/askama_bench.rs b/benches/src/askama_bench.rs new file mode 100644 index 0000000..fd51f81 --- /dev/null +++ b/benches/src/askama_bench.rs @@ -0,0 +1,58 @@ +use askama::Template; +use criterion; + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + let ctx = BigTable { table }; + b.iter(|| ctx.render().unwrap()); +} + +#[derive(Template)] +#[template(path = "big-table.html")] +struct BigTable { + table: Vec>, +} + +pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { + let teams = Teams { + year: 2015, + teams: vec![ + Team { + name: "Jiangsu".into(), + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ], + }; + b.iter(|| teams.render().unwrap()); +} + +#[derive(Template)] +#[template(path = "teams.html")] +struct Teams { + year: u16, + teams: Vec, +} + +struct Team { + name: String, + score: u8, +} diff --git a/benches/src/build.rs b/benches/src/build.rs new file mode 100644 index 0000000..ade7fb1 --- /dev/null +++ b/benches/src/build.rs @@ -0,0 +1,11 @@ +use ructe::Ructe; +use std::env; +use std::path::PathBuf; + +fn main() { + let in_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()).join("templates_ructe"); + Ructe::from_env() + .unwrap() + .compile_templates(&in_dir) + .expect("compile templates"); +} diff --git a/benches/src/fomat.rs b/benches/src/fomat.rs new file mode 100644 index 0000000..c1c72df --- /dev/null +++ b/benches/src/fomat.rs @@ -0,0 +1,76 @@ +use criterion; +use fomat_macros::fomat; + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + b.iter(|| { + fomat!( + "\n" + for r1 in &table { + "\n" + for r2 in r1 { "" } + "\n\n" + } + "
"(r2)"
" + ) + }); +} + +pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { + let teams = Teams { + year: 2015, + teams: vec![ + Team { + name: "Jiangsu".into(), + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ], + }; + b.iter(|| { + fomat!( +" + + "(teams.year)" + + +

CSL "(teams.year)"

+
    " + for (i,team) in (&teams).teams.iter().enumerate() { + "
  • \n" + " "(team.name)": "(team.score)"\n" + "
  • \n" + } +"\n
+ +") + }); +} + +struct Teams { + year: u16, + teams: Vec, +} + +struct Team { + name: String, + score: u8, +} diff --git a/benches/src/horrorshow_bench.rs b/benches/src/horrorshow_bench.rs new file mode 100644 index 0000000..bfb66b8 --- /dev/null +++ b/benches/src/horrorshow_bench.rs @@ -0,0 +1,92 @@ +use criterion; +use horrorshow::html; +use horrorshow::prelude::*; +use horrorshow::Error; + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + b.iter(|| big_table_render(&table).unwrap()); +} + +fn big_table_render(table: &Vec>) -> Result { + let page = html! { + table { + @ for row in table { + tr { + @ for col in row { + td { : col } + } + } + } + } + }; + page.into_string() +} + +pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { + let teams = Teams { + year: 2015, + teams: vec![ + Team { + name: "Jiangsu".into(), + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ], + }; + + b.iter(|| teams_render(&teams).unwrap()); +} + +fn teams_render(teams: &Teams) -> Result { + let page = html! { + html { + head { + title { : teams.year } + } + body { + h1 { : Raw("CSL "); + : teams.year + } + ul { + @ for (idx, team) in teams.teams.iter().enumerate() { + li(class? = if idx == 0 { Some(Raw("champion")) } else { None }) { + b { : &team.name } + : Raw(": "); + : team.score + } + } + } + } + } + }; + page.into_string() +} + +struct Teams { + year: u16, + teams: Vec, +} + +struct Team { + name: String, + score: u8, +} diff --git a/benches/src/lib.rs b/benches/src/lib.rs new file mode 100644 index 0000000..68b1e10 --- /dev/null +++ b/benches/src/lib.rs @@ -0,0 +1,7 @@ +pub mod askama_bench; +pub mod fomat; +pub mod horrorshow_bench; +pub mod markup_bench; +pub mod sailfish; +pub mod std_write; +pub mod yarte_bench; diff --git a/benches/src/markup_bench.rs b/benches/src/markup_bench.rs new file mode 100644 index 0000000..a9c9c23 --- /dev/null +++ b/benches/src/markup_bench.rs @@ -0,0 +1,83 @@ +use criterion; +use markup::define; + +// TODO: Switch to `markup::define!` when upgrading to Rust 2018. +define! { + BigTable<'a>(table: &'a [Vec]) { + table { + @for r1 in table.iter() { + tr { + @for r2 in r1.iter() { + td { {*r2} } + } + } + } + } + } +} + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + b.iter(|| BigTable { table: &table }.to_string()); +} + +pub struct Team { + name: String, + score: u8, +} + +define! { + Teams<'a>(year: u32, teams: &'a [Team]) { + html { + head { + title { {year} } + } + body { + h1 { "CSL " {year} } + ul { + @for (index, team) in teams.iter().enumerate() { + li.{if index == 0 { Some("champion") } else { None }} { + b { {team.name} } ": " {team.score} + } + } + } + } + } + } +} + +pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { + let year = 2015; + let teams = vec![ + Team { + name: "Jiangsu".into(), + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ]; + b.iter(|| { + Teams { + year, + teams: &teams, + } + .to_string() + }); +} diff --git a/benches/src/sailfish.rs b/benches/src/sailfish.rs new file mode 100644 index 0000000..4d00a27 --- /dev/null +++ b/benches/src/sailfish.rs @@ -0,0 +1,72 @@ +use sailfish::TemplateOnce; +use sailfish_macros::TemplateOnce; + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + b.iter(|| { + let ctx = BigTable { table: &table }; + ctx.render_once().unwrap() + }); +} + +pub fn teams(b: &mut criterion::Bencher<'_>) { + let teams = Teams { + year: 2015, + teams: vec![ + Team { + name: "Jiangsu".into(), + + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ], + }; + b.iter(|| { + let teams = TeamsTemplate { + year: teams.year, + teams: &teams.teams + }; + teams.render_once().unwrap() + }); +} + +#[derive(TemplateOnce)] +#[template(path = "big-table.stpl")] +struct BigTable<'a> { + table: &'a [Vec], +} + +#[derive(TemplateOnce)] +#[template(path = "teams.stpl")] +struct TeamsTemplate<'a> { + year: u16, + teams: &'a [Team], +} + +struct Teams { + year: u16, + teams: Vec, +} + +struct Team { + name: String, + score: u8, +} diff --git a/benches/src/std_write.rs b/benches/src/std_write.rs new file mode 100644 index 0000000..d147ebd --- /dev/null +++ b/benches/src/std_write.rs @@ -0,0 +1,94 @@ +use std::io::Write; + +use criterion; + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + b.iter(|| { + let mut output = Vec::new(); + write!(&mut output, "").unwrap(); + for r1 in &table { + write!(&mut output, "\n").unwrap(); + for r2 in r1 { + write!(&mut output, "", col = r2).unwrap(); + } + write!(&mut output, "\n").unwrap(); + } + write!(&mut output, "
{col}
").unwrap(); + }); +} + +pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { + let teams = Teams { + year: 2015, + teams: vec![ + Team { + name: "Jiangsu".into(), + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ], + }; + b.iter(|| { + let mut output = Vec::new(); + write!( + &mut output, + " + + {year} + + +

CSL {year}

+
    ", + year = teams.year + ) + .unwrap(); + for (i, team) in (&teams).teams.iter().enumerate() { + let champion = if i != 0 { "" } else { "champion" }; + write!( + &mut output, + "
  • + {name}: {score}", + champion = champion, + name = team.name, + score = team.score + ) + .unwrap(); + } + write!( + &mut output, + "
+ + " + ) + .unwrap(); + }); +} + +struct Teams { + year: u16, + teams: Vec, +} + +struct Team { + name: String, + score: u8, +} diff --git a/benches/src/yarte_bench.rs b/benches/src/yarte_bench.rs new file mode 100644 index 0000000..6678268 --- /dev/null +++ b/benches/src/yarte_bench.rs @@ -0,0 +1,58 @@ +use yarte::Template; + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + let ctx = BigTable { table }; + b.iter(|| ctx.call().unwrap()); +} + +#[derive(Template)] +#[template(path = "big-table.hbs")] +struct BigTable { + table: Vec>, +} + +pub fn teams(b: &mut criterion::Bencher<'_>) { + let teams = Teams { + year: 2015, + teams: vec![ + Team { + name: "Jiangsu".into(), + + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ], + }; + b.iter(|| teams.call().unwrap()); +} + +#[derive(Template)] +#[template(path = "teams.hbs")] +struct Teams { + year: u16, + teams: Vec, +} + +struct Team { + name: String, + score: u8, +} diff --git a/benches/teams.png b/benches/teams.png new file mode 100644 index 0000000..604dcde Binary files /dev/null and b/benches/teams.png differ diff --git a/benches/templates/big-table.hbs b/benches/templates/big-table.hbs new file mode 100644 index 0000000..6255b49 --- /dev/null +++ b/benches/templates/big-table.hbs @@ -0,0 +1 @@ +{{#each table}}{{#each this}}{{/each}}{{/each}}
{{ this }}
diff --git a/benches/templates/big-table.html b/benches/templates/big-table.html new file mode 100644 index 0000000..2fbfce4 --- /dev/null +++ b/benches/templates/big-table.html @@ -0,0 +1,5 @@ + +{% for row in table %} +{% for col in row %}{% endfor %} +{% endfor %} +
{{ col|escape }}
diff --git a/benches/templates/big-table.stpl b/benches/templates/big-table.stpl new file mode 100644 index 0000000..52c442f --- /dev/null +++ b/benches/templates/big-table.stpl @@ -0,0 +1,3 @@ + + <% for row in table { %><% for col in row { %><% } %><% } %> +
<%= *col %>
diff --git a/benches/templates/teams.hbs b/benches/templates/teams.hbs new file mode 100644 index 0000000..5af2727 --- /dev/null +++ b/benches/templates/teams.hbs @@ -0,0 +1 @@ +{{ year }}

CSL {{ year }}

    {{#each teams }}
  • {{ name }}: {{ score }}
  • {{/each}}
diff --git a/benches/templates/teams.html b/benches/templates/teams.html new file mode 100644 index 0000000..cbeaec9 --- /dev/null +++ b/benches/templates/teams.html @@ -0,0 +1,15 @@ + + + {{ year }} + + +

CSL {{ year }}

+
    + {% for team in teams %} +
  • + {{ team.name }}: {{ team.score }} +
  • + {% endfor %} +
+ + diff --git a/benches/templates/teams.stpl b/benches/templates/teams.stpl new file mode 100644 index 0000000..e766b2d --- /dev/null +++ b/benches/templates/teams.stpl @@ -0,0 +1,11 @@ + + + <%= year %> + + +

CSL <%= year %>

+
    + <% for (i, team) in teams.iter().enumerate() { %>
  • <%- team.name %>: <%= team.score %>
  • <% } %> +
+ +