├── .github └── workflows │ ├── cd.yml │ └── ci.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── Makefile ├── README.md ├── slides.md └── src ├── error.rs ├── html.rs ├── main.rs ├── script.js ├── server.rs └── style.css /.github/workflows/cd.yml: -------------------------------------------------------------------------------- 1 | name: Continuous Deployment 2 | on: 3 | push: 4 | tags: 5 | - "v*.*.*" 6 | jobs: 7 | github_release: 8 | name: Creating github release for ${{ matrix.os }} 9 | runs-on: ${{ matrix.os }} 10 | strategy: 11 | matrix: 12 | os: [ubuntu-latest] 13 | include: 14 | # - os: macos-latest 15 | # target: x86_64-apple-darwin 16 | # binary_postfix: "" 17 | - os: ubuntu-latest 18 | target: x86_64-unknown-linux-gnu 19 | binary_postfix: "" 20 | # - os: windows-latest 21 | # target: x86_64-pc-windows-msvc 22 | # binary_postfix: ".exe" 23 | steps: 24 | - name: Installing Rust toolchain 25 | uses: actions-rs/toolchain@v1 26 | with: 27 | toolchain: stable 28 | override: true 29 | - name: Checking out sources 30 | uses: actions/checkout@v1 31 | - name: Running cargo build 32 | uses: actions-rs/cargo@v1 33 | with: 34 | command: build 35 | toolchain: stable 36 | args: --release --target ${{ matrix.target }} 37 | - name: Packaging final binary 38 | shell: bash 39 | run: | 40 | cd target/${{ matrix.target }}/release 41 | 42 | strip deck${{ matrix.binary_postfix }} 43 | tar czvf deck-${{ matrix.target }}.tar.gz deck${{ matrix.binary_postfix }} 44 | 45 | if [[ ${{ runner.os }} == 'Windows' ]]; then 46 | certutil -hashfile deck-${{ matrix.target }}.tar.gz sha256 | grep -E [A-Fa-f0-9]{64} > deck-${{ matrix.target }}.sha256 47 | else 48 | shasum -a 256 deck-${{ matrix.target }}.tar.gz > deck-${{ matrix.target }}.sha256 49 | fi 50 | - name: Releasing assets 51 | uses: softprops/action-gh-release@v1 52 | with: 53 | files: | 54 | target/${{ matrix.target }}/release/deck-${{ matrix.target }}.tar.gz 55 | target/${{ matrix.target }}/release/deck-${{ matrix.target }}.sha256 56 | env: 57 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 58 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Continuous Integration 2 | on: [push, pull_request] 3 | jobs: 4 | ci: 5 | name: ${{ matrix.os }} CI 6 | runs-on: ${{ matrix.os }} 7 | strategy: 8 | matrix: 9 | os: [ubuntu-latest] 10 | steps: 11 | - name: "Checking out sources" 12 | uses: actions/checkout@v1 13 | - name: "Installing rust toolchain" 14 | uses: actions-rs/toolchain@v1 15 | with: 16 | profile: default 17 | toolchain: stable 18 | override: true 19 | - name: "Format" 20 | uses: actions-rs/cargo@v1 21 | with: 22 | command: fmt 23 | args: --all -- --check 24 | - name: "Check" 25 | uses: actions-rs/cargo@v1 26 | with: 27 | command: check 28 | - name: "Test" 29 | uses: actions-rs/cargo@v1 30 | with: 31 | command: test 32 | - name: "Clippy" 33 | uses: actions-rs/cargo@v1 34 | with: 35 | command: clippy 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | **/*.rs.bk 3 | **/*.log 4 | /tools/node_modules/ 5 | /slides.html 6 | /slides.pdf 7 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "adler32" 5 | version = "1.0.4" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | 8 | [[package]] 9 | name = "aho-corasick" 10 | version = "0.7.10" 11 | source = "registry+https://github.com/rust-lang/crates.io-index" 12 | dependencies = [ 13 | "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 14 | ] 15 | 16 | [[package]] 17 | name = "ansi_term" 18 | version = "0.11.0" 19 | source = "registry+https://github.com/rust-lang/crates.io-index" 20 | dependencies = [ 21 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 22 | ] 23 | 24 | [[package]] 25 | name = "atty" 26 | version = "0.2.14" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | dependencies = [ 29 | "hermit-abi 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 30 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 31 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 32 | ] 33 | 34 | [[package]] 35 | name = "autocfg" 36 | version = "0.1.7" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | 39 | [[package]] 40 | name = "autocfg" 41 | version = "1.0.0" 42 | source = "registry+https://github.com/rust-lang/crates.io-index" 43 | 44 | [[package]] 45 | name = "base64" 46 | version = "0.10.1" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | dependencies = [ 49 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 50 | ] 51 | 52 | [[package]] 53 | name = "base64" 54 | version = "0.11.0" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | 57 | [[package]] 58 | name = "base64" 59 | version = "0.12.0" 60 | source = "registry+https://github.com/rust-lang/crates.io-index" 61 | 62 | [[package]] 63 | name = "bincode" 64 | version = "1.2.1" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | dependencies = [ 67 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 68 | "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", 69 | ] 70 | 71 | [[package]] 72 | name = "bit-set" 73 | version = "0.5.1" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | dependencies = [ 76 | "bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 77 | ] 78 | 79 | [[package]] 80 | name = "bit-vec" 81 | version = "0.5.1" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | 84 | [[package]] 85 | name = "bitflags" 86 | version = "1.2.1" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | 89 | [[package]] 90 | name = "block-buffer" 91 | version = "0.7.3" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | dependencies = [ 94 | "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 95 | "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 96 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 97 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 98 | ] 99 | 100 | [[package]] 101 | name = "block-padding" 102 | version = "0.1.5" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | dependencies = [ 105 | "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 106 | ] 107 | 108 | [[package]] 109 | name = "buf_redux" 110 | version = "0.8.4" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | dependencies = [ 113 | "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 114 | "safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 115 | ] 116 | 117 | [[package]] 118 | name = "byte-tools" 119 | version = "0.3.1" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | 122 | [[package]] 123 | name = "byteorder" 124 | version = "1.3.4" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | 127 | [[package]] 128 | name = "bytes" 129 | version = "0.5.4" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | 132 | [[package]] 133 | name = "cfg-if" 134 | version = "0.1.10" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | 137 | [[package]] 138 | name = "clap" 139 | version = "2.33.0" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | dependencies = [ 142 | "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 143 | "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", 144 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 145 | "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 146 | "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 147 | "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 148 | "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 149 | ] 150 | 151 | [[package]] 152 | name = "cloudabi" 153 | version = "0.0.3" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | dependencies = [ 156 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 157 | ] 158 | 159 | [[package]] 160 | name = "crc32fast" 161 | version = "1.2.0" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | dependencies = [ 164 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 165 | ] 166 | 167 | [[package]] 168 | name = "deck" 169 | version = "0.3.0" 170 | dependencies = [ 171 | "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 172 | "inotify 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 173 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 174 | "minifier 0.0.36 (registry+https://github.com/rust-lang/crates.io-index)", 175 | "pretty_env_logger 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 176 | "pulldown-cmark 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 177 | "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", 178 | "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", 179 | "structopt 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", 180 | "syntect 4.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 181 | "tokio 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", 182 | "warp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 183 | ] 184 | 185 | [[package]] 186 | name = "digest" 187 | version = "0.8.1" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | dependencies = [ 190 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 191 | ] 192 | 193 | [[package]] 194 | name = "dtoa" 195 | version = "0.4.5" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | 198 | [[package]] 199 | name = "env_logger" 200 | version = "0.7.1" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | dependencies = [ 203 | "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", 204 | "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 205 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 206 | "regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 207 | "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 208 | ] 209 | 210 | [[package]] 211 | name = "fake-simd" 212 | version = "0.1.2" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | 215 | [[package]] 216 | name = "fancy-regex" 217 | version = "0.3.3" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | dependencies = [ 220 | "bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 221 | "regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 222 | ] 223 | 224 | [[package]] 225 | name = "flate2" 226 | version = "1.0.14" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | dependencies = [ 229 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 230 | "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 231 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 232 | "miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 233 | ] 234 | 235 | [[package]] 236 | name = "fnv" 237 | version = "1.0.6" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | 240 | [[package]] 241 | name = "fuchsia-cprng" 242 | version = "0.1.1" 243 | source = "registry+https://github.com/rust-lang/crates.io-index" 244 | 245 | [[package]] 246 | name = "fuchsia-zircon" 247 | version = "0.3.3" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | dependencies = [ 250 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 251 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 252 | ] 253 | 254 | [[package]] 255 | name = "fuchsia-zircon-sys" 256 | version = "0.3.3" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | 259 | [[package]] 260 | name = "futures" 261 | version = "0.3.4" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | dependencies = [ 264 | "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 265 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 266 | "futures-executor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 267 | "futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 268 | "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 269 | "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 270 | "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 271 | ] 272 | 273 | [[package]] 274 | name = "futures-channel" 275 | version = "0.3.4" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | dependencies = [ 278 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 279 | "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 280 | ] 281 | 282 | [[package]] 283 | name = "futures-core" 284 | version = "0.3.4" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | 287 | [[package]] 288 | name = "futures-executor" 289 | version = "0.3.4" 290 | source = "registry+https://github.com/rust-lang/crates.io-index" 291 | dependencies = [ 292 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 293 | "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 294 | "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 295 | ] 296 | 297 | [[package]] 298 | name = "futures-io" 299 | version = "0.3.4" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | 302 | [[package]] 303 | name = "futures-macro" 304 | version = "0.3.4" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | dependencies = [ 307 | "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", 308 | "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", 309 | "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 310 | "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", 311 | ] 312 | 313 | [[package]] 314 | name = "futures-sink" 315 | version = "0.3.4" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | 318 | [[package]] 319 | name = "futures-task" 320 | version = "0.3.4" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | 323 | [[package]] 324 | name = "futures-util" 325 | version = "0.3.4" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | dependencies = [ 328 | "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 329 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 330 | "futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 331 | "futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 332 | "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 333 | "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 334 | "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 335 | "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", 336 | "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", 337 | "proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 338 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 339 | ] 340 | 341 | [[package]] 342 | name = "generic-array" 343 | version = "0.12.3" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | dependencies = [ 346 | "typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 347 | ] 348 | 349 | [[package]] 350 | name = "getopts" 351 | version = "0.2.21" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | dependencies = [ 354 | "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 355 | ] 356 | 357 | [[package]] 358 | name = "getrandom" 359 | version = "0.1.14" 360 | source = "registry+https://github.com/rust-lang/crates.io-index" 361 | dependencies = [ 362 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 363 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 364 | "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", 365 | ] 366 | 367 | [[package]] 368 | name = "h2" 369 | version = "0.2.4" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | dependencies = [ 372 | "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 373 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 374 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 375 | "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 376 | "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 377 | "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 378 | "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 379 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 380 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 381 | "tokio 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", 382 | "tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 383 | ] 384 | 385 | [[package]] 386 | name = "headers" 387 | version = "0.3.2" 388 | source = "registry+https://github.com/rust-lang/crates.io-index" 389 | dependencies = [ 390 | "base64 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 391 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 392 | "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 393 | "headers-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 394 | "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 395 | "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", 396 | "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 397 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 398 | ] 399 | 400 | [[package]] 401 | name = "headers-core" 402 | version = "0.2.0" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | dependencies = [ 405 | "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 406 | ] 407 | 408 | [[package]] 409 | name = "heck" 410 | version = "0.3.1" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | dependencies = [ 413 | "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 414 | ] 415 | 416 | [[package]] 417 | name = "hermit-abi" 418 | version = "0.1.11" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | dependencies = [ 421 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 422 | ] 423 | 424 | [[package]] 425 | name = "http" 426 | version = "0.2.1" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | dependencies = [ 429 | "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 430 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 431 | "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 432 | ] 433 | 434 | [[package]] 435 | name = "http-body" 436 | version = "0.3.1" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | dependencies = [ 439 | "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 440 | "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 441 | ] 442 | 443 | [[package]] 444 | name = "httparse" 445 | version = "1.3.4" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | 448 | [[package]] 449 | name = "humantime" 450 | version = "1.3.0" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | dependencies = [ 453 | "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 454 | ] 455 | 456 | [[package]] 457 | name = "humantime" 458 | version = "2.0.0" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | 461 | [[package]] 462 | name = "hyper" 463 | version = "0.13.4" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | dependencies = [ 466 | "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 467 | "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 468 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 469 | "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 470 | "h2 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", 471 | "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 472 | "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 473 | "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 474 | "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 475 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 476 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 477 | "pin-project 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", 478 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 479 | "tokio 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", 480 | "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 481 | "want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 482 | ] 483 | 484 | [[package]] 485 | name = "idna" 486 | version = "0.2.0" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | dependencies = [ 489 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 490 | "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 491 | "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 492 | ] 493 | 494 | [[package]] 495 | name = "indexmap" 496 | version = "1.3.2" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | dependencies = [ 499 | "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 500 | ] 501 | 502 | [[package]] 503 | name = "inotify" 504 | version = "0.8.2" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | dependencies = [ 507 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 508 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 509 | "inotify-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 510 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 511 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 512 | "tokio 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", 513 | ] 514 | 515 | [[package]] 516 | name = "inotify-sys" 517 | version = "0.1.3" 518 | source = "registry+https://github.com/rust-lang/crates.io-index" 519 | dependencies = [ 520 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 521 | ] 522 | 523 | [[package]] 524 | name = "input_buffer" 525 | version = "0.3.1" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | dependencies = [ 528 | "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 529 | ] 530 | 531 | [[package]] 532 | name = "iovec" 533 | version = "0.1.4" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | dependencies = [ 536 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 537 | ] 538 | 539 | [[package]] 540 | name = "itoa" 541 | version = "0.4.5" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | 544 | [[package]] 545 | name = "kernel32-sys" 546 | version = "0.2.2" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | dependencies = [ 549 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 550 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 551 | ] 552 | 553 | [[package]] 554 | name = "lazy_static" 555 | version = "1.4.0" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | 558 | [[package]] 559 | name = "lazycell" 560 | version = "1.2.1" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | 563 | [[package]] 564 | name = "libc" 565 | version = "0.2.69" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | 568 | [[package]] 569 | name = "line-wrap" 570 | version = "0.1.1" 571 | source = "registry+https://github.com/rust-lang/crates.io-index" 572 | dependencies = [ 573 | "safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 574 | ] 575 | 576 | [[package]] 577 | name = "log" 578 | version = "0.3.9" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | dependencies = [ 581 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 582 | ] 583 | 584 | [[package]] 585 | name = "log" 586 | version = "0.4.8" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | dependencies = [ 589 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 590 | ] 591 | 592 | [[package]] 593 | name = "macro-utils" 594 | version = "0.1.3" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | 597 | [[package]] 598 | name = "matches" 599 | version = "0.1.8" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | 602 | [[package]] 603 | name = "memchr" 604 | version = "2.3.3" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | 607 | [[package]] 608 | name = "mime" 609 | version = "0.2.6" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | dependencies = [ 612 | "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 613 | ] 614 | 615 | [[package]] 616 | name = "mime" 617 | version = "0.3.16" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | 620 | [[package]] 621 | name = "mime_guess" 622 | version = "1.8.8" 623 | source = "registry+https://github.com/rust-lang/crates.io-index" 624 | dependencies = [ 625 | "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 626 | "phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 627 | "phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 628 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 629 | ] 630 | 631 | [[package]] 632 | name = "mime_guess" 633 | version = "2.0.3" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | dependencies = [ 636 | "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", 637 | "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 638 | ] 639 | 640 | [[package]] 641 | name = "minifier" 642 | version = "0.0.36" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | dependencies = [ 645 | "macro-utils 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 646 | ] 647 | 648 | [[package]] 649 | name = "miniz_oxide" 650 | version = "0.3.6" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | dependencies = [ 653 | "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 654 | ] 655 | 656 | [[package]] 657 | name = "mio" 658 | version = "0.6.21" 659 | source = "registry+https://github.com/rust-lang/crates.io-index" 660 | dependencies = [ 661 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 662 | "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 663 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 664 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 665 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 666 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 667 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 668 | "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 669 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 670 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 671 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 672 | ] 673 | 674 | [[package]] 675 | name = "miow" 676 | version = "0.2.1" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | dependencies = [ 679 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 680 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 681 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 682 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 683 | ] 684 | 685 | [[package]] 686 | name = "multipart" 687 | version = "0.16.1" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | dependencies = [ 690 | "buf_redux 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", 691 | "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 692 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 693 | "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 694 | "mime_guess 1.8.8 (registry+https://github.com/rust-lang/crates.io-index)", 695 | "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 696 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 697 | "safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 698 | "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 699 | "twoway 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 700 | ] 701 | 702 | [[package]] 703 | name = "net2" 704 | version = "0.2.33" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | dependencies = [ 707 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 708 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 709 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 710 | ] 711 | 712 | [[package]] 713 | name = "opaque-debug" 714 | version = "0.2.3" 715 | source = "registry+https://github.com/rust-lang/crates.io-index" 716 | 717 | [[package]] 718 | name = "percent-encoding" 719 | version = "2.1.0" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | 722 | [[package]] 723 | name = "phf" 724 | version = "0.7.24" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | dependencies = [ 727 | "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 728 | ] 729 | 730 | [[package]] 731 | name = "phf_codegen" 732 | version = "0.7.24" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | dependencies = [ 735 | "phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 736 | "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 737 | ] 738 | 739 | [[package]] 740 | name = "phf_generator" 741 | version = "0.7.24" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | dependencies = [ 744 | "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", 745 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 746 | ] 747 | 748 | [[package]] 749 | name = "phf_shared" 750 | version = "0.7.24" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | dependencies = [ 753 | "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 754 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 755 | ] 756 | 757 | [[package]] 758 | name = "pin-project" 759 | version = "0.4.9" 760 | source = "registry+https://github.com/rust-lang/crates.io-index" 761 | dependencies = [ 762 | "pin-project-internal 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", 763 | ] 764 | 765 | [[package]] 766 | name = "pin-project-internal" 767 | version = "0.4.9" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | dependencies = [ 770 | "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", 771 | "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 772 | "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", 773 | ] 774 | 775 | [[package]] 776 | name = "pin-project-lite" 777 | version = "0.1.4" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | 780 | [[package]] 781 | name = "pin-utils" 782 | version = "0.1.0-alpha.4" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | 785 | [[package]] 786 | name = "plist" 787 | version = "0.5.4" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | dependencies = [ 790 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 791 | "humantime 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 792 | "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 793 | "line-wrap 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 794 | "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", 795 | "xml-rs 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 796 | ] 797 | 798 | [[package]] 799 | name = "ppv-lite86" 800 | version = "0.2.6" 801 | source = "registry+https://github.com/rust-lang/crates.io-index" 802 | 803 | [[package]] 804 | name = "pretty_env_logger" 805 | version = "0.4.0" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | dependencies = [ 808 | "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 809 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 810 | ] 811 | 812 | [[package]] 813 | name = "proc-macro-error" 814 | version = "1.0.2" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | dependencies = [ 817 | "proc-macro-error-attr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 818 | "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", 819 | "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 820 | "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", 821 | "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 822 | ] 823 | 824 | [[package]] 825 | name = "proc-macro-error-attr" 826 | version = "1.0.2" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | dependencies = [ 829 | "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", 830 | "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 831 | "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", 832 | "syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 833 | "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 834 | ] 835 | 836 | [[package]] 837 | name = "proc-macro-hack" 838 | version = "0.5.15" 839 | source = "registry+https://github.com/rust-lang/crates.io-index" 840 | 841 | [[package]] 842 | name = "proc-macro-nested" 843 | version = "0.1.4" 844 | source = "registry+https://github.com/rust-lang/crates.io-index" 845 | 846 | [[package]] 847 | name = "proc-macro2" 848 | version = "1.0.10" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | dependencies = [ 851 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 852 | ] 853 | 854 | [[package]] 855 | name = "pulldown-cmark" 856 | version = "0.7.0" 857 | source = "registry+https://github.com/rust-lang/crates.io-index" 858 | dependencies = [ 859 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 860 | "getopts 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 861 | "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 862 | "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 863 | ] 864 | 865 | [[package]] 866 | name = "quick-error" 867 | version = "1.2.3" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | 870 | [[package]] 871 | name = "quote" 872 | version = "1.0.3" 873 | source = "registry+https://github.com/rust-lang/crates.io-index" 874 | dependencies = [ 875 | "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", 876 | ] 877 | 878 | [[package]] 879 | name = "rand" 880 | version = "0.6.5" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | dependencies = [ 883 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 884 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 885 | "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 886 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 887 | "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 888 | "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 889 | "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 890 | "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 891 | "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 892 | "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 893 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 894 | ] 895 | 896 | [[package]] 897 | name = "rand" 898 | version = "0.7.3" 899 | source = "registry+https://github.com/rust-lang/crates.io-index" 900 | dependencies = [ 901 | "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 902 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 903 | "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 904 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 905 | "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 906 | ] 907 | 908 | [[package]] 909 | name = "rand_chacha" 910 | version = "0.1.1" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | dependencies = [ 913 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 914 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 915 | ] 916 | 917 | [[package]] 918 | name = "rand_chacha" 919 | version = "0.2.2" 920 | source = "registry+https://github.com/rust-lang/crates.io-index" 921 | dependencies = [ 922 | "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 923 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 924 | ] 925 | 926 | [[package]] 927 | name = "rand_core" 928 | version = "0.3.1" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | dependencies = [ 931 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 932 | ] 933 | 934 | [[package]] 935 | name = "rand_core" 936 | version = "0.4.2" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | 939 | [[package]] 940 | name = "rand_core" 941 | version = "0.5.1" 942 | source = "registry+https://github.com/rust-lang/crates.io-index" 943 | dependencies = [ 944 | "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 945 | ] 946 | 947 | [[package]] 948 | name = "rand_hc" 949 | version = "0.1.0" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | dependencies = [ 952 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 953 | ] 954 | 955 | [[package]] 956 | name = "rand_hc" 957 | version = "0.2.0" 958 | source = "registry+https://github.com/rust-lang/crates.io-index" 959 | dependencies = [ 960 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 961 | ] 962 | 963 | [[package]] 964 | name = "rand_isaac" 965 | version = "0.1.1" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | dependencies = [ 968 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 969 | ] 970 | 971 | [[package]] 972 | name = "rand_jitter" 973 | version = "0.1.4" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | dependencies = [ 976 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 977 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 978 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 979 | ] 980 | 981 | [[package]] 982 | name = "rand_os" 983 | version = "0.1.3" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | dependencies = [ 986 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 987 | "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 988 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 989 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 990 | "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 991 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 992 | ] 993 | 994 | [[package]] 995 | name = "rand_pcg" 996 | version = "0.1.2" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | dependencies = [ 999 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1000 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1001 | ] 1002 | 1003 | [[package]] 1004 | name = "rand_xorshift" 1005 | version = "0.1.1" 1006 | source = "registry+https://github.com/rust-lang/crates.io-index" 1007 | dependencies = [ 1008 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "rdrand" 1013 | version = "0.4.0" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | dependencies = [ 1016 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1017 | ] 1018 | 1019 | [[package]] 1020 | name = "redox_syscall" 1021 | version = "0.1.56" 1022 | source = "registry+https://github.com/rust-lang/crates.io-index" 1023 | 1024 | [[package]] 1025 | name = "regex" 1026 | version = "1.3.6" 1027 | source = "registry+https://github.com/rust-lang/crates.io-index" 1028 | dependencies = [ 1029 | "aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", 1030 | "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1031 | "regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)", 1032 | "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1033 | ] 1034 | 1035 | [[package]] 1036 | name = "regex-syntax" 1037 | version = "0.6.17" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | 1040 | [[package]] 1041 | name = "remove_dir_all" 1042 | version = "0.5.2" 1043 | source = "registry+https://github.com/rust-lang/crates.io-index" 1044 | dependencies = [ 1045 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1046 | ] 1047 | 1048 | [[package]] 1049 | name = "ryu" 1050 | version = "1.0.3" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | 1053 | [[package]] 1054 | name = "safemem" 1055 | version = "0.3.3" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | 1058 | [[package]] 1059 | name = "same-file" 1060 | version = "1.0.6" 1061 | source = "registry+https://github.com/rust-lang/crates.io-index" 1062 | dependencies = [ 1063 | "winapi-util 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1064 | ] 1065 | 1066 | [[package]] 1067 | name = "scoped-tls" 1068 | version = "1.0.0" 1069 | source = "registry+https://github.com/rust-lang/crates.io-index" 1070 | 1071 | [[package]] 1072 | name = "serde" 1073 | version = "1.0.106" 1074 | source = "registry+https://github.com/rust-lang/crates.io-index" 1075 | dependencies = [ 1076 | "serde_derive 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", 1077 | ] 1078 | 1079 | [[package]] 1080 | name = "serde_derive" 1081 | version = "1.0.106" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | dependencies = [ 1084 | "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", 1085 | "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1086 | "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", 1087 | ] 1088 | 1089 | [[package]] 1090 | name = "serde_json" 1091 | version = "1.0.51" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | dependencies = [ 1094 | "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 1095 | "ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1096 | "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "serde_urlencoded" 1101 | version = "0.6.1" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | dependencies = [ 1104 | "dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 1105 | "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 1106 | "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", 1107 | "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1108 | ] 1109 | 1110 | [[package]] 1111 | name = "sha-1" 1112 | version = "0.8.2" 1113 | source = "registry+https://github.com/rust-lang/crates.io-index" 1114 | dependencies = [ 1115 | "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", 1116 | "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 1117 | "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1118 | "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1119 | ] 1120 | 1121 | [[package]] 1122 | name = "siphasher" 1123 | version = "0.2.3" 1124 | source = "registry+https://github.com/rust-lang/crates.io-index" 1125 | 1126 | [[package]] 1127 | name = "slab" 1128 | version = "0.4.2" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | 1131 | [[package]] 1132 | name = "smallvec" 1133 | version = "1.3.0" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | 1136 | [[package]] 1137 | name = "strsim" 1138 | version = "0.8.0" 1139 | source = "registry+https://github.com/rust-lang/crates.io-index" 1140 | 1141 | [[package]] 1142 | name = "structopt" 1143 | version = "0.3.13" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | dependencies = [ 1146 | "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", 1147 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1148 | "structopt-derive 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1149 | ] 1150 | 1151 | [[package]] 1152 | name = "structopt-derive" 1153 | version = "0.4.6" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | dependencies = [ 1156 | "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1157 | "proc-macro-error 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1158 | "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", 1159 | "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1160 | "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", 1161 | ] 1162 | 1163 | [[package]] 1164 | name = "syn" 1165 | version = "1.0.17" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | dependencies = [ 1168 | "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", 1169 | "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1170 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1171 | ] 1172 | 1173 | [[package]] 1174 | name = "syn-mid" 1175 | version = "0.5.0" 1176 | source = "registry+https://github.com/rust-lang/crates.io-index" 1177 | dependencies = [ 1178 | "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", 1179 | "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1180 | "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", 1181 | ] 1182 | 1183 | [[package]] 1184 | name = "syntect" 1185 | version = "4.1.0" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | dependencies = [ 1188 | "bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1189 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1190 | "fancy-regex 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1191 | "flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1192 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1193 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1194 | "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1195 | "plist 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 1196 | "regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)", 1197 | "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", 1198 | "serde_derive 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", 1199 | "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", 1200 | "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1201 | ] 1202 | 1203 | [[package]] 1204 | name = "tempfile" 1205 | version = "3.1.0" 1206 | source = "registry+https://github.com/rust-lang/crates.io-index" 1207 | dependencies = [ 1208 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1209 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 1210 | "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", 1211 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 1212 | "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", 1213 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1214 | ] 1215 | 1216 | [[package]] 1217 | name = "termcolor" 1218 | version = "1.1.0" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | dependencies = [ 1221 | "winapi-util 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1222 | ] 1223 | 1224 | [[package]] 1225 | name = "textwrap" 1226 | version = "0.11.0" 1227 | source = "registry+https://github.com/rust-lang/crates.io-index" 1228 | dependencies = [ 1229 | "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1230 | ] 1231 | 1232 | [[package]] 1233 | name = "thread_local" 1234 | version = "1.0.1" 1235 | source = "registry+https://github.com/rust-lang/crates.io-index" 1236 | dependencies = [ 1237 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1238 | ] 1239 | 1240 | [[package]] 1241 | name = "time" 1242 | version = "0.1.42" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | dependencies = [ 1245 | "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", 1246 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 1247 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1248 | ] 1249 | 1250 | [[package]] 1251 | name = "tokio" 1252 | version = "0.2.18" 1253 | source = "registry+https://github.com/rust-lang/crates.io-index" 1254 | dependencies = [ 1255 | "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 1256 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1257 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1258 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1259 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1260 | "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1261 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 1262 | "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1263 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1264 | "tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", 1265 | ] 1266 | 1267 | [[package]] 1268 | name = "tokio-macros" 1269 | version = "0.2.5" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | dependencies = [ 1272 | "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", 1273 | "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1274 | "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", 1275 | ] 1276 | 1277 | [[package]] 1278 | name = "tokio-tungstenite" 1279 | version = "0.10.1" 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" 1281 | dependencies = [ 1282 | "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1283 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1284 | "pin-project 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", 1285 | "tokio 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", 1286 | "tungstenite 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 1287 | ] 1288 | 1289 | [[package]] 1290 | name = "tokio-util" 1291 | version = "0.3.1" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | dependencies = [ 1294 | "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 1295 | "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1296 | "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1297 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1298 | "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1299 | "tokio 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", 1300 | ] 1301 | 1302 | [[package]] 1303 | name = "tower-service" 1304 | version = "0.3.0" 1305 | source = "registry+https://github.com/rust-lang/crates.io-index" 1306 | 1307 | [[package]] 1308 | name = "try-lock" 1309 | version = "0.2.2" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | 1312 | [[package]] 1313 | name = "tungstenite" 1314 | version = "0.10.1" 1315 | source = "registry+https://github.com/rust-lang/crates.io-index" 1316 | dependencies = [ 1317 | "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 1318 | "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1319 | "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 1320 | "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1321 | "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1322 | "input_buffer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1323 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1324 | "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", 1325 | "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 1326 | "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1327 | "utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)", 1328 | ] 1329 | 1330 | [[package]] 1331 | name = "twoway" 1332 | version = "0.1.8" 1333 | source = "registry+https://github.com/rust-lang/crates.io-index" 1334 | dependencies = [ 1335 | "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1336 | ] 1337 | 1338 | [[package]] 1339 | name = "typenum" 1340 | version = "1.12.0" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | 1343 | [[package]] 1344 | name = "unicase" 1345 | version = "1.4.2" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | dependencies = [ 1348 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1349 | ] 1350 | 1351 | [[package]] 1352 | name = "unicase" 1353 | version = "2.6.0" 1354 | source = "registry+https://github.com/rust-lang/crates.io-index" 1355 | dependencies = [ 1356 | "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 1357 | ] 1358 | 1359 | [[package]] 1360 | name = "unicode-bidi" 1361 | version = "0.3.4" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | dependencies = [ 1364 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1365 | ] 1366 | 1367 | [[package]] 1368 | name = "unicode-normalization" 1369 | version = "0.1.12" 1370 | source = "registry+https://github.com/rust-lang/crates.io-index" 1371 | dependencies = [ 1372 | "smallvec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1373 | ] 1374 | 1375 | [[package]] 1376 | name = "unicode-segmentation" 1377 | version = "1.6.0" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | 1380 | [[package]] 1381 | name = "unicode-width" 1382 | version = "0.1.7" 1383 | source = "registry+https://github.com/rust-lang/crates.io-index" 1384 | 1385 | [[package]] 1386 | name = "unicode-xid" 1387 | version = "0.2.0" 1388 | source = "registry+https://github.com/rust-lang/crates.io-index" 1389 | 1390 | [[package]] 1391 | name = "url" 1392 | version = "2.1.1" 1393 | source = "registry+https://github.com/rust-lang/crates.io-index" 1394 | dependencies = [ 1395 | "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1396 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1397 | "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1398 | ] 1399 | 1400 | [[package]] 1401 | name = "urlencoding" 1402 | version = "1.0.0" 1403 | source = "registry+https://github.com/rust-lang/crates.io-index" 1404 | 1405 | [[package]] 1406 | name = "utf-8" 1407 | version = "0.7.5" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | 1410 | [[package]] 1411 | name = "vec_map" 1412 | version = "0.8.1" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | 1415 | [[package]] 1416 | name = "version_check" 1417 | version = "0.1.5" 1418 | source = "registry+https://github.com/rust-lang/crates.io-index" 1419 | 1420 | [[package]] 1421 | name = "version_check" 1422 | version = "0.9.1" 1423 | source = "registry+https://github.com/rust-lang/crates.io-index" 1424 | 1425 | [[package]] 1426 | name = "walkdir" 1427 | version = "2.3.1" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | dependencies = [ 1430 | "same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1431 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1432 | "winapi-util 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1433 | ] 1434 | 1435 | [[package]] 1436 | name = "want" 1437 | version = "0.3.0" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | dependencies = [ 1440 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1441 | "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1442 | ] 1443 | 1444 | [[package]] 1445 | name = "warp" 1446 | version = "0.2.2" 1447 | source = "registry+https://github.com/rust-lang/crates.io-index" 1448 | dependencies = [ 1449 | "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 1450 | "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1451 | "headers 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 1452 | "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1453 | "hyper 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)", 1454 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1455 | "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", 1456 | "mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1457 | "multipart 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)", 1458 | "pin-project 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", 1459 | "scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1460 | "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", 1461 | "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", 1462 | "serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", 1463 | "tokio 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", 1464 | "tokio-tungstenite 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 1465 | "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1466 | "urlencoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1467 | ] 1468 | 1469 | [[package]] 1470 | name = "wasi" 1471 | version = "0.9.0+wasi-snapshot-preview1" 1472 | source = "registry+https://github.com/rust-lang/crates.io-index" 1473 | 1474 | [[package]] 1475 | name = "winapi" 1476 | version = "0.2.8" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | 1479 | [[package]] 1480 | name = "winapi" 1481 | version = "0.3.8" 1482 | source = "registry+https://github.com/rust-lang/crates.io-index" 1483 | dependencies = [ 1484 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1485 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1486 | ] 1487 | 1488 | [[package]] 1489 | name = "winapi-build" 1490 | version = "0.1.1" 1491 | source = "registry+https://github.com/rust-lang/crates.io-index" 1492 | 1493 | [[package]] 1494 | name = "winapi-i686-pc-windows-gnu" 1495 | version = "0.4.0" 1496 | source = "registry+https://github.com/rust-lang/crates.io-index" 1497 | 1498 | [[package]] 1499 | name = "winapi-util" 1500 | version = "0.1.4" 1501 | source = "registry+https://github.com/rust-lang/crates.io-index" 1502 | dependencies = [ 1503 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1504 | ] 1505 | 1506 | [[package]] 1507 | name = "winapi-x86_64-pc-windows-gnu" 1508 | version = "0.4.0" 1509 | source = "registry+https://github.com/rust-lang/crates.io-index" 1510 | 1511 | [[package]] 1512 | name = "ws2_32-sys" 1513 | version = "0.2.1" 1514 | source = "registry+https://github.com/rust-lang/crates.io-index" 1515 | dependencies = [ 1516 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1517 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1518 | ] 1519 | 1520 | [[package]] 1521 | name = "xml-rs" 1522 | version = "0.8.2" 1523 | source = "registry+https://github.com/rust-lang/crates.io-index" 1524 | 1525 | [metadata] 1526 | "checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" 1527 | "checksum aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" 1528 | "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" 1529 | "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 1530 | "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" 1531 | "checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" 1532 | "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" 1533 | "checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" 1534 | "checksum base64 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d5ca2cd0adc3f48f9e9ea5a6bbdf9ccc0bfade884847e484d452414c7ccffb3" 1535 | "checksum bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" 1536 | "checksum bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e84c238982c4b1e1ee668d136c510c67a13465279c0cb367ea6baf6310620a80" 1537 | "checksum bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f59bbe95d4e52a6398ec21238d31577f2b28a9d86807f06ca59d191d8440d0bb" 1538 | "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 1539 | "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" 1540 | "checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" 1541 | "checksum buf_redux 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" 1542 | "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" 1543 | "checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" 1544 | "checksum bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" 1545 | "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 1546 | "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" 1547 | "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 1548 | "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" 1549 | "checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" 1550 | "checksum dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3" 1551 | "checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" 1552 | "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" 1553 | "checksum fancy-regex 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b0e2de1b89ad299d536b7cefc5d177f5c005957fa2266ce58eca4d189e74bff5" 1554 | "checksum flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" 1555 | "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" 1556 | "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" 1557 | "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 1558 | "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 1559 | "checksum futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5c329ae8753502fb44ae4fc2b622fa2a94652c41e795143765ba0927f92ab780" 1560 | "checksum futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8" 1561 | "checksum futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a" 1562 | "checksum futures-executor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba" 1563 | "checksum futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6" 1564 | "checksum futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7" 1565 | "checksum futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" 1566 | "checksum futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" 1567 | "checksum futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5" 1568 | "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" 1569 | "checksum getopts 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)" = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" 1570 | "checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" 1571 | "checksum h2 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "377038bf3c89d18d6ca1431e7a5027194fbd724ca10592b9487ede5e8e144f42" 1572 | "checksum headers 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ed18eb2459bf1a09ad2d6b1547840c3e5e62882fa09b9a6a20b1de8e3228848f" 1573 | "checksum headers-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" 1574 | "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" 1575 | "checksum hermit-abi 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8a0d737e0f947a1864e93d33fdef4af8445a00d1ed8dc0c8ddb73139ea6abf15" 1576 | "checksum http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" 1577 | "checksum http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" 1578 | "checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" 1579 | "checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" 1580 | "checksum humantime 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b9b6c53306532d3c8e8087b44e6580e10db51a023cf9b433cea2ac38066b92da" 1581 | "checksum hyper 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ed6081100e960d9d74734659ffc9cc91daf1c0fc7aceb8eaa94ee1a3f5046f2e" 1582 | "checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" 1583 | "checksum indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" 1584 | "checksum inotify 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bc39ee997811267bf8aa0b10e1674c5bea6caacc1957eede5ea45251fe33c6d5" 1585 | "checksum inotify-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e74a1aa87c59aeff6ef2cc2fa62d41bc43f54952f55652656b18a02fd5e356c0" 1586 | "checksum input_buffer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "19a8a95243d5a0398cae618ec29477c6e3cb631152be5c19481f80bc71559754" 1587 | "checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" 1588 | "checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" 1589 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 1590 | "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1591 | "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" 1592 | "checksum libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)" = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005" 1593 | "checksum line-wrap 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" 1594 | "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" 1595 | "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" 1596 | "checksum macro-utils 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0e72f7deb758fea9ea7d290aebfa788763d0bffae12caa6406a25baaf8fa68a8" 1597 | "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 1598 | "checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" 1599 | "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" 1600 | "checksum mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1601 | "checksum mime_guess 1.8.8 (registry+https://github.com/rust-lang/crates.io-index)" = "216929a5ee4dd316b1702eedf5e74548c123d370f47841ceaac38ca154690ca3" 1602 | "checksum mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" 1603 | "checksum minifier 0.0.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1152a0a768a747fd88f25b1d47d28b9450e11df8ebdcaadea4cc55d9c0e79673" 1604 | "checksum miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" 1605 | "checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" 1606 | "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 1607 | "checksum multipart 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)" = "136eed74cadb9edd2651ffba732b19a450316b680e4f48d6c79e905799e19d01" 1608 | "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" 1609 | "checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" 1610 | "checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1611 | "checksum phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" 1612 | "checksum phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" 1613 | "checksum phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" 1614 | "checksum phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" 1615 | "checksum pin-project 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6f6a7f5eee6292c559c793430c55c00aea9d3b3d1905e855806ca4d7253426a2" 1616 | "checksum pin-project-internal 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "8988430ce790d8682672117bc06dda364c0be32d3abd738234f19f3240bad99a" 1617 | "checksum pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae" 1618 | "checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" 1619 | "checksum plist 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "50ce7c785e06e3a9e6f546c1a30d3d59111a31a21bc294fb1496241a572c9a00" 1620 | "checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" 1621 | "checksum pretty_env_logger 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" 1622 | "checksum proc-macro-error 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98e9e4b82e0ef281812565ea4751049f1bdcdfccda7d3f459f2e138a40c08678" 1623 | "checksum proc-macro-error-attr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4f5444ead4e9935abd7f27dc51f7e852a0569ac888096d5ec2499470794e2e53" 1624 | "checksum proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63" 1625 | "checksum proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" 1626 | "checksum proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3" 1627 | "checksum pulldown-cmark 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2c2d7fd131800e0d63df52aff46201acaab70b431a4a1ec6f0343fe8e64f35a4" 1628 | "checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 1629 | "checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" 1630 | "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" 1631 | "checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 1632 | "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" 1633 | "checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 1634 | "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" 1635 | "checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" 1636 | "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 1637 | "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" 1638 | "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 1639 | "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" 1640 | "checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" 1641 | "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" 1642 | "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" 1643 | "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" 1644 | "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" 1645 | "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" 1646 | "checksum regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7f6946991529684867e47d86474e3a6d0c0ab9b82d5821e314b1ede31fa3a4b3" 1647 | "checksum regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)" = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" 1648 | "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" 1649 | "checksum ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76" 1650 | "checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" 1651 | "checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1652 | "checksum scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" 1653 | "checksum serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)" = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399" 1654 | "checksum serde_derive 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)" = "9e549e3abf4fb8621bd1609f11dfc9f5e50320802273b12f3811a67e6716ea6c" 1655 | "checksum serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)" = "da07b57ee2623368351e9a0488bb0b261322a15a6e0ae53e243cbdc0f4208da9" 1656 | "checksum serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" 1657 | "checksum sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" 1658 | "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" 1659 | "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" 1660 | "checksum smallvec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05720e22615919e4734f6a99ceae50d00226c3c5aca406e102ebc33298214e0a" 1661 | "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 1662 | "checksum structopt 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "ff6da2e8d107dfd7b74df5ef4d205c6aebee0706c647f6bc6a2d5789905c00fb" 1663 | "checksum structopt-derive 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a489c87c08fbaf12e386665109dd13470dcc9c4583ea3e10dd2b4523e5ebd9ac" 1664 | "checksum syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03" 1665 | "checksum syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" 1666 | "checksum syntect 4.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "274f5e6be6e730e919e4e371dba490cd35cf7401fad41dac4a39a8d88884c731" 1667 | "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" 1668 | "checksum termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" 1669 | "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 1670 | "checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" 1671 | "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" 1672 | "checksum tokio 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "34ef16d072d2b6dc8b4a56c70f5c5ced1a37752116f8e7c1e80c659aa7cb6713" 1673 | "checksum tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" 1674 | "checksum tokio-tungstenite 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b8fe88007ebc363512449868d7da4389c9400072a3f666f212c7280082882a" 1675 | "checksum tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" 1676 | "checksum tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" 1677 | "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" 1678 | "checksum tungstenite 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cfea31758bf674f990918962e8e5f07071a3161bd7c4138ed23e416e1ac4264e" 1679 | "checksum twoway 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" 1680 | "checksum typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" 1681 | "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" 1682 | "checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 1683 | "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 1684 | "checksum unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" 1685 | "checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" 1686 | "checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" 1687 | "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" 1688 | "checksum url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" 1689 | "checksum urlencoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3df3561629a8bb4c57e5a2e4c43348d9e29c7c29d9b1c4c1f47166deca8f37ed" 1690 | "checksum utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" 1691 | "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" 1692 | "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 1693 | "checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" 1694 | "checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" 1695 | "checksum want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1696 | "checksum warp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "54cd1e2b3eb3539284d88b76a9afcf5e20f2ef2fab74db5b21a1c30d7d945e82" 1697 | "checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 1698 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 1699 | "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" 1700 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 1701 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1702 | "checksum winapi-util 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fa515c5163a99cc82bab70fd3bfdd36d827be85de63737b40fcef2ce084a436e" 1703 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1704 | "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 1705 | "checksum xml-rs 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2bb76e5c421bbbeb8924c60c030331b345555024d56261dae8f3e786ed817c23" 1706 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "deck" 3 | version = "0.3.0" 4 | authors = ["Florian Dehau "] 5 | description = """ 6 | A command line tool to generate HTML presentations from Markdown documents 7 | """ 8 | edition = "2018" 9 | keywords = ["cli", "presentation", "slides", "markdown"] 10 | repository = "https://github.com/fdehau/deck" 11 | license = "MIT" 12 | 13 | [dependencies] 14 | pulldown-cmark = "0.7" 15 | structopt = "0.3" 16 | warp = "0.2" 17 | futures = "0.3" 18 | log = "0.4" 19 | pretty_env_logger = "0.4" 20 | minifier = "0.0.36" 21 | serde = { version = "1.0", features = ["derive"] } 22 | tokio = { version = "0.2", features = ["macros"] } 23 | serde_json = "1.0" 24 | inotify = "0.8" 25 | 26 | [dependencies.syntect] 27 | version = "4.1" 28 | default-features = false 29 | features = ["html", "assets", "dump-load", "regex-fancy"] 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Florian Dehau 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fdehau/deck/c365ca2825c087d2163badac4e778c995eda4217/Makefile -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Continuous Integration](https://github.com/fdehau/deck/workflows/Continuous%20Integration/badge.svg)](https://github.com/fdehau/deck/actions?query=workflow%3A%22Continuous+Integration%22) 2 | [![Crate Status](https://img.shields.io/crates/v/deck.svg)](https://crates.io/crates/deck) 3 | [![Docs Status](https://docs.rs/deck/badge.svg)](https://docs.rs/crate/deck/) 4 | 5 | # Deck 6 | 7 | Deck is a command line tool that generates HTML presentations from Markdown 8 | documents. 9 | 10 | ## Input 11 | 12 | Slides are written in Markdown. Horizontal rules (`---`) are used to separate 13 | each slide. 14 | 15 | ## Usage 16 | 17 | ### Build 18 | 19 | A Markdown file can be converted to an HTML presentation with a single command 20 | in a single file. By default, the generated HTML contains some inline CSS and 21 | Javascript to render the slides correctly. If you wish to customize the output 22 | a bit more you pass additional CSS and Javascript files using either the 23 | `--css` and `--js` options. The resulting document can be open in most modern 24 | browsers. 25 | 26 | ``` 27 | deck build < slides.md > slides.html 28 | ``` 29 | 30 | ### Serve 31 | 32 | You also have the possibility to serve Markdown slides using the built-in 33 | server. The following command makes the presentation available at 34 | `http://localhost:8000/slides`: 35 | 36 | ``` 37 | deck serve slides.md -p 8000 38 | ``` 39 | 40 | When writing your presentation, it might come in handy to see the resulting 41 | HTML presentation evolves as you write. Adding `-w` to the previous command 42 | and `?watch=true` to the previous URL will ensure that the web page is reloaded 43 | as soon as either the Markdown slides, the custom css or the customm js are 44 | modified. 45 | 46 | ## Syntax highlighting 47 | 48 | Syntax highlighting can be customized in various ways. First, both 49 | `build` and `serve` commands allow you to choose a different theme using 50 | the `--theme` option. By default only a handful of themes are available 51 | as listed [here](https://docs.rs/syntect/latest/syntect/highlighting/struct.ThemeSet.html#method.load_defaults). 52 | 53 | ``` 54 | deck build --theme InspiredGitHub < slides.md > slides.html 55 | ``` 56 | 57 | In addition, `syntect`, the crate doing all the heavy lifting of highlighting 58 | the code, is able to load all TextMate and Sublime Text `.tmTheme` color 59 | schemes. In order to load a local theme, you must first add its directory 60 | to the list of paths where the binary will look for compatible themes and 61 | then select it using `--theme`. Given that the `gruvbox.tmTheme` is under 62 | the directory `./themes` the command invocation could look like: 63 | 64 | ``` 65 | deck build --theme-dir ./themes --theme gruvbox < slides.md > slides.html 66 | ``` 67 | 68 | ## Todos 69 | 70 | * Speaker notes 71 | * Timer 72 | -------------------------------------------------------------------------------- /slides.md: -------------------------------------------------------------------------------- 1 | # Deck, a minimalist presentation tool 2 | 3 | --- 4 | 5 | # Built with Rust 6 | 7 | 8 | 9 | --- 10 | 11 | # Thanks to 12 | 13 | - [pulldown_cmark](https://github.com/raphlinus/pulldown-cmark) (markdown to html) 14 | - [syntect](https://github.com/trishume/syntect) (syntax highlighting) 15 | - [warp](https://github.com/seanmonstar/warp) (local server) 16 | - [inotify](https://github.com/inotify-rs/inotify) (automatic reload) 17 | 18 | --- 19 | 20 | # Syntax highlighting 21 | 22 | ```rust 23 | fn main() { 24 | // Read input from stdin 25 | let mut input = String::new(); 26 | io::stdin().read_to_string(&mut input).unwrap(); 27 | 28 | // Load syntax and theme 29 | let syntax_set = SyntaxSet::load_defaults_newlines(); 30 | let theme_set = ThemeSet::load_defaults(); 31 | let theme = &theme_set.themes["base16-ocean.dark"]; 32 | } 33 | ``` 34 | 35 | --- 36 | 37 | # List 38 | 39 | 1) First 40 | 2) Second 41 | 3) Third 42 | 43 | --- 44 | 45 | # Bullet points 46 | 47 | * First 48 | * Second 49 | * Third 50 | 51 | --- 52 | 53 | # Tables 54 | 55 | |Col1|Col2|Col3| 56 | |----|----|----| 57 | |Row11|Row12|Row13| 58 | |Row21|Row22|Row23| 59 | 60 | --- 61 | 62 | # Quote 63 | 64 | > Be the change that you wish to see in the world. 65 | -------------------------------------------------------------------------------- /src/error.rs: -------------------------------------------------------------------------------- 1 | use std::{error::Error as StdError, fmt, io}; 2 | use warp::reject; 3 | 4 | #[derive(Debug)] 5 | pub enum Error { 6 | Io(io::Error), 7 | Minification(&'static str), 8 | Syntect(syntect::LoadingError), 9 | JsonSerialization(serde_json::error::Error), 10 | ThemeNotFound, 11 | } 12 | 13 | impl reject::Reject for Error {} 14 | 15 | impl StdError for Error {} 16 | 17 | impl fmt::Display for Error { 18 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 19 | use Error::*; 20 | match self { 21 | Io(err) => err.fmt(f), 22 | Minification(err) => write!(f, "{}", err), 23 | Syntect(err) => err.fmt(f), 24 | JsonSerialization(err) => err.fmt(f), 25 | ThemeNotFound => write!(f, "Theme not found"), 26 | } 27 | } 28 | } 29 | 30 | impl From for Error { 31 | fn from(err: io::Error) -> Error { 32 | Error::Io(err) 33 | } 34 | } 35 | 36 | impl From for Error { 37 | fn from(err: syntect::LoadingError) -> Error { 38 | Error::Syntect(err) 39 | } 40 | } 41 | 42 | impl From for Error { 43 | fn from(err: serde_json::error::Error) -> Error { 44 | Error::JsonSerialization(err) 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/html.rs: -------------------------------------------------------------------------------- 1 | use crate::error::Error; 2 | use pulldown_cmark::{html, CodeBlockKind, Event, Options as MarkdownOptions, Parser, Tag}; 3 | use std::{fmt, path::PathBuf}; 4 | use syntect::{ 5 | easy::HighlightLines, 6 | highlighting::{Theme, ThemeSet}, 7 | html::{start_highlighted_html_snippet, styled_line_to_highlighted_html, IncludeBackground}, 8 | parsing::SyntaxSet, 9 | }; 10 | 11 | const DEFAULT_THEME: &str = "base16-ocean.dark"; 12 | 13 | pub struct Output { 14 | title: Option, 15 | style: String, 16 | script: String, 17 | body: String, 18 | } 19 | 20 | impl fmt::Display for Output { 21 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 22 | writeln!(f, "")?; 23 | writeln!(f, "")?; 24 | 25 | // Meta 26 | writeln!(f, "")?; 27 | if let Some(ref title) = self.title { 28 | writeln!(f, "{}", title)?; 29 | } 30 | 31 | // Style 32 | writeln!(f, "")?; 35 | writeln!(f, "")?; 38 | 39 | writeln!(f, "")?; 40 | writeln!(f, "{}", self.body)?; 41 | writeln!(f, "")?; 42 | 43 | writeln!(f, "")?; 44 | 45 | writeln!(f, "") 46 | } 47 | } 48 | 49 | pub struct Options { 50 | pub title: Option, 51 | pub theme: Option, 52 | pub theme_dirs: Vec, 53 | } 54 | 55 | impl Default for Options { 56 | fn default() -> Options { 57 | Options { 58 | title: None, 59 | theme: None, 60 | theme_dirs: Vec::new(), 61 | } 62 | } 63 | } 64 | 65 | #[derive(Debug, Clone)] 66 | pub struct Renderer { 67 | syntax_set: SyntaxSet, 68 | theme: Theme, 69 | title: Option, 70 | } 71 | 72 | impl Renderer { 73 | pub fn try_new(options: Options) -> Result { 74 | // Load syntax and theme 75 | let syntax_set = SyntaxSet::load_defaults_newlines(); 76 | let mut theme_set = ThemeSet::load_defaults(); 77 | for theme_dir in &options.theme_dirs { 78 | theme_set.add_from_folder(theme_dir)?; 79 | } 80 | let theme_name = options.theme.unwrap_or_else(|| DEFAULT_THEME.to_owned()); 81 | let theme = theme_set 82 | .themes 83 | .remove(&theme_name) 84 | .ok_or_else(|| Error::ThemeNotFound)?; 85 | Ok(Renderer { 86 | syntax_set, 87 | theme, 88 | title: options.title, 89 | }) 90 | } 91 | 92 | pub fn render( 93 | &self, 94 | input: String, 95 | css: Option, 96 | js: Option, 97 | ) -> Result { 98 | // Create parser 99 | let mut opts = MarkdownOptions::empty(); 100 | opts.insert(MarkdownOptions::ENABLE_TABLES); 101 | let parser = Parser::new_ext(&input, opts); 102 | let mut in_code_block = false; 103 | let mut highlighter = None; 104 | let parser = parser.map(|event| match event { 105 | Event::Rule => { 106 | Event::Html("\n\n
\n
".into()) 107 | } 108 | Event::Start(Tag::CodeBlock(ref kind)) => { 109 | in_code_block = true; 110 | let snippet = start_highlighted_html_snippet(&self.theme); 111 | let lang = match kind { 112 | CodeBlockKind::Indented => "", 113 | CodeBlockKind::Fenced(lang) => lang, 114 | }; 115 | if let Some(syntax) = self.syntax_set.find_syntax_by_token(lang) { 116 | highlighter = Some(HighlightLines::new(syntax, &self.theme)); 117 | } 118 | Event::Html(snippet.0.into()) 119 | } 120 | Event::End(Tag::CodeBlock(_)) => { 121 | highlighter = None; 122 | Event::Html("".into()) 123 | } 124 | Event::Text(text) => { 125 | if in_code_block { 126 | if let Some(ref mut highlighter) = highlighter { 127 | let highlighted = highlighter.highlight(&text, &self.syntax_set); 128 | let html = 129 | styled_line_to_highlighted_html(&highlighted, IncludeBackground::No); 130 | return Event::Html(html.into()); 131 | } 132 | } 133 | Event::Text(text) 134 | } 135 | e => e, 136 | }); 137 | 138 | let mut html = String::with_capacity(input.len()); 139 | html::push_html(&mut html, parser); 140 | html.insert_str(0, "
\n
\n"); 141 | html.push_str("
\n
"); 142 | 143 | // Build inline css 144 | let mut style = include_str!("style.css").to_owned(); 145 | if let Some(ref custom_css) = css { 146 | style.push_str(custom_css); 147 | } 148 | let style = minifier::css::minify(&style).map_err(|s| Error::Minification(s))?; 149 | 150 | // Build inline js 151 | let mut script = include_str!("script.js").to_owned(); 152 | if let Some(ref custom_js) = js { 153 | script.push_str(custom_js); 154 | } 155 | let script = minifier::js::minify(&script); 156 | Ok(Output { 157 | title: self.title.clone(), 158 | style, 159 | script, 160 | body: html, 161 | }) 162 | } 163 | } 164 | 165 | #[cfg(test)] 166 | mod tests { 167 | use super::*; 168 | 169 | #[test] 170 | fn test_render() { 171 | let input = r#" 172 | # Slide 1 173 | 174 | This is a **test** 175 | 176 | --- 177 | 178 | # Slide 2 179 | 180 | And it should work"#; 181 | let renderer = Renderer::try_new(Options::default()).expect("Failed to create renderer"); 182 | let output = renderer 183 | .render(input.into(), None, None) 184 | .expect("Failed to render"); 185 | assert_eq!( 186 | r#"
187 |
188 |

Slide 1

189 |

This is a test

190 |
191 |
192 |
193 |
194 |

Slide 2

195 |

And it should work

196 |
197 |
"#, 198 | output.body 199 | ); 200 | } 201 | } 202 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::fs; 2 | use std::io::{self, Read}; 3 | use std::path::PathBuf; 4 | 5 | use structopt::StructOpt; 6 | 7 | use crate::error::Error; 8 | 9 | mod error; 10 | mod html; 11 | mod server; 12 | 13 | #[derive(Debug, StructOpt)] 14 | struct Cli { 15 | #[structopt(long = "verbose", short = "v")] 16 | verbose: bool, 17 | #[structopt(subcommand)] 18 | cmd: Command, 19 | } 20 | 21 | #[derive(Debug, StructOpt)] 22 | enum Command { 23 | /// Convert a markdown file containing the slides markup to a self-contained 24 | /// HTML file 25 | #[structopt(name = "build")] 26 | Build { 27 | /// Set the title of the webpage 28 | #[structopt(long = "title")] 29 | title: Option, 30 | /// Set the theme used to highlight text within code blocks 31 | #[structopt(long = "theme")] 32 | theme: Option, 33 | /// Add a directory to the paths searched for syntect themes (.tmTheme files) 34 | #[structopt(long = "theme-dir")] 35 | theme_dirs: Vec, 36 | /// Add custom css from the given file 37 | #[structopt(long = "css")] 38 | css: Option, 39 | /// Add custom javascript from the given file 40 | #[structopt(long = "js")] 41 | js: Option, 42 | }, 43 | /// Serve a local markdown files containing the slides markup 44 | #[structopt(name = "serve")] 45 | Serve { 46 | /// Change the port used by the server 47 | #[structopt(long = "port", short = "p", default_value = "8000")] 48 | port: u16, 49 | /// Markdown file containing the slides markup 50 | #[structopt(parse(from_os_str))] 51 | input: PathBuf, 52 | /// Whether the input file, the custom css file or the custom js file should be watched for 53 | /// change 54 | #[structopt(long = "watch", short = "w")] 55 | watch: bool, 56 | /// Set the theme used to highlight text within the code blocks 57 | #[structopt(long = "theme")] 58 | theme: Option, 59 | /// Add a directory to the paths searched for syntect themes (.tmTheme files) 60 | #[structopt(long = "theme-dir")] 61 | theme_dirs: Vec, 62 | /// Add custom css from the given file 63 | #[structopt(long = "css")] 64 | css: Option, 65 | /// Add custom js from the given file 66 | #[structopt(long = "js")] 67 | js: Option, 68 | }, 69 | } 70 | 71 | #[tokio::main] 72 | async fn main() -> Result<(), Error> { 73 | let cli = Cli::from_args(); 74 | 75 | pretty_env_logger::formatted_builder() 76 | .filter_module( 77 | "deck", 78 | if cli.verbose { 79 | log::LevelFilter::Debug 80 | } else { 81 | log::LevelFilter::Info 82 | }, 83 | ) 84 | .init(); 85 | 86 | match cli.cmd { 87 | Command::Build { 88 | theme, 89 | title, 90 | css, 91 | js, 92 | theme_dirs, 93 | } => { 94 | // Read input from stdin 95 | let mut input = String::new(); 96 | io::stdin().read_to_string(&mut input)?; 97 | 98 | let css = if let Some(path) = css { 99 | let s = fs::read_to_string(path)?; 100 | Some(s) 101 | } else { 102 | None 103 | }; 104 | 105 | let js = if let Some(path) = js { 106 | let s = fs::read_to_string(path)?; 107 | Some(s) 108 | } else { 109 | None 110 | }; 111 | 112 | // Render html to stdout 113 | let options = html::Options { 114 | title, 115 | theme, 116 | theme_dirs, 117 | }; 118 | 119 | let renderer = html::Renderer::try_new(options)?; 120 | let html = renderer.render(input, css, js)?; 121 | print!("{}", html); 122 | } 123 | Command::Serve { 124 | port, 125 | input, 126 | watch, 127 | theme, 128 | theme_dirs, 129 | css, 130 | js, 131 | } => { 132 | let config = server::Config { 133 | port, 134 | watch, 135 | input, 136 | theme, 137 | theme_dirs, 138 | css, 139 | js, 140 | }; 141 | server::start(config).await?; 142 | } 143 | } 144 | Ok(()) 145 | } 146 | -------------------------------------------------------------------------------- /src/script.js: -------------------------------------------------------------------------------- 1 | window.addEventListener('load', evt => { 2 | const query = new URLSearchParams(window.location.search); 3 | const isWatching = query.get('watch') == 'true'; 4 | let storedIndex = null; 5 | if (isWatching) { 6 | try { 7 | storedIndex = sessionStorage.getItem('index'); 8 | } catch (err) { 9 | console.error('Failed to retrieve slide index from sessionStorage', err); 10 | } 11 | } 12 | let index = storedIndex === null ? 0 : parseInt(storedIndex); 13 | const slides = document.getElementsByClassName('slide'); 14 | 15 | function update() { 16 | for (let i = 0; i < slides.length; i++) { 17 | const slide = slides.item(i); 18 | slide.classList.remove('previous'); 19 | slide.classList.remove('current'); 20 | slide.classList.remove('next'); 21 | if (i === index - 1) { 22 | slide.classList.add('previous'); 23 | } else if (i === index) { 24 | slide.classList.add('current'); 25 | } else if (i === index + 1) { 26 | slide.classList.add('next'); 27 | } 28 | } 29 | if (isWatching) { 30 | try { 31 | sessionStorage.setItem('index', index); 32 | } catch (err) { 33 | console.error('Failed to save slide index in sessionStorage', err); 34 | } 35 | } 36 | } 37 | 38 | update(); 39 | 40 | // Handle key events 41 | window.addEventListener('keydown', evt => { 42 | if (evt.key === 'ArrowLeft') { 43 | if (index === 0) { 44 | return; 45 | } 46 | index--; 47 | update(); 48 | } else if (evt.key === 'ArrowRight') { 49 | if (index == slides.length - 1) { 50 | return; 51 | } 52 | index++; 53 | update(); 54 | } 55 | }, false); 56 | 57 | if (isWatching) { 58 | // Setup auto-reload using a websocket transport 59 | const uri = 'ws://' + window.location.host + '/ws'; 60 | const ws = new WebSocket(uri); 61 | ws.onopen = () => { 62 | console.log('[WS] Connected'); 63 | }; 64 | ws.onmessage = msg => { 65 | console.log('[WS] Message', msg); 66 | const event = JSON.parse(msg.data); 67 | if (event.type === 'reload') { 68 | window.location.reload(); 69 | } 70 | }; 71 | } 72 | }, false); 73 | -------------------------------------------------------------------------------- /src/server.rs: -------------------------------------------------------------------------------- 1 | use crate::{error::Error, html}; 2 | use futures::{FutureExt, StreamExt}; 3 | use inotify::{EventMask, Inotify, WatchMask}; 4 | use log::{debug, error, info}; 5 | use serde::Serialize; 6 | use std::{ 7 | collections::HashMap, 8 | net::SocketAddr, 9 | path::{Path, PathBuf}, 10 | sync::{ 11 | atomic::{AtomicUsize, Ordering}, 12 | Arc, 13 | }, 14 | }; 15 | use tokio::{ 16 | fs, 17 | sync::{mpsc, Mutex}, 18 | }; 19 | use warp::{ 20 | reject, 21 | ws::{Message, WebSocket}, 22 | Filter, 23 | }; 24 | 25 | #[derive(Serialize)] 26 | #[serde(rename_all = "snake_case")] 27 | #[serde(tag = "type")] 28 | enum Event { 29 | Reload, 30 | } 31 | 32 | static NEXT_USER_ID: AtomicUsize = AtomicUsize::new(1); 33 | type Users = Arc>>>>; 34 | 35 | async fn watch_files

(files: Vec

, users: Users) -> Result<(), Error> 36 | where 37 | P: AsRef, 38 | { 39 | let mut inotify = Inotify::init()?; 40 | for file in files { 41 | inotify.add_watch(file, WatchMask::MODIFY)?; 42 | } 43 | let mut buffer = [0; 32]; 44 | let mut stream = inotify.event_stream(&mut buffer)?; 45 | while let Some(res) = stream.next().await { 46 | let event = res?; 47 | if event.mask.contains(EventMask::MODIFY) { 48 | let text = serde_json::to_string(&Event::Reload)?; 49 | for (&id, tx) in users.lock().await.iter() { 50 | debug!("Reloading user, user_id={}", id); 51 | tx.send(Ok(Message::text(text.clone()))).ok(); 52 | } 53 | } 54 | } 55 | Ok(()) 56 | } 57 | 58 | #[derive(Debug, Clone)] 59 | pub struct Config { 60 | pub port: u16, 61 | pub watch: bool, 62 | pub input: PathBuf, 63 | pub theme: Option, 64 | pub theme_dirs: Vec, 65 | pub css: Option, 66 | pub js: Option, 67 | } 68 | 69 | struct Paths { 70 | input: PathBuf, 71 | css: Option, 72 | js: Option, 73 | } 74 | 75 | fn convert_error>(err: E) -> warp::Rejection { 76 | reject::custom(err.into()) 77 | } 78 | 79 | async fn get_slides( 80 | paths: Arc, 81 | renderer: Arc, 82 | ) -> Result { 83 | let css = if let Some(ref path) = paths.css { 84 | let s = fs::read_to_string(path).await.map_err(convert_error)?; 85 | Some(s) 86 | } else { 87 | None 88 | }; 89 | let js = if let Some(ref path) = paths.js { 90 | let s = fs::read_to_string(path).await.map_err(convert_error)?; 91 | Some(s) 92 | } else { 93 | None 94 | }; 95 | let markdown = fs::read_to_string(&paths.input) 96 | .await 97 | .map_err(convert_error)?; 98 | let html = renderer.render(markdown, css, js).map_err(convert_error)?; 99 | Ok(warp::reply::html(format!("{}", html))) 100 | } 101 | 102 | const ERROR_MESSAGE: &str = r#" 103 | 104 | 105 |

Deck encountered an expected error

106 |

Check the server logs

107 | 108 | 109 | "#; 110 | 111 | async fn customize_error(err: warp::Rejection) -> Result { 112 | if let Some(ref err) = err.find::() { 113 | error!("{}", err); 114 | Ok(warp::reply::with_status( 115 | warp::reply::html(ERROR_MESSAGE), 116 | warp::http::StatusCode::INTERNAL_SERVER_ERROR, 117 | )) 118 | } else { 119 | // Could be a NOT_FOUND, or METHOD_NOT_ALLOWED... here we just 120 | // let warp use its default rendering. 121 | Err(err) 122 | } 123 | } 124 | 125 | async fn handle_ws(ws: WebSocket, users: Users) -> Result<(), Box> { 126 | let user_id = NEXT_USER_ID.fetch_add(1, Ordering::Relaxed); 127 | 128 | let (ws_tx, mut ws_rx) = ws.split(); 129 | let (tx, rx) = mpsc::unbounded_channel(); 130 | tokio::task::spawn(rx.forward(ws_tx).map(move |res| { 131 | if let Err(e) = res { 132 | error!( 133 | "Failed to send over a websocket, user_id: {}, error: {}", 134 | user_id, e 135 | ) 136 | } 137 | })); 138 | 139 | { 140 | debug!("User connected, user_id: {}", user_id); 141 | users.lock().await.insert(user_id, tx); 142 | } 143 | 144 | while let Some(res) = ws_rx.next().await { 145 | let msg = res?; 146 | debug!( 147 | "Message received from user, user_id: {}, msg: {:?}", 148 | user_id, msg 149 | ); 150 | } 151 | 152 | { 153 | debug!("User disconnected, user_id: {}", user_id); 154 | users.lock().await.remove(&user_id); 155 | } 156 | 157 | Ok(()) 158 | } 159 | 160 | pub async fn start(config: Config) -> Result<(), Error> { 161 | let port = config.port; 162 | 163 | let users = Arc::new(Mutex::new(HashMap::new())); 164 | 165 | // Setup routes 166 | let slides = { 167 | let options = html::Options { 168 | theme: config.theme, 169 | theme_dirs: config.theme_dirs, 170 | ..html::Options::default() 171 | }; 172 | let renderer = { 173 | let r = html::Renderer::try_new(options)?; 174 | Arc::new(r) 175 | }; 176 | let paths = { 177 | let p = Paths { 178 | input: config.input.clone(), 179 | js: config.js.clone(), 180 | css: config.css.clone(), 181 | }; 182 | Arc::new(p) 183 | }; 184 | let slides_index = warp::path("slides").and(warp::path::end()); 185 | warp::get() 186 | .and(slides_index) 187 | .and(warp::any().map(move || paths.clone())) 188 | .and(warp::any().map(move || renderer.clone())) 189 | .and_then(get_slides) 190 | }; 191 | 192 | let ws = { 193 | let users = users.clone(); 194 | let users = warp::any().map(move || users.clone()); 195 | warp::path("ws") 196 | .and(warp::ws()) 197 | .and(users) 198 | .map(|ws: warp::ws::Ws, users: Users| { 199 | let upgrade = move |socket| async { 200 | if let Err(err) = handle_ws(socket, users).await { 201 | error!("Failed to handle websocket, error: {}", err); 202 | } 203 | }; 204 | ws.on_upgrade(upgrade) 205 | }) 206 | }; 207 | let routes = slides 208 | .or(ws) 209 | .with(warp::log("deck")) 210 | .recover(customize_error); 211 | 212 | // Configure server 213 | let addr: SocketAddr = ([127, 0, 0, 1], port).into(); 214 | let server = warp::serve(routes).bind(addr); 215 | 216 | let mut slides_url = format!("{}/slides", addr); 217 | if config.watch { 218 | slides_url.push_str("?watch=true"); 219 | info!("Watching {} for changes", config.input.to_string_lossy()); 220 | let mut files = vec![config.input]; 221 | if let Some(css) = config.css { 222 | files.push(css.clone()); 223 | } 224 | if let Some(js) = config.js { 225 | files.push(js.clone()); 226 | } 227 | let f = watch_files(files, users); 228 | tokio::task::spawn(f); 229 | } 230 | 231 | info!("Go to {} to see your slides", slides_url); 232 | 233 | server.await; 234 | 235 | Ok(()) 236 | } 237 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: white; 3 | color: black; 4 | width: 100%; 5 | font-family: sans-serif; 6 | font-size: 200%; 7 | } 8 | 9 | @media screen { 10 | body { 11 | height: 100%; 12 | overflow: hidden; 13 | } 14 | } 15 | 16 | pre { 17 | font-family: monospace; 18 | text-align: initial; 19 | padding: 1em; 20 | } 21 | 22 | h1, h2, h3, h4, h5, h6 { 23 | text-align: center; 24 | } 25 | 26 | blockquote { 27 | text 28 | } 29 | 30 | @media screen { 31 | .slide { 32 | position: absolute; 33 | width: 100%; 34 | height: 100%; 35 | max-width: 100%; 36 | max-height: 100%; 37 | 38 | display: none; 39 | flex-direction: column; 40 | align-items: center; 41 | justify-content: center; 42 | transition: transform 0.5s ease 0s; 43 | } 44 | 45 | .previous { 46 | display: flex; 47 | overflow: hidden; 48 | transform: translate3d(-100%, 0, 0); 49 | } 50 | 51 | .current { 52 | display: flex; 53 | } 54 | 55 | .next { 56 | display: flex; 57 | overflow: hidden; 58 | transform: translate3d(100%, 0, 0); 59 | } 60 | 61 | .slide .content { 62 | width: 90%; 63 | height: 100%; 64 | 65 | padding: 1em; 66 | overflow-wrap: break-word; 67 | 68 | display: flex; 69 | flex-direction: column; 70 | align-items: center; 71 | justify-content: center; 72 | } 73 | } 74 | 75 | @media print { 76 | body { 77 | font-size: 150%; 78 | } 79 | 80 | .slide { 81 | width: 100%; 82 | height: 100%; 83 | 84 | page-break-after: always; 85 | 86 | display: flex; 87 | flex-direction: column; 88 | align-items: center; 89 | justify-content: center; 90 | } 91 | 92 | .slide .content { 93 | width: 90%; 94 | height: 100%; 95 | 96 | padding: 1em; 97 | overflow-wrap: break-word; 98 | 99 | display: flex; 100 | flex-direction: column; 101 | align-items: center; 102 | justify-content: center; 103 | } 104 | } 105 | --------------------------------------------------------------------------------