├── .github ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── lint.yml │ ├── release.yml │ └── test.yml ├── .gitignore ├── .vscode ├── extensions.json └── launch.json ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── docs ├── README.md ├── how-to-release.md ├── images │ └── puppy-browser.png └── setup-dev.md ├── examples ├── dom.html ├── jump.html └── sample.html ├── scripts └── prepare-v8.sh └── src ├── cli.rs ├── cli ├── logger.rs ├── opts.rs ├── subcommand.rs └── subcommand │ ├── completion.rs │ ├── javascript.rs │ └── open.rs ├── core.rs ├── core ├── css.rs ├── dom.rs ├── dom │ ├── chardata.rs │ ├── document.rs │ ├── element.rs │ └── node.rs ├── fetch.rs ├── html.rs ├── layout.rs ├── style.rs ├── url.rs └── window.rs ├── javascript.rs ├── javascript ├── api.rs ├── binding.rs ├── binding │ ├── console.rs │ ├── dom.rs │ └── window.rs └── runtime.rs ├── lib.rs ├── main.rs ├── tui.rs ├── tui ├── api.rs ├── components.rs ├── components │ ├── alert.rs │ ├── input.rs │ └── link.rs ├── logger.rs ├── render.rs ├── render │ ├── a.rs │ ├── i.rs │ └── input.rs ├── views.rs └── views │ ├── browser.rs │ ├── menu.rs │ ├── navigation.rs │ └── page.rs └── util.rs /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | # Description 2 | 3 | TODO: Describe what you've done in your PR. 4 | 5 | # Context 6 | 7 | TODO: Describe why you've made the PR. You can put a link for a ticket in Jira or an issue in GitHub here. 8 | 9 | # Checklist 10 | 11 | - [ ] I opened a draft PR or added the `[WIP]` level if my PR is not ready for review. 12 | - [ ] I have reviewed the code by myself. 13 | - [ ] I have assigned an appropriate reviewer for the PR. 14 | - [ ] I have commented my code, particularly in hard-to-understand areas. 15 | - [ ] I have made corresponding changes to the documentation. 16 | - [ ] I have added tests enough to show how your code behaves and that your code works as expected. 17 | 18 | # Additional Notes 19 | 20 | TODO: Describe any other information you'd like to mention. 21 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Run lint 2 | 3 | on: 4 | push: 5 | 6 | jobs: 7 | lint: 8 | strategy: 9 | matrix: 10 | rust: 11 | - stable 12 | os: [ubuntu-latest] 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout HEAD 16 | uses: actions/checkout@v1 17 | - name: Setup Rust 18 | uses: actions-rs/toolchain@v1 19 | with: 20 | profile: minimal 21 | toolchain: ${{ matrix.rust }} 22 | override: true 23 | - run: rustup component add clippy 24 | - uses: actions-rs/clippy-check@v1 25 | with: 26 | token: ${{ secrets.GITHUB_TOKEN }} 27 | args: --all-features 28 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - "v*" 7 | jobs: 8 | build: 9 | name: Build all 10 | strategy: 11 | matrix: 12 | target: 13 | - x86_64-unknown-linux-gnu 14 | - x86_64-pc-windows-gnu 15 | - x86_64-apple-darwin 16 | include: 17 | - target: x86_64-unknown-linux-gnu 18 | os: ubuntu-latest 19 | - target: x86_64-pc-windows-gnu 20 | os: ubuntu-latest 21 | - target: x86_64-apple-darwin 22 | os: macos-latest 23 | 24 | runs-on: ${{ matrix.os }} 25 | steps: 26 | - name: Checkout HEAD 27 | uses: actions/checkout@v1 28 | - name: Setup Rust 29 | uses: actions-rs/toolchain@v1 30 | with: 31 | profile: minimal 32 | toolchain: stable 33 | override: true 34 | 35 | - name: Cache cargo registry 36 | uses: actions/cache@v1 37 | with: 38 | path: ~/.cargo/registry 39 | key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} 40 | - name: Cache cargo index 41 | uses: actions/cache@v1 42 | with: 43 | path: ~/.cargo/git 44 | key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} 45 | - name: Cache cargo build 46 | uses: actions/cache@v1 47 | with: 48 | path: target 49 | key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} 50 | 51 | - uses: actions-rs/cargo@v1.0.1 52 | with: 53 | command: build 54 | args: --release --target=${{ matrix.target }} 55 | use-cross: true 56 | - name: Compress release files 57 | run: | 58 | zip --junk-paths puppy-${{ matrix.target }} target/${{ matrix.target }}/release/puppy{,.exe} 59 | - uses: actions/upload-artifact@v1 60 | with: 61 | name: build-${{ matrix.target }} 62 | path: puppy-${{ matrix.target }}.zip 63 | 64 | create-release: 65 | name: Create Github Release 66 | needs: 67 | - build 68 | runs-on: ubuntu-latest 69 | steps: 70 | - name: Create a GitHub release 71 | id: create-release 72 | uses: actions/create-release@v1 73 | env: 74 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 75 | with: 76 | tag_name: ${{ github.ref }} 77 | release_name: Release ${{ github.ref }} 78 | draft: false 79 | prerelease: true 80 | - run: | 81 | echo '${{ steps.create-release.outputs.upload_url }}' > release_upload_url.txt 82 | - uses: actions/upload-artifact@v1 83 | with: 84 | name: create-release 85 | path: release_upload_url.txt 86 | 87 | upload-assets: 88 | name: Create Github Release 89 | needs: 90 | - create-release 91 | strategy: 92 | matrix: 93 | target: 94 | - x86_64-unknown-linux-gnu 95 | - x86_64-pc-windows-gnu 96 | - x86_64-apple-darwin 97 | runs-on: ubuntu-latest 98 | steps: 99 | - name: Fetch meta artifacts 100 | uses: actions/download-artifact@v1 101 | with: 102 | name: create-release 103 | - name: Extract an upload URL 104 | id: upload-url 105 | run: | 106 | echo "::set-output name=url::$(cat create-release/release_upload_url.txt)" 107 | - name: Download actual artifacts 108 | uses: actions/download-artifact@v1 109 | with: 110 | name: build-${{ matrix.target }} 111 | - uses: actions/upload-release-asset@v1 112 | env: 113 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 114 | with: 115 | upload_url: ${{ steps.upload-url.outputs.url }} 116 | asset_name: build-${{ matrix.target }}.zip 117 | asset_path: build-${{ matrix.target }}/puppy-${{ matrix.target }}.zip 118 | asset_content_type: application/zip 119 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Run tests 2 | 3 | on: 4 | push: 5 | 6 | jobs: 7 | test: 8 | # TODO (enhancement): We can extend this timeout if our tests get larger than expected. 9 | timeout-minutes: 10 10 | strategy: 11 | matrix: 12 | rust: 13 | - stable 14 | os: [ubuntu-latest] 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout HEAD 18 | uses: actions/checkout@v1 19 | - name: Setup Rust 20 | uses: actions-rs/toolchain@v1 21 | with: 22 | profile: minimal 23 | toolchain: ${{ matrix.rust }} 24 | override: true 25 | - name: Build 26 | run: cargo build 27 | - name: Run tests 28 | run: cargo test 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .idea 3 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "bungcip.better-toml", 4 | "vadimcn.vscode-lldb", 5 | "matklad.rust-analyzer", 6 | ], 7 | "unwantedRecommendations": [ 8 | "rust-lang.rust", 9 | ] 10 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | 5 | { 6 | "type": "lldb", 7 | "request": "launch", 8 | "name": "Debug executable 'puppy'", 9 | "cargo": { 10 | "args": ["build", "--bin=puppy", "--package=puppy"], 11 | "filter": { 12 | "name": "puppy", 13 | "kind": "bin" 14 | } 15 | }, 16 | "args": ["open"], 17 | "cwd": "${workspaceFolder}" 18 | }, 19 | { 20 | "type": "lldb", 21 | "request": "launch", 22 | "name": "Debug unit tests in executable 'puppy'", 23 | "cargo": { 24 | "args": [ 25 | "test", 26 | "--no-run", 27 | "--bin=puppy", 28 | "--package=puppy" 29 | ], 30 | "filter": { 31 | "name": "puppy", 32 | "kind": "bin" 33 | } 34 | }, 35 | "args": ["open"], 36 | "cwd": "${workspaceFolder}" 37 | } 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "ahash" 7 | version = "0.6.3" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "796540673305a66d127804eef19ad696f1f204b8c1025aaca4958c17eab32877" 10 | dependencies = [ 11 | "getrandom", 12 | "once_cell", 13 | "version_check", 14 | ] 15 | 16 | [[package]] 17 | name = "ahash" 18 | version = "0.7.2" 19 | source = "registry+https://github.com/rust-lang/crates.io-index" 20 | checksum = "7f200cbb1e856866d9eade941cf3aa0c5d7dd36f74311c4273b494f4ef036957" 21 | dependencies = [ 22 | "getrandom", 23 | "once_cell", 24 | "version_check", 25 | ] 26 | 27 | [[package]] 28 | name = "ansi_term" 29 | version = "0.11.0" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" 32 | dependencies = [ 33 | "winapi", 34 | ] 35 | 36 | [[package]] 37 | name = "array-macro" 38 | version = "1.0.5" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | checksum = "06e97b4e522f9e55523001238ac59d13a8603af57f69980de5d8de4bbbe8ada6" 41 | 42 | [[package]] 43 | name = "atty" 44 | version = "0.2.14" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 47 | dependencies = [ 48 | "hermit-abi", 49 | "libc", 50 | "winapi", 51 | ] 52 | 53 | [[package]] 54 | name = "autocfg" 55 | version = "1.0.1" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 58 | 59 | [[package]] 60 | name = "base64" 61 | version = "0.13.0" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 64 | 65 | [[package]] 66 | name = "bitflags" 67 | version = "1.2.1" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 70 | 71 | [[package]] 72 | name = "bumpalo" 73 | version = "3.6.1" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" 76 | 77 | [[package]] 78 | name = "bytes" 79 | version = "1.0.1" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" 82 | 83 | [[package]] 84 | name = "cc" 85 | version = "1.0.67" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" 88 | 89 | [[package]] 90 | name = "cfg-if" 91 | version = "1.0.0" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 94 | 95 | [[package]] 96 | name = "chrono" 97 | version = "0.4.19" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" 100 | dependencies = [ 101 | "libc", 102 | "num-integer", 103 | "num-traits", 104 | "time", 105 | "winapi", 106 | ] 107 | 108 | [[package]] 109 | name = "clap" 110 | version = "2.33.3" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" 113 | dependencies = [ 114 | "ansi_term", 115 | "atty", 116 | "bitflags", 117 | "strsim 0.8.0", 118 | "textwrap", 119 | "unicode-width", 120 | "vec_map", 121 | ] 122 | 123 | [[package]] 124 | name = "clap-verbosity-flag" 125 | version = "0.3.1" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "a7d77af89389927c728493ffeabe62bbcb4d9c5f0f805b7058b5cff1e097047d" 128 | dependencies = [ 129 | "log", 130 | "structopt", 131 | ] 132 | 133 | [[package]] 134 | name = "combine" 135 | version = "4.5.2" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "cc4369b5e4c0cddf64ad8981c0111e7df4f7078f4d6ba98fb31f2e17c4c57b7e" 138 | dependencies = [ 139 | "bytes", 140 | "memchr", 141 | ] 142 | 143 | [[package]] 144 | name = "core-foundation" 145 | version = "0.9.1" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" 148 | dependencies = [ 149 | "core-foundation-sys", 150 | "libc", 151 | ] 152 | 153 | [[package]] 154 | name = "core-foundation-sys" 155 | version = "0.8.2" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" 158 | 159 | [[package]] 160 | name = "crossbeam-channel" 161 | version = "0.5.1" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" 164 | dependencies = [ 165 | "cfg-if", 166 | "crossbeam-utils", 167 | ] 168 | 169 | [[package]] 170 | name = "crossbeam-utils" 171 | version = "0.8.3" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49" 174 | dependencies = [ 175 | "autocfg", 176 | "cfg-if", 177 | "lazy_static", 178 | ] 179 | 180 | [[package]] 181 | name = "cursive" 182 | version = "0.16.4-alpha.0" 183 | source = "git+https://github.com/gyscos/cursive#52188d3dca55fec94f1c42fa5e48ed48972ea8f4" 184 | dependencies = [ 185 | "ahash 0.7.2", 186 | "cfg-if", 187 | "crossbeam-channel", 188 | "cursive_core 0.2.2 (git+https://github.com/gyscos/cursive)", 189 | "lazy_static", 190 | "libc", 191 | "log", 192 | "maplit", 193 | "ncurses", 194 | "signal-hook", 195 | "term_size", 196 | "unicode-segmentation", 197 | "unicode-width", 198 | ] 199 | 200 | [[package]] 201 | name = "cursive-aligned-view" 202 | version = "0.4.0" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "69a64a05a72b75144e0e673fc020c4d2b9467b9df1879bdc48d2c6b494c2c083" 205 | dependencies = [ 206 | "cursive_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 207 | ] 208 | 209 | [[package]] 210 | name = "cursive_core" 211 | version = "0.2.2" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "025ac0bcd21ced752d27b70e6aa2285a3513d07b5a0c7f89e71121d20ca1429d" 214 | dependencies = [ 215 | "ahash 0.6.3", 216 | "chrono", 217 | "crossbeam-channel", 218 | "enum-map 0.6.4", 219 | "lazy_static", 220 | "libc", 221 | "log", 222 | "num 0.3.1", 223 | "owning_ref", 224 | "syn", 225 | "unicode-segmentation", 226 | "unicode-width", 227 | "wasmer_enumset", 228 | "xi-unicode", 229 | ] 230 | 231 | [[package]] 232 | name = "cursive_core" 233 | version = "0.2.2" 234 | source = "git+https://github.com/gyscos/cursive#52188d3dca55fec94f1c42fa5e48ed48972ea8f4" 235 | dependencies = [ 236 | "ahash 0.7.2", 237 | "chrono", 238 | "crossbeam-channel", 239 | "enum-map 1.0.0", 240 | "enumset", 241 | "lazy_static", 242 | "log", 243 | "num 0.4.0", 244 | "owning_ref", 245 | "unicode-segmentation", 246 | "unicode-width", 247 | "xi-unicode", 248 | ] 249 | 250 | [[package]] 251 | name = "darling" 252 | version = "0.10.2" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" 255 | dependencies = [ 256 | "darling_core 0.10.2", 257 | "darling_macro 0.10.2", 258 | ] 259 | 260 | [[package]] 261 | name = "darling" 262 | version = "0.12.4" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" 265 | dependencies = [ 266 | "darling_core 0.12.4", 267 | "darling_macro 0.12.4", 268 | ] 269 | 270 | [[package]] 271 | name = "darling_core" 272 | version = "0.10.2" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" 275 | dependencies = [ 276 | "fnv", 277 | "ident_case", 278 | "proc-macro2", 279 | "quote", 280 | "strsim 0.9.3", 281 | "syn", 282 | ] 283 | 284 | [[package]] 285 | name = "darling_core" 286 | version = "0.12.4" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" 289 | dependencies = [ 290 | "fnv", 291 | "ident_case", 292 | "proc-macro2", 293 | "quote", 294 | "strsim 0.10.0", 295 | "syn", 296 | ] 297 | 298 | [[package]] 299 | name = "darling_macro" 300 | version = "0.10.2" 301 | source = "registry+https://github.com/rust-lang/crates.io-index" 302 | checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" 303 | dependencies = [ 304 | "darling_core 0.10.2", 305 | "quote", 306 | "syn", 307 | ] 308 | 309 | [[package]] 310 | name = "darling_macro" 311 | version = "0.12.4" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" 314 | dependencies = [ 315 | "darling_core 0.12.4", 316 | "quote", 317 | "syn", 318 | ] 319 | 320 | [[package]] 321 | name = "either" 322 | version = "1.6.1" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 325 | 326 | [[package]] 327 | name = "encoding_rs" 328 | version = "0.8.28" 329 | source = "registry+https://github.com/rust-lang/crates.io-index" 330 | checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" 331 | dependencies = [ 332 | "cfg-if", 333 | ] 334 | 335 | [[package]] 336 | name = "enum-map" 337 | version = "0.6.4" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "4187999839f4ae8be35cf185d1381aa8dc32d2f5951349cc37ae49ebc4781855" 340 | dependencies = [ 341 | "array-macro", 342 | "enum-map-derive 0.4.6", 343 | ] 344 | 345 | [[package]] 346 | name = "enum-map" 347 | version = "1.0.0" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "88acdb627a242ba1bf36653fa200f72c037ca3324e0710d1ac4fee809a1539cd" 350 | dependencies = [ 351 | "enum-map-derive 0.5.0", 352 | ] 353 | 354 | [[package]] 355 | name = "enum-map-derive" 356 | version = "0.4.6" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "e5c450cf304c9e18d45db562025a14fb1ca0f5c769b6f609309f81d4c31de455" 359 | dependencies = [ 360 | "proc-macro2", 361 | "quote", 362 | "syn", 363 | ] 364 | 365 | [[package]] 366 | name = "enum-map-derive" 367 | version = "0.5.0" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "f2dccd930f0c0a8968d873b10d3611f71bffc4dff84879dabf7b746b0686ea81" 370 | dependencies = [ 371 | "proc-macro2", 372 | "quote", 373 | "syn", 374 | ] 375 | 376 | [[package]] 377 | name = "enumset" 378 | version = "1.0.6" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "fbd795df6708a599abf1ee10eacc72efd052b7a5f70fdf0715e4d5151a6db9c3" 381 | dependencies = [ 382 | "enumset_derive", 383 | ] 384 | 385 | [[package]] 386 | name = "enumset_derive" 387 | version = "0.5.4" 388 | source = "registry+https://github.com/rust-lang/crates.io-index" 389 | checksum = "e19c52f9ec503c8a68dc04daf71a04b07e690c32ab1a8b68e33897f255269d47" 390 | dependencies = [ 391 | "darling 0.12.4", 392 | "proc-macro2", 393 | "quote", 394 | "syn", 395 | ] 396 | 397 | [[package]] 398 | name = "fern" 399 | version = "0.5.9" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "e69ab0d5aca163e388c3a49d284fed6c3d0810700e77c5ae2756a50ec1a4daaa" 402 | dependencies = [ 403 | "chrono", 404 | "log", 405 | ] 406 | 407 | [[package]] 408 | name = "fnv" 409 | version = "1.0.7" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 412 | 413 | [[package]] 414 | name = "foreign-types" 415 | version = "0.3.2" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 418 | dependencies = [ 419 | "foreign-types-shared", 420 | ] 421 | 422 | [[package]] 423 | name = "foreign-types-shared" 424 | version = "0.1.1" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 427 | 428 | [[package]] 429 | name = "form_urlencoded" 430 | version = "1.0.1" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 433 | dependencies = [ 434 | "matches", 435 | "percent-encoding", 436 | ] 437 | 438 | [[package]] 439 | name = "fslock" 440 | version = "0.1.6" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "b14c83e47c73f7d62d907ae24a1a98e9132df3c33eb6c54fcf4bce0dbc41d5af" 443 | dependencies = [ 444 | "libc", 445 | "winapi", 446 | ] 447 | 448 | [[package]] 449 | name = "futures-channel" 450 | version = "0.3.14" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "ce79c6a52a299137a6013061e0cf0e688fce5d7f1bc60125f520912fdb29ec25" 453 | dependencies = [ 454 | "futures-core", 455 | ] 456 | 457 | [[package]] 458 | name = "futures-core" 459 | version = "0.3.14" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "098cd1c6dda6ca01650f1a37a794245eb73181d0d4d4e955e2f3c37db7af1815" 462 | 463 | [[package]] 464 | name = "futures-io" 465 | version = "0.3.14" 466 | source = "registry+https://github.com/rust-lang/crates.io-index" 467 | checksum = "365a1a1fb30ea1c03a830fdb2158f5236833ac81fa0ad12fe35b29cddc35cb04" 468 | 469 | [[package]] 470 | name = "futures-sink" 471 | version = "0.3.14" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "5c5629433c555de3d82861a7a4e3794a4c40040390907cfbfd7143a92a426c23" 474 | 475 | [[package]] 476 | name = "futures-task" 477 | version = "0.3.14" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "ba7aa51095076f3ba6d9a1f702f74bd05ec65f555d70d2033d55ba8d69f581bc" 480 | 481 | [[package]] 482 | name = "futures-util" 483 | version = "0.3.14" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "3c144ad54d60f23927f0a6b6d816e4271278b64f005ad65e4e35291d2de9c025" 486 | dependencies = [ 487 | "futures-core", 488 | "futures-io", 489 | "futures-task", 490 | "memchr", 491 | "pin-project-lite", 492 | "pin-utils", 493 | "slab", 494 | ] 495 | 496 | [[package]] 497 | name = "getrandom" 498 | version = "0.2.2" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" 501 | dependencies = [ 502 | "cfg-if", 503 | "libc", 504 | "wasi", 505 | ] 506 | 507 | [[package]] 508 | name = "h2" 509 | version = "0.3.3" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726" 512 | dependencies = [ 513 | "bytes", 514 | "fnv", 515 | "futures-core", 516 | "futures-sink", 517 | "futures-util", 518 | "http", 519 | "indexmap", 520 | "slab", 521 | "tokio", 522 | "tokio-util", 523 | "tracing", 524 | ] 525 | 526 | [[package]] 527 | name = "hashbrown" 528 | version = "0.9.1" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" 531 | 532 | [[package]] 533 | name = "heck" 534 | version = "0.3.2" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" 537 | dependencies = [ 538 | "unicode-segmentation", 539 | ] 540 | 541 | [[package]] 542 | name = "hermit-abi" 543 | version = "0.1.18" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" 546 | dependencies = [ 547 | "libc", 548 | ] 549 | 550 | [[package]] 551 | name = "http" 552 | version = "0.2.4" 553 | source = "registry+https://github.com/rust-lang/crates.io-index" 554 | checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" 555 | dependencies = [ 556 | "bytes", 557 | "fnv", 558 | "itoa", 559 | ] 560 | 561 | [[package]] 562 | name = "http-body" 563 | version = "0.4.1" 564 | source = "registry+https://github.com/rust-lang/crates.io-index" 565 | checksum = "5dfb77c123b4e2f72a2069aeae0b4b4949cc7e966df277813fc16347e7549737" 566 | dependencies = [ 567 | "bytes", 568 | "http", 569 | "pin-project-lite", 570 | ] 571 | 572 | [[package]] 573 | name = "httparse" 574 | version = "1.4.0" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "4a1ce40d6fc9764887c2fdc7305c3dcc429ba11ff981c1509416afd5697e4437" 577 | 578 | [[package]] 579 | name = "httpdate" 580 | version = "1.0.0" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "05842d0d43232b23ccb7060ecb0f0626922c21f30012e97b767b30afd4a5d4b9" 583 | 584 | [[package]] 585 | name = "hyper" 586 | version = "0.14.7" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "1e5f105c494081baa3bf9e200b279e27ec1623895cd504c7dbef8d0b080fcf54" 589 | dependencies = [ 590 | "bytes", 591 | "futures-channel", 592 | "futures-core", 593 | "futures-util", 594 | "h2", 595 | "http", 596 | "http-body", 597 | "httparse", 598 | "httpdate", 599 | "itoa", 600 | "pin-project", 601 | "socket2", 602 | "tokio", 603 | "tower-service", 604 | "tracing", 605 | "want", 606 | ] 607 | 608 | [[package]] 609 | name = "hyper-tls" 610 | version = "0.5.0" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 613 | dependencies = [ 614 | "bytes", 615 | "hyper", 616 | "native-tls", 617 | "tokio", 618 | "tokio-native-tls", 619 | ] 620 | 621 | [[package]] 622 | name = "ident_case" 623 | version = "1.0.1" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 626 | 627 | [[package]] 628 | name = "idna" 629 | version = "0.2.3" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 632 | dependencies = [ 633 | "matches", 634 | "unicode-bidi", 635 | "unicode-normalization", 636 | ] 637 | 638 | [[package]] 639 | name = "indexmap" 640 | version = "1.6.2" 641 | source = "registry+https://github.com/rust-lang/crates.io-index" 642 | checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" 643 | dependencies = [ 644 | "autocfg", 645 | "hashbrown", 646 | ] 647 | 648 | [[package]] 649 | name = "ipnet" 650 | version = "2.3.0" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" 653 | 654 | [[package]] 655 | name = "itoa" 656 | version = "0.4.7" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" 659 | 660 | [[package]] 661 | name = "js-sys" 662 | version = "0.3.50" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "2d99f9e3e84b8f67f846ef5b4cbbc3b1c29f6c759fcbce6f01aa0e73d932a24c" 665 | dependencies = [ 666 | "wasm-bindgen", 667 | ] 668 | 669 | [[package]] 670 | name = "lazy_static" 671 | version = "1.4.0" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 674 | 675 | [[package]] 676 | name = "libc" 677 | version = "0.2.94" 678 | source = "registry+https://github.com/rust-lang/crates.io-index" 679 | checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" 680 | 681 | [[package]] 682 | name = "log" 683 | version = "0.4.14" 684 | source = "registry+https://github.com/rust-lang/crates.io-index" 685 | checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" 686 | dependencies = [ 687 | "cfg-if", 688 | ] 689 | 690 | [[package]] 691 | name = "maplit" 692 | version = "1.0.2" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" 695 | 696 | [[package]] 697 | name = "matches" 698 | version = "0.1.8" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 701 | 702 | [[package]] 703 | name = "memchr" 704 | version = "2.3.4" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" 707 | 708 | [[package]] 709 | name = "mime" 710 | version = "0.3.16" 711 | source = "registry+https://github.com/rust-lang/crates.io-index" 712 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 713 | 714 | [[package]] 715 | name = "mio" 716 | version = "0.7.11" 717 | source = "registry+https://github.com/rust-lang/crates.io-index" 718 | checksum = "cf80d3e903b34e0bd7282b218398aec54e082c840d9baf8339e0080a0c542956" 719 | dependencies = [ 720 | "libc", 721 | "log", 722 | "miow", 723 | "ntapi", 724 | "winapi", 725 | ] 726 | 727 | [[package]] 728 | name = "miow" 729 | version = "0.3.7" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" 732 | dependencies = [ 733 | "winapi", 734 | ] 735 | 736 | [[package]] 737 | name = "native-tls" 738 | version = "0.2.7" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" 741 | dependencies = [ 742 | "lazy_static", 743 | "libc", 744 | "log", 745 | "openssl", 746 | "openssl-probe", 747 | "openssl-sys", 748 | "schannel", 749 | "security-framework", 750 | "security-framework-sys", 751 | "tempfile", 752 | ] 753 | 754 | [[package]] 755 | name = "ncurses" 756 | version = "5.101.0" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "5e2c5d34d72657dc4b638a1c25d40aae81e4f1c699062f72f467237920752032" 759 | dependencies = [ 760 | "cc", 761 | "libc", 762 | "pkg-config", 763 | ] 764 | 765 | [[package]] 766 | name = "ntapi" 767 | version = "0.3.6" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" 770 | dependencies = [ 771 | "winapi", 772 | ] 773 | 774 | [[package]] 775 | name = "num" 776 | version = "0.3.1" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" 779 | dependencies = [ 780 | "num-complex 0.3.1", 781 | "num-integer", 782 | "num-iter", 783 | "num-rational 0.3.2", 784 | "num-traits", 785 | ] 786 | 787 | [[package]] 788 | name = "num" 789 | version = "0.4.0" 790 | source = "registry+https://github.com/rust-lang/crates.io-index" 791 | checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" 792 | dependencies = [ 793 | "num-complex 0.4.0", 794 | "num-integer", 795 | "num-iter", 796 | "num-rational 0.4.0", 797 | "num-traits", 798 | ] 799 | 800 | [[package]] 801 | name = "num-complex" 802 | version = "0.3.1" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" 805 | dependencies = [ 806 | "num-traits", 807 | ] 808 | 809 | [[package]] 810 | name = "num-complex" 811 | version = "0.4.0" 812 | source = "registry+https://github.com/rust-lang/crates.io-index" 813 | checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085" 814 | dependencies = [ 815 | "num-traits", 816 | ] 817 | 818 | [[package]] 819 | name = "num-derive" 820 | version = "0.3.3" 821 | source = "registry+https://github.com/rust-lang/crates.io-index" 822 | checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" 823 | dependencies = [ 824 | "proc-macro2", 825 | "quote", 826 | "syn", 827 | ] 828 | 829 | [[package]] 830 | name = "num-integer" 831 | version = "0.1.44" 832 | source = "registry+https://github.com/rust-lang/crates.io-index" 833 | checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" 834 | dependencies = [ 835 | "autocfg", 836 | "num-traits", 837 | ] 838 | 839 | [[package]] 840 | name = "num-iter" 841 | version = "0.1.42" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" 844 | dependencies = [ 845 | "autocfg", 846 | "num-integer", 847 | "num-traits", 848 | ] 849 | 850 | [[package]] 851 | name = "num-rational" 852 | version = "0.3.2" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" 855 | dependencies = [ 856 | "autocfg", 857 | "num-integer", 858 | "num-traits", 859 | ] 860 | 861 | [[package]] 862 | name = "num-rational" 863 | version = "0.4.0" 864 | source = "registry+https://github.com/rust-lang/crates.io-index" 865 | checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a" 866 | dependencies = [ 867 | "autocfg", 868 | "num-integer", 869 | "num-traits", 870 | ] 871 | 872 | [[package]] 873 | name = "num-traits" 874 | version = "0.2.14" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" 877 | dependencies = [ 878 | "autocfg", 879 | ] 880 | 881 | [[package]] 882 | name = "num_cpus" 883 | version = "1.13.0" 884 | source = "registry+https://github.com/rust-lang/crates.io-index" 885 | checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" 886 | dependencies = [ 887 | "hermit-abi", 888 | "libc", 889 | ] 890 | 891 | [[package]] 892 | name = "once_cell" 893 | version = "1.7.2" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" 896 | 897 | [[package]] 898 | name = "openssl" 899 | version = "0.10.34" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | checksum = "6d7830286ad6a3973c0f1d9b73738f69c76b739301d0229c4b96501695cbe4c8" 902 | dependencies = [ 903 | "bitflags", 904 | "cfg-if", 905 | "foreign-types", 906 | "libc", 907 | "once_cell", 908 | "openssl-sys", 909 | ] 910 | 911 | [[package]] 912 | name = "openssl-probe" 913 | version = "0.1.2" 914 | source = "registry+https://github.com/rust-lang/crates.io-index" 915 | checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" 916 | 917 | [[package]] 918 | name = "openssl-sys" 919 | version = "0.9.62" 920 | source = "registry+https://github.com/rust-lang/crates.io-index" 921 | checksum = "fa52160d45fa2e7608d504b7c3a3355afed615e6d8b627a74458634ba21b69bd" 922 | dependencies = [ 923 | "autocfg", 924 | "cc", 925 | "libc", 926 | "pkg-config", 927 | "vcpkg", 928 | ] 929 | 930 | [[package]] 931 | name = "owning_ref" 932 | version = "0.4.1" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | checksum = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" 935 | dependencies = [ 936 | "stable_deref_trait", 937 | ] 938 | 939 | [[package]] 940 | name = "percent-encoding" 941 | version = "2.1.0" 942 | source = "registry+https://github.com/rust-lang/crates.io-index" 943 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 944 | 945 | [[package]] 946 | name = "pin-project" 947 | version = "1.0.7" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | checksum = "c7509cc106041c40a4518d2af7a61530e1eed0e6285296a3d8c5472806ccc4a4" 950 | dependencies = [ 951 | "pin-project-internal", 952 | ] 953 | 954 | [[package]] 955 | name = "pin-project-internal" 956 | version = "1.0.7" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f" 959 | dependencies = [ 960 | "proc-macro2", 961 | "quote", 962 | "syn", 963 | ] 964 | 965 | [[package]] 966 | name = "pin-project-lite" 967 | version = "0.2.6" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" 970 | 971 | [[package]] 972 | name = "pin-utils" 973 | version = "0.1.0" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 976 | 977 | [[package]] 978 | name = "pkg-config" 979 | version = "0.3.19" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" 982 | 983 | [[package]] 984 | name = "ppv-lite86" 985 | version = "0.2.10" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" 988 | 989 | [[package]] 990 | name = "proc-macro-error" 991 | version = "1.0.4" 992 | source = "registry+https://github.com/rust-lang/crates.io-index" 993 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 994 | dependencies = [ 995 | "proc-macro-error-attr", 996 | "proc-macro2", 997 | "quote", 998 | "syn", 999 | "version_check", 1000 | ] 1001 | 1002 | [[package]] 1003 | name = "proc-macro-error-attr" 1004 | version = "1.0.4" 1005 | source = "registry+https://github.com/rust-lang/crates.io-index" 1006 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1007 | dependencies = [ 1008 | "proc-macro2", 1009 | "quote", 1010 | "version_check", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "proc-macro2" 1015 | version = "1.0.26" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" 1018 | dependencies = [ 1019 | "unicode-xid", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "puppy" 1024 | version = "0.1.0" 1025 | dependencies = [ 1026 | "chrono", 1027 | "clap-verbosity-flag", 1028 | "combine", 1029 | "crossbeam-channel", 1030 | "cursive", 1031 | "cursive-aligned-view", 1032 | "fern", 1033 | "log", 1034 | "num-derive", 1035 | "num-traits", 1036 | "reqwest", 1037 | "rusty_v8", 1038 | "structopt", 1039 | "thiserror", 1040 | "unicode-width", 1041 | "url", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "quote" 1046 | version = "1.0.9" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" 1049 | dependencies = [ 1050 | "proc-macro2", 1051 | ] 1052 | 1053 | [[package]] 1054 | name = "rand" 1055 | version = "0.8.3" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" 1058 | dependencies = [ 1059 | "libc", 1060 | "rand_chacha", 1061 | "rand_core", 1062 | "rand_hc", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "rand_chacha" 1067 | version = "0.3.0" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" 1070 | dependencies = [ 1071 | "ppv-lite86", 1072 | "rand_core", 1073 | ] 1074 | 1075 | [[package]] 1076 | name = "rand_core" 1077 | version = "0.6.2" 1078 | source = "registry+https://github.com/rust-lang/crates.io-index" 1079 | checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 1080 | dependencies = [ 1081 | "getrandom", 1082 | ] 1083 | 1084 | [[package]] 1085 | name = "rand_hc" 1086 | version = "0.3.0" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" 1089 | dependencies = [ 1090 | "rand_core", 1091 | ] 1092 | 1093 | [[package]] 1094 | name = "redox_syscall" 1095 | version = "0.2.7" 1096 | source = "registry+https://github.com/rust-lang/crates.io-index" 1097 | checksum = "85dd92e586f7355c633911e11f77f3d12f04b1b1bd76a198bd34ae3af8341ef2" 1098 | dependencies = [ 1099 | "bitflags", 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "remove_dir_all" 1104 | version = "0.5.3" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 1107 | dependencies = [ 1108 | "winapi", 1109 | ] 1110 | 1111 | [[package]] 1112 | name = "reqwest" 1113 | version = "0.11.3" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "2296f2fac53979e8ccbc4a1136b25dcefd37be9ed7e4a1f6b05a6029c84ff124" 1116 | dependencies = [ 1117 | "base64", 1118 | "bytes", 1119 | "encoding_rs", 1120 | "futures-core", 1121 | "futures-util", 1122 | "http", 1123 | "http-body", 1124 | "hyper", 1125 | "hyper-tls", 1126 | "ipnet", 1127 | "js-sys", 1128 | "lazy_static", 1129 | "log", 1130 | "mime", 1131 | "native-tls", 1132 | "percent-encoding", 1133 | "pin-project-lite", 1134 | "serde", 1135 | "serde_urlencoded", 1136 | "tokio", 1137 | "tokio-native-tls", 1138 | "url", 1139 | "wasm-bindgen", 1140 | "wasm-bindgen-futures", 1141 | "web-sys", 1142 | "winreg", 1143 | ] 1144 | 1145 | [[package]] 1146 | name = "rusty_v8" 1147 | version = "0.22.1" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | checksum = "9e39f106a3e39e8d18bc7dcbd4d59ece79cd27f888c6d82e0c93aa56d4708fdd" 1150 | dependencies = [ 1151 | "bitflags", 1152 | "fslock", 1153 | "lazy_static", 1154 | "libc", 1155 | "which", 1156 | ] 1157 | 1158 | [[package]] 1159 | name = "ryu" 1160 | version = "1.0.5" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" 1163 | 1164 | [[package]] 1165 | name = "schannel" 1166 | version = "0.1.19" 1167 | source = "registry+https://github.com/rust-lang/crates.io-index" 1168 | checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" 1169 | dependencies = [ 1170 | "lazy_static", 1171 | "winapi", 1172 | ] 1173 | 1174 | [[package]] 1175 | name = "security-framework" 1176 | version = "2.2.0" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "3670b1d2fdf6084d192bc71ead7aabe6c06aa2ea3fbd9cc3ac111fa5c2b1bd84" 1179 | dependencies = [ 1180 | "bitflags", 1181 | "core-foundation", 1182 | "core-foundation-sys", 1183 | "libc", 1184 | "security-framework-sys", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "security-framework-sys" 1189 | version = "2.2.0" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "3676258fd3cfe2c9a0ec99ce3038798d847ce3e4bb17746373eb9f0f1ac16339" 1192 | dependencies = [ 1193 | "core-foundation-sys", 1194 | "libc", 1195 | ] 1196 | 1197 | [[package]] 1198 | name = "serde" 1199 | version = "1.0.125" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" 1202 | 1203 | [[package]] 1204 | name = "serde_json" 1205 | version = "1.0.64" 1206 | source = "registry+https://github.com/rust-lang/crates.io-index" 1207 | checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" 1208 | dependencies = [ 1209 | "itoa", 1210 | "ryu", 1211 | "serde", 1212 | ] 1213 | 1214 | [[package]] 1215 | name = "serde_urlencoded" 1216 | version = "0.7.0" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" 1219 | dependencies = [ 1220 | "form_urlencoded", 1221 | "itoa", 1222 | "ryu", 1223 | "serde", 1224 | ] 1225 | 1226 | [[package]] 1227 | name = "signal-hook" 1228 | version = "0.3.8" 1229 | source = "registry+https://github.com/rust-lang/crates.io-index" 1230 | checksum = "ef33d6d0cd06e0840fba9985aab098c147e67e05cee14d412d3345ed14ff30ac" 1231 | dependencies = [ 1232 | "libc", 1233 | "signal-hook-registry", 1234 | ] 1235 | 1236 | [[package]] 1237 | name = "signal-hook-registry" 1238 | version = "1.3.0" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" 1241 | dependencies = [ 1242 | "libc", 1243 | ] 1244 | 1245 | [[package]] 1246 | name = "slab" 1247 | version = "0.4.3" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" 1250 | 1251 | [[package]] 1252 | name = "socket2" 1253 | version = "0.4.0" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" 1256 | dependencies = [ 1257 | "libc", 1258 | "winapi", 1259 | ] 1260 | 1261 | [[package]] 1262 | name = "stable_deref_trait" 1263 | version = "1.2.0" 1264 | source = "registry+https://github.com/rust-lang/crates.io-index" 1265 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1266 | 1267 | [[package]] 1268 | name = "strsim" 1269 | version = "0.8.0" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 1272 | 1273 | [[package]] 1274 | name = "strsim" 1275 | version = "0.9.3" 1276 | source = "registry+https://github.com/rust-lang/crates.io-index" 1277 | checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" 1278 | 1279 | [[package]] 1280 | name = "strsim" 1281 | version = "0.10.0" 1282 | source = "registry+https://github.com/rust-lang/crates.io-index" 1283 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1284 | 1285 | [[package]] 1286 | name = "structopt" 1287 | version = "0.3.21" 1288 | source = "registry+https://github.com/rust-lang/crates.io-index" 1289 | checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c" 1290 | dependencies = [ 1291 | "clap", 1292 | "lazy_static", 1293 | "structopt-derive", 1294 | ] 1295 | 1296 | [[package]] 1297 | name = "structopt-derive" 1298 | version = "0.4.14" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90" 1301 | dependencies = [ 1302 | "heck", 1303 | "proc-macro-error", 1304 | "proc-macro2", 1305 | "quote", 1306 | "syn", 1307 | ] 1308 | 1309 | [[package]] 1310 | name = "syn" 1311 | version = "1.0.71" 1312 | source = "registry+https://github.com/rust-lang/crates.io-index" 1313 | checksum = "ad184cc9470f9117b2ac6817bfe297307418819ba40552f9b3846f05c33d5373" 1314 | dependencies = [ 1315 | "proc-macro2", 1316 | "quote", 1317 | "unicode-xid", 1318 | ] 1319 | 1320 | [[package]] 1321 | name = "tempfile" 1322 | version = "3.2.0" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" 1325 | dependencies = [ 1326 | "cfg-if", 1327 | "libc", 1328 | "rand", 1329 | "redox_syscall", 1330 | "remove_dir_all", 1331 | "winapi", 1332 | ] 1333 | 1334 | [[package]] 1335 | name = "term_size" 1336 | version = "0.3.2" 1337 | source = "registry+https://github.com/rust-lang/crates.io-index" 1338 | checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" 1339 | dependencies = [ 1340 | "libc", 1341 | "winapi", 1342 | ] 1343 | 1344 | [[package]] 1345 | name = "textwrap" 1346 | version = "0.11.0" 1347 | source = "registry+https://github.com/rust-lang/crates.io-index" 1348 | checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 1349 | dependencies = [ 1350 | "unicode-width", 1351 | ] 1352 | 1353 | [[package]] 1354 | name = "thiserror" 1355 | version = "1.0.24" 1356 | source = "registry+https://github.com/rust-lang/crates.io-index" 1357 | checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" 1358 | dependencies = [ 1359 | "thiserror-impl", 1360 | ] 1361 | 1362 | [[package]] 1363 | name = "thiserror-impl" 1364 | version = "1.0.24" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" 1367 | dependencies = [ 1368 | "proc-macro2", 1369 | "quote", 1370 | "syn", 1371 | ] 1372 | 1373 | [[package]] 1374 | name = "time" 1375 | version = "0.1.44" 1376 | source = "registry+https://github.com/rust-lang/crates.io-index" 1377 | checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" 1378 | dependencies = [ 1379 | "libc", 1380 | "wasi", 1381 | "winapi", 1382 | ] 1383 | 1384 | [[package]] 1385 | name = "tinyvec" 1386 | version = "1.2.0" 1387 | source = "registry+https://github.com/rust-lang/crates.io-index" 1388 | checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" 1389 | dependencies = [ 1390 | "tinyvec_macros", 1391 | ] 1392 | 1393 | [[package]] 1394 | name = "tinyvec_macros" 1395 | version = "0.1.0" 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" 1397 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 1398 | 1399 | [[package]] 1400 | name = "tokio" 1401 | version = "1.5.0" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "83f0c8e7c0addab50b663055baf787d0af7f413a46e6e7fb9559a4e4db7137a5" 1404 | dependencies = [ 1405 | "autocfg", 1406 | "bytes", 1407 | "libc", 1408 | "memchr", 1409 | "mio", 1410 | "num_cpus", 1411 | "pin-project-lite", 1412 | ] 1413 | 1414 | [[package]] 1415 | name = "tokio-native-tls" 1416 | version = "0.3.0" 1417 | source = "registry+https://github.com/rust-lang/crates.io-index" 1418 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 1419 | dependencies = [ 1420 | "native-tls", 1421 | "tokio", 1422 | ] 1423 | 1424 | [[package]] 1425 | name = "tokio-util" 1426 | version = "0.6.6" 1427 | source = "registry+https://github.com/rust-lang/crates.io-index" 1428 | checksum = "940a12c99365c31ea8dd9ba04ec1be183ffe4920102bb7122c2f515437601e8e" 1429 | dependencies = [ 1430 | "bytes", 1431 | "futures-core", 1432 | "futures-sink", 1433 | "log", 1434 | "pin-project-lite", 1435 | "tokio", 1436 | ] 1437 | 1438 | [[package]] 1439 | name = "tower-service" 1440 | version = "0.3.1" 1441 | source = "registry+https://github.com/rust-lang/crates.io-index" 1442 | checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" 1443 | 1444 | [[package]] 1445 | name = "tracing" 1446 | version = "0.1.25" 1447 | source = "registry+https://github.com/rust-lang/crates.io-index" 1448 | checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" 1449 | dependencies = [ 1450 | "cfg-if", 1451 | "pin-project-lite", 1452 | "tracing-core", 1453 | ] 1454 | 1455 | [[package]] 1456 | name = "tracing-core" 1457 | version = "0.1.17" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" 1460 | dependencies = [ 1461 | "lazy_static", 1462 | ] 1463 | 1464 | [[package]] 1465 | name = "try-lock" 1466 | version = "0.2.3" 1467 | source = "registry+https://github.com/rust-lang/crates.io-index" 1468 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 1469 | 1470 | [[package]] 1471 | name = "unicode-bidi" 1472 | version = "0.3.5" 1473 | source = "registry+https://github.com/rust-lang/crates.io-index" 1474 | checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" 1475 | dependencies = [ 1476 | "matches", 1477 | ] 1478 | 1479 | [[package]] 1480 | name = "unicode-normalization" 1481 | version = "0.1.17" 1482 | source = "registry+https://github.com/rust-lang/crates.io-index" 1483 | checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" 1484 | dependencies = [ 1485 | "tinyvec", 1486 | ] 1487 | 1488 | [[package]] 1489 | name = "unicode-segmentation" 1490 | version = "1.7.1" 1491 | source = "registry+https://github.com/rust-lang/crates.io-index" 1492 | checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" 1493 | 1494 | [[package]] 1495 | name = "unicode-width" 1496 | version = "0.1.8" 1497 | source = "registry+https://github.com/rust-lang/crates.io-index" 1498 | checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" 1499 | 1500 | [[package]] 1501 | name = "unicode-xid" 1502 | version = "0.2.1" 1503 | source = "registry+https://github.com/rust-lang/crates.io-index" 1504 | checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" 1505 | 1506 | [[package]] 1507 | name = "url" 1508 | version = "2.2.1" 1509 | source = "registry+https://github.com/rust-lang/crates.io-index" 1510 | checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b" 1511 | dependencies = [ 1512 | "form_urlencoded", 1513 | "idna", 1514 | "matches", 1515 | "percent-encoding", 1516 | ] 1517 | 1518 | [[package]] 1519 | name = "vcpkg" 1520 | version = "0.2.12" 1521 | source = "registry+https://github.com/rust-lang/crates.io-index" 1522 | checksum = "cbdbff6266a24120518560b5dc983096efb98462e51d0d68169895b237be3e5d" 1523 | 1524 | [[package]] 1525 | name = "vec_map" 1526 | version = "0.8.2" 1527 | source = "registry+https://github.com/rust-lang/crates.io-index" 1528 | checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 1529 | 1530 | [[package]] 1531 | name = "version_check" 1532 | version = "0.9.3" 1533 | source = "registry+https://github.com/rust-lang/crates.io-index" 1534 | checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" 1535 | 1536 | [[package]] 1537 | name = "want" 1538 | version = "0.3.0" 1539 | source = "registry+https://github.com/rust-lang/crates.io-index" 1540 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1541 | dependencies = [ 1542 | "log", 1543 | "try-lock", 1544 | ] 1545 | 1546 | [[package]] 1547 | name = "wasi" 1548 | version = "0.10.0+wasi-snapshot-preview1" 1549 | source = "registry+https://github.com/rust-lang/crates.io-index" 1550 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" 1551 | 1552 | [[package]] 1553 | name = "wasm-bindgen" 1554 | version = "0.2.73" 1555 | source = "registry+https://github.com/rust-lang/crates.io-index" 1556 | checksum = "83240549659d187488f91f33c0f8547cbfef0b2088bc470c116d1d260ef623d9" 1557 | dependencies = [ 1558 | "cfg-if", 1559 | "serde", 1560 | "serde_json", 1561 | "wasm-bindgen-macro", 1562 | ] 1563 | 1564 | [[package]] 1565 | name = "wasm-bindgen-backend" 1566 | version = "0.2.73" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | checksum = "ae70622411ca953215ca6d06d3ebeb1e915f0f6613e3b495122878d7ebec7dae" 1569 | dependencies = [ 1570 | "bumpalo", 1571 | "lazy_static", 1572 | "log", 1573 | "proc-macro2", 1574 | "quote", 1575 | "syn", 1576 | "wasm-bindgen-shared", 1577 | ] 1578 | 1579 | [[package]] 1580 | name = "wasm-bindgen-futures" 1581 | version = "0.4.23" 1582 | source = "registry+https://github.com/rust-lang/crates.io-index" 1583 | checksum = "81b8b767af23de6ac18bf2168b690bed2902743ddf0fb39252e36f9e2bfc63ea" 1584 | dependencies = [ 1585 | "cfg-if", 1586 | "js-sys", 1587 | "wasm-bindgen", 1588 | "web-sys", 1589 | ] 1590 | 1591 | [[package]] 1592 | name = "wasm-bindgen-macro" 1593 | version = "0.2.73" 1594 | source = "registry+https://github.com/rust-lang/crates.io-index" 1595 | checksum = "3e734d91443f177bfdb41969de821e15c516931c3c3db3d318fa1b68975d0f6f" 1596 | dependencies = [ 1597 | "quote", 1598 | "wasm-bindgen-macro-support", 1599 | ] 1600 | 1601 | [[package]] 1602 | name = "wasm-bindgen-macro-support" 1603 | version = "0.2.73" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | checksum = "d53739ff08c8a68b0fdbcd54c372b8ab800b1449ab3c9d706503bc7dd1621b2c" 1606 | dependencies = [ 1607 | "proc-macro2", 1608 | "quote", 1609 | "syn", 1610 | "wasm-bindgen-backend", 1611 | "wasm-bindgen-shared", 1612 | ] 1613 | 1614 | [[package]] 1615 | name = "wasm-bindgen-shared" 1616 | version = "0.2.73" 1617 | source = "registry+https://github.com/rust-lang/crates.io-index" 1618 | checksum = "d9a543ae66aa233d14bb765ed9af4a33e81b8b58d1584cf1b47ff8cd0b9e4489" 1619 | 1620 | [[package]] 1621 | name = "wasmer_enumset" 1622 | version = "1.0.1" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | checksum = "cf088cc1f7d247fd96dff0df46fb1bbb747d8a69ae1ecd71aed55c55e354b2d8" 1625 | dependencies = [ 1626 | "num-traits", 1627 | "wasmer_enumset_derive", 1628 | ] 1629 | 1630 | [[package]] 1631 | name = "wasmer_enumset_derive" 1632 | version = "0.5.0" 1633 | source = "registry+https://github.com/rust-lang/crates.io-index" 1634 | checksum = "a8d1b32d98e11194200baf6d3f85eb2d6cfe56f6d9af0dd617f90ca48f958a88" 1635 | dependencies = [ 1636 | "darling 0.10.2", 1637 | "proc-macro2", 1638 | "quote", 1639 | "syn", 1640 | ] 1641 | 1642 | [[package]] 1643 | name = "web-sys" 1644 | version = "0.3.50" 1645 | source = "registry+https://github.com/rust-lang/crates.io-index" 1646 | checksum = "a905d57e488fec8861446d3393670fb50d27a262344013181c2cdf9fff5481be" 1647 | dependencies = [ 1648 | "js-sys", 1649 | "wasm-bindgen", 1650 | ] 1651 | 1652 | [[package]] 1653 | name = "which" 1654 | version = "4.1.0" 1655 | source = "registry+https://github.com/rust-lang/crates.io-index" 1656 | checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" 1657 | dependencies = [ 1658 | "either", 1659 | "libc", 1660 | ] 1661 | 1662 | [[package]] 1663 | name = "winapi" 1664 | version = "0.3.9" 1665 | source = "registry+https://github.com/rust-lang/crates.io-index" 1666 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1667 | dependencies = [ 1668 | "winapi-i686-pc-windows-gnu", 1669 | "winapi-x86_64-pc-windows-gnu", 1670 | ] 1671 | 1672 | [[package]] 1673 | name = "winapi-i686-pc-windows-gnu" 1674 | version = "0.4.0" 1675 | source = "registry+https://github.com/rust-lang/crates.io-index" 1676 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1677 | 1678 | [[package]] 1679 | name = "winapi-x86_64-pc-windows-gnu" 1680 | version = "0.4.0" 1681 | source = "registry+https://github.com/rust-lang/crates.io-index" 1682 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1683 | 1684 | [[package]] 1685 | name = "winreg" 1686 | version = "0.7.0" 1687 | source = "registry+https://github.com/rust-lang/crates.io-index" 1688 | checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" 1689 | dependencies = [ 1690 | "winapi", 1691 | ] 1692 | 1693 | [[package]] 1694 | name = "xi-unicode" 1695 | version = "0.3.0" 1696 | source = "registry+https://github.com/rust-lang/crates.io-index" 1697 | checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" 1698 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "puppy" 3 | version = "0.1.0" 4 | authors = ["Takashi Yoneuchi "] 5 | edition = "2018" 6 | 7 | [[bin]] 8 | name = "puppy" 9 | test = false 10 | bench = false 11 | 12 | [dependencies] 13 | log = "0.4" 14 | fern = "0.5" 15 | chrono = "0.4" 16 | clap-verbosity-flag = "0.3.1" 17 | structopt = "0.3.21" 18 | thiserror = "1.0" 19 | combine = "4.5.2" 20 | cursive = { git = "https://github.com/gyscos/cursive" } 21 | cursive-aligned-view = "0.4.0" 22 | num-traits = "0.2" 23 | num-derive = "0.3" 24 | url = "2.2.1" 25 | reqwest = { version = "0.11", features = ["blocking"] } 26 | unicode-width = "0.1.8" 27 | rusty_v8 = "0.22.1" 28 | crossbeam-channel = "0.5.1" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Takashi Yoneuchi 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # puppy 2 | 3 | [![Run tests](https://github.com/lmt-swallow/puppy/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/lmt-swallow/puppy/actions/workflows/test.yml) [![Run lint](https://github.com/lmt-swallow/puppy/actions/workflows/lint.yml/badge.svg?branch=main)](https://github.com/lmt-swallow/puppy/actions/workflows/lint.yml) 4 | 5 | `puppy` is an example implementation of a tiny Web browser for educational purposes. 6 | 7 | ![puppy-browser](./docs/images/puppy-browser.png) 8 | 9 | ## How to run puppy locally 10 | 11 | You can run puppy program with the following command(s): 12 | 13 | ```sh 14 | cargo run -- help 15 | ``` 16 | 17 | ## How to install puppy 18 | 19 | You can install puppy by the following command(s): 20 | 21 | ```sh 22 | cargo install --locked --path . --force 23 | ``` 24 | 25 | After you have successfully installed puppy, you can see help as follows: 26 | 27 | ```sh 28 | puppy help 29 | ``` 30 | 31 | You can install shell completions as follows: 32 | 33 | ```sh 34 | # in bash 35 | eval "$(puppy completion bash)" 36 | 37 | # in fish 38 | puppy completion fish | source 39 | ``` 40 | 41 | ## How to run tests locally 42 | 43 | You can run tests with the following command(s): 44 | 45 | ```sh 46 | cargo test 47 | ``` 48 | 49 | ## How to speed up build process 50 | 51 | You can cache files related to V8 as follows: 52 | 53 | ```bash 54 | $ export RUSTY_V8_MIRROR=$HOME/.cache/rusty_v8 55 | (...omitted...) 56 | $ ./scripts/prepare-v8.sh 57 | (...omitted...) 58 | $ cargo build 59 | (...omitted...) 60 | ``` 61 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Documentations 2 | 3 | This directory has the following documentations on puppy or on puppy development: 4 | 5 | - [Set Up Your Develop Environment](./setup-dev.md) 6 | - [How to Release](./how-to-release.md) 7 | -------------------------------------------------------------------------------- /docs/how-to-release.md: -------------------------------------------------------------------------------- 1 | # How to Release 2 | 3 | Please run the following commands to release new versions. 4 | 5 | ```sh 6 | cargo install cargo-release # run this just once 7 | cargo release 8 | ``` 9 | -------------------------------------------------------------------------------- /docs/images/puppy-browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lmt-swallow/puppy-browser/e6746a87cfc74f46ffafaf7a7cc8e8fdd96757d3/docs/images/puppy-browser.png -------------------------------------------------------------------------------- /docs/setup-dev.md: -------------------------------------------------------------------------------- 1 | # Set Up Your Develop Environment 2 | 3 | We assume you use the following tools: 4 | 5 | - [Visual Studio Code](https://code.visualstudio.com/) with [recommended extensions](../.vscode/extensions.json) installed 6 | - a stable version of [Rust](https://www.rust-lang.org/) installed by [rustup](https://rustup.rs/) 7 | -------------------------------------------------------------------------------- /examples/dom.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

not clicked yet

4 |
5 |
6 | 8 |
9 |
10 |

(inline p0)

11 |
12 |
13 |

(inline p1)

14 |
15 | 16 |
17 | 18 |
19 | 20 | 37 | -------------------------------------------------------------------------------- /examples/jump.html: -------------------------------------------------------------------------------- 1 | This is jump.html. -------------------------------------------------------------------------------- /examples/sample.html: -------------------------------------------------------------------------------- 1 |
2 |

This is an example page for puppy.

3 |

You can use a tags: Go to jump.html.

4 |
5 |

You can use div tags like this.

6 |
7 |
8 |
9 |

Forms:

10 |
11 | 12 | 13 |
14 | 15 | 21 |
-------------------------------------------------------------------------------- /scripts/prepare-v8.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # [NOTE] This script is from: https://github.com/denoland/rusty_v8 3 | # Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. 4 | # LICENSE: https://github.com/denoland/rusty_v8/blob/main/LICENSE 5 | 6 | for REL in v0.13.0 v0.12.0; do 7 | mkdir -p $RUSTY_V8_MIRROR/$REL 8 | for FILE in \ 9 | librusty_v8_debug_x86_64-unknown-linux-gnu.a \ 10 | librusty_v8_release_x86_64-unknown-linux-gnu.a \ 11 | ; do 12 | if [ ! -f $RUSTY_V8_MIRROR/$REL/$FILE ]; then 13 | wget -O $RUSTY_V8_MIRROR/$REL/$FILE \ 14 | https://github.com/denoland/rusty_v8/releases/download/$REL/$FILE 15 | fi 16 | done 17 | done -------------------------------------------------------------------------------- /src/cli.rs: -------------------------------------------------------------------------------- 1 | //! This module includes some sub-modules to provide command-line interface of puppy. 2 | 3 | pub mod opts; 4 | pub use self::opts::*; 5 | 6 | pub mod logger; 7 | pub mod subcommand; 8 | -------------------------------------------------------------------------------- /src/cli/logger.rs: -------------------------------------------------------------------------------- 1 | //! This module defines loggers for `puppy` command. 2 | 3 | use log::Level; 4 | 5 | /// `setup_logger` initializes a logger with the given log level for CLI. 6 | pub fn setup_logger(level: Level) -> Result<(), fern::InitError> { 7 | fern::Dispatch::new() 8 | .format(|out, message, record| { 9 | out.finish(format_args!( 10 | "{}[{}][{}] {}", 11 | chrono::Local::now().format("[%Y-%m-%d][%H:%M:%S]"), 12 | record.target(), 13 | record.level(), 14 | message 15 | )) 16 | }) 17 | .level(level.to_level_filter()) 18 | .chain(std::io::stdout()) 19 | .apply()?; 20 | Ok(()) 21 | } 22 | -------------------------------------------------------------------------------- /src/cli/opts.rs: -------------------------------------------------------------------------------- 1 | //! This module defines options of `puppy` command. 2 | 3 | use super::subcommand::*; 4 | use clap_verbosity_flag::Verbosity; 5 | use structopt::StructOpt; 6 | 7 | #[derive(StructOpt, Debug)] 8 | pub struct Opts { 9 | #[structopt(flatten)] 10 | pub common_opts: CommonOpts, 11 | 12 | #[structopt(subcommand)] 13 | pub sub_command: SubCommand, 14 | } 15 | 16 | #[derive(StructOpt, Debug)] 17 | pub struct CommonOpts { 18 | #[structopt(flatten)] 19 | pub verbose: Verbosity, 20 | } 21 | 22 | #[derive(StructOpt, Debug)] 23 | pub enum SubCommand { 24 | Open(open::Opts), 25 | Completion(completion::Opts), 26 | #[structopt(name = "js")] 27 | JavaScript, 28 | } 29 | -------------------------------------------------------------------------------- /src/cli/subcommand.rs: -------------------------------------------------------------------------------- 1 | //! This module defines subcommands of `puppy` command. 2 | 3 | pub mod completion; 4 | pub mod javascript; 5 | pub mod open; 6 | -------------------------------------------------------------------------------- /src/cli/subcommand/completion.rs: -------------------------------------------------------------------------------- 1 | //! This module defines `completion` subcommand. 2 | 3 | use std::io; 4 | use structopt::clap::Shell; 5 | use structopt::StructOpt; 6 | 7 | use crate::cli::CommonOpts; 8 | 9 | /// `Opts` defines possible options for the `completion` subcommand. 10 | #[derive(StructOpt, Debug)] 11 | pub enum Opts { 12 | Zsh, 13 | Bash, 14 | Fish, 15 | } 16 | 17 | /// `run` emits a completion script for some shell environments. 18 | pub fn run(_common_opts: CommonOpts, opts: Opts) -> i32 { 19 | match opts { 20 | Opts::Bash => completion(Shell::Bash), 21 | Opts::Zsh => completion(Shell::Zsh), 22 | Opts::Fish => completion(Shell::Fish), 23 | }; 24 | 25 | return 0; 26 | } 27 | 28 | fn completion(s: Shell) { 29 | super::super::Opts::clap().gen_completions_to(env!("CARGO_PKG_NAME"), s, &mut io::stdout()) 30 | } 31 | -------------------------------------------------------------------------------- /src/cli/subcommand/javascript.rs: -------------------------------------------------------------------------------- 1 | //! This module defines `javascript` subcommand. 2 | 3 | use crate::{ 4 | cli::{logger, CommonOpts}, 5 | javascript::JavaScriptRuntime, 6 | }; 7 | use std::io::{self, Write}; 8 | 9 | /// `run` launches an JS interpreter with V8. 10 | pub fn run(common_opts: CommonOpts) -> i32 { 11 | if let Some(level) = common_opts.verbose.log_level() { 12 | logger::setup_logger(level).unwrap(); 13 | } 14 | 15 | let mut runtime = JavaScriptRuntime::new(); 16 | 17 | loop { 18 | print!("> "); 19 | io::stdout().flush().unwrap(); 20 | 21 | let mut buf = String::new(); 22 | match io::stdin().read_line(&mut buf) { 23 | Ok(n) => { 24 | if n == 0 { 25 | println!(); 26 | return 0; 27 | } 28 | 29 | match runtime.execute("(shell)", &buf) { 30 | Ok(message) => println!("{}", message), 31 | Err(e) => eprintln!("{}", e), 32 | } 33 | } 34 | Err(error) => println!("error: {}", error), 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/cli/subcommand/open.rs: -------------------------------------------------------------------------------- 1 | //! This module defines `open` subcommand. 2 | 3 | use std::{env, rc::Rc}; 4 | 5 | use crate::{ 6 | cli::CommonOpts, 7 | tui::{init_menu, setup_logger, BrowserView}, 8 | util, 9 | }; 10 | 11 | use structopt::StructOpt; 12 | 13 | /// `Opts` defines options for the `open` subcommand. 14 | #[derive(StructOpt, Debug)] 15 | pub struct Opts { 16 | pub url: Option, 17 | } 18 | 19 | /// `run` launches a TUI window to show the main UI. 20 | pub fn run(common_opts: CommonOpts, opts: Opts) -> i32 { 21 | let start_url = opts 22 | .url 23 | .and_then(|u| Some(util::normalize_fileurl_with(env::current_dir().unwrap(), u))) 24 | .unwrap_or("http://example.com".to_string()); 25 | 26 | // set up base 27 | let mut siv = cursive::default(); 28 | init_menu(&mut siv); 29 | 30 | // set up logger 31 | if let Some(level) = common_opts.verbose.log_level() { 32 | setup_logger(level); 33 | } 34 | 35 | // prepare a window 36 | let mut b = BrowserView::named(Rc::new(siv.cb_sink().clone())); 37 | b.get_mut().navigate_to(start_url); 38 | siv.add_fullscreen_layer(b); 39 | 40 | // start event loop 41 | siv.run(); 42 | 43 | // exit successfully after the event loop finishes 44 | return 0; 45 | } 46 | -------------------------------------------------------------------------------- /src/core.rs: -------------------------------------------------------------------------------- 1 | //! This module includes core implementations of puppy. 2 | 3 | pub mod css; 4 | pub mod dom; 5 | pub mod fetch; 6 | pub mod html; 7 | pub mod layout; 8 | pub mod style; 9 | pub mod url; 10 | pub mod window; 11 | -------------------------------------------------------------------------------- /src/core/css.rs: -------------------------------------------------------------------------------- 1 | //! This module includes some implementations on Cascade Style Sheets (CSS). 2 | 3 | use super::dom::{Node, NodeType}; 4 | use combine::{ 5 | choice, 6 | error::StreamError, 7 | error::StringStreamError, 8 | many, many1, optional, 9 | parser::char::{self, letter, newline, space}, 10 | sep_by, sep_end_by, ParseError, Parser, Stream, 11 | }; 12 | use thiserror::Error; 13 | 14 | /// `Stylesheet` represents a single stylesheet. 15 | /// It consists of multiple rules, which are called "rule-list" in the standard (https://www.w3.org/TR/css-syntax-3/). 16 | #[derive(Debug, PartialEq)] 17 | pub struct Stylesheet { 18 | pub rules: Vec, 19 | } 20 | 21 | impl Stylesheet { 22 | pub fn new(rules: Vec) -> Self { 23 | Stylesheet { rules: rules } 24 | } 25 | } 26 | 27 | /// `Rule` represents a single CSS rule. 28 | /// - *at-rule* such as `@font-face (...)`. it is defined at https://www.w3.org/TR/css-syntax-3/#at-rule 29 | /// - *qualified rule* such as `h1 { .... }`. it is defined at https://www.w3.org/TR/css-syntax-3/#qualified-rule 30 | #[derive(Debug, PartialEq)] 31 | pub struct Rule { 32 | pub selectors: Vec, 33 | pub declarations: Vec, 34 | } 35 | 36 | impl Rule { 37 | pub fn matches(&self, n: &Box) -> bool { 38 | self.selectors.iter().any(|s| s.matches(n)) 39 | } 40 | } 41 | 42 | /// `Selector` represents a sequence of simple selectors separated by combinators. 43 | /// `div > p`, for instance, is a sequence two simple selectors; "div" and "p" is concatenated with combinator ">". 44 | /// 45 | /// However, handling this type of sequences is too hard & boring. 46 | /// puppy does not support the combination of selectors. In puppy, slector is just a simple slector, not a sequence of simple selectors. 47 | /// TODO (enhancement): make this compliant to the standard! 48 | pub type Selector = SimpleSelector; 49 | 50 | /// `SimpleSelector` represents a simple selector defined in the following standard: 51 | /// https://www.w3.org/TR/selectors-3/#selector-syntax 52 | #[derive(Debug, PartialEq)] 53 | pub enum SimpleSelector { 54 | UniversalSelector, 55 | TypeSelector { 56 | tag_name: String, 57 | }, 58 | AttributeSelector { 59 | tag_name: String, 60 | op: AttributeSelectorOp, 61 | attribute: String, 62 | value: String, 63 | }, 64 | ClassSelector { 65 | class_name: String, 66 | }, 67 | // TODO (enhancement): support multiple attribute selectors like `a[href=bar][ping=foo]` 68 | // TODO (enhancement): support more attribute selectors 69 | } 70 | 71 | impl SimpleSelector { 72 | pub fn matches(&self, n: &Box) -> bool { 73 | match self { 74 | SimpleSelector::UniversalSelector => true, 75 | SimpleSelector::TypeSelector { tag_name } => match n.node_type { 76 | NodeType::Element(ref e) => e.tag_name.as_str() == tag_name, 77 | _ => false, 78 | }, 79 | SimpleSelector::AttributeSelector { 80 | tag_name, 81 | op, 82 | attribute, 83 | value, 84 | } => match n.node_type { 85 | NodeType::Element(ref e) => { 86 | e.tag_name.as_str() == tag_name 87 | && match op { 88 | AttributeSelectorOp::Eq => e.attributes.get(attribute) == Some(value), 89 | AttributeSelectorOp::Contain => e 90 | .attributes 91 | .get(attribute) 92 | .map(|value| { 93 | value 94 | .split_ascii_whitespace() 95 | .find(|v| v == value) 96 | .is_some() 97 | }) 98 | .unwrap_or(false), 99 | } 100 | } 101 | _ => false, 102 | }, 103 | SimpleSelector::ClassSelector { class_name } => match n.node_type { 104 | NodeType::Element(ref e) => e.attributes.get("class") == Some(class_name), 105 | _ => false, 106 | }, 107 | } 108 | } 109 | } 110 | 111 | /// `AttributeSelectorOp` is an operator which is allowed to use. 112 | /// See https://www.w3.org/TR/selectors-3/#attribute-selectors to check the full list of available operators. 113 | #[derive(Debug, PartialEq)] 114 | pub enum AttributeSelectorOp { 115 | Eq, // = 116 | Contain, // ~= 117 | // TODO (enhancement): support more attribute selectors 118 | } 119 | 120 | /// `Declaration` represents a CSS declaration defined at [CSS Syntax Module Level 3](https://www.w3.org/TR/css-syntax-3/#declaration) 121 | /// 122 | /// Declarations are further categorized into the followings: 123 | /// - descriptors, which are mostly used in "at-rules" like `@foo (bar: piyo)` https://www.w3.org/Style/CSS/all-descriptors.en.html 124 | /// - properties, which are mostly used in "qualified rules" like `.foo {bar: piyo}` https://www.w3.org/Style/CSS/all-descriptors.en.html 125 | /// 126 | /// For simplicity, we handle two types of declarations together. 127 | #[derive(Debug, PartialEq)] 128 | pub struct Declaration { 129 | pub name: String, 130 | pub value: CSSValue, 131 | // TODO (enhancement): add a field for `!important` 132 | } 133 | 134 | /// `CSSValue` represents some of *component value types* defined at [CSS Values and Units Module Level 3](https://www.w3.org/TR/css-values-3/#component-types). 135 | #[derive(Debug, PartialEq, Clone)] 136 | pub enum CSSValue { 137 | Keyword(String), 138 | Length((usize, Unit)), 139 | } 140 | 141 | /// `Unit` describes *a relative length unit* defined at [CSS Values and Units Module Level 3](https://www.w3.org/TR/css-values-3/#lengths) 142 | #[derive(Debug, PartialEq, Clone)] 143 | pub enum Unit { 144 | Em, 145 | // TODO (enhancement): add more units here from the definition. 146 | } 147 | 148 | /// `CSSParseError` describes an error occured during CSS parsing. 149 | #[derive(Error, Debug, PartialEq)] 150 | pub enum CSSParseError { 151 | #[error("failed to parse; {0}")] 152 | InvalidResourceError(StringStreamError), 153 | } 154 | 155 | // [NOTE] Specification on CSS parsing https://www.w3.org/TR/css-syntax-3/#parsing-overview 156 | // 157 | // The specification defines parsing algorithm of HTML, which takes input stream as argument and emits DOM. 158 | // It consists of the following two stages: 159 | // 1. tokenization stage 160 | // 2. tree construction stage 161 | // The first one, tokenization stage, generates tokens from input stream. 162 | // The latter one, tree construction stage, constructs a DOM while handling scripts inside