diff --git a/.cargo/config.toml b/.cargo/config.toml index 1edba4192..c5dd2fbc4 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -126,3 +126,10 @@ ofl-fmt-project = "ofl fmt" clippy-ofl = "clippy --manifest-path ofl/Cargo.toml --workspace" test-ofl = "test --manifest-path ofl/Cargo.toml --workspace" docs-ofl = "doc --manifest-path ofl/Cargo.toml --workspace --no-deps" + +#################################################################################################### +# honk + +honk = "run --manifest-path honk/Cargo.toml --release --" +fmt-honk = "fmt --manifest-path honk/Cargo.toml" +honk-flow = "watch -w honk/src -w honk/Cargo.toml -w Cargo.toml -x fmt-honk -x honk" diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..32c8f3adb --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "python.formatting.provider": "black", + "editor.formatOnSave": true +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 2db8805c8..e52123006 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,5 +1,5 @@ { - // See https://go.microsoft.com/fwlink/?LinkId=733558 + // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ @@ -11,7 +11,7 @@ "panel": "dedicated" }, "runOptions": { - "runOn": "folderOpen" + // "runOn": "folderOpen" }, "isBackground": true, "command": "cargo", @@ -30,7 +30,7 @@ "panel": "dedicated" }, "runOptions": { - "runOn": "folderOpen" + // "runOn": "folderOpen" }, "isBackground": true, "command": "cargo", @@ -49,7 +49,7 @@ "panel": "dedicated" }, "runOptions": { - "runOn": "folderOpen" + // "runOn": "folderOpen" }, "isBackground": true, "command": "cargo", @@ -68,7 +68,7 @@ "panel": "dedicated" }, "runOptions": { - "runOn": "folderOpen" + // "runOn": "folderOpen" }, "isBackground": true, "command": "cargo", @@ -85,7 +85,7 @@ "panel": "dedicated" }, "runOptions": { - "runOn": "folderOpen" + // "runOn": "folderOpen" }, "isBackground": true, "command": "cargo", @@ -104,7 +104,7 @@ "panel": "dedicated" }, "runOptions": { - "runOn": "folderOpen" + // "runOn": "folderOpen" }, "isBackground": true, "command": "cargo", @@ -127,7 +127,7 @@ "panel": "dedicated" }, "runOptions": { - "runOn": "folderOpen" + // "runOn": "folderOpen" }, "isBackground": true, "command": "npx", @@ -141,4 +141,4 @@ "problemMatcher": [] } ] -} \ No newline at end of file +} diff --git a/Cargo.toml b/Cargo.toml index b29b63fbb..fb5b85b2b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,6 +52,7 @@ members = [ "topo/macro", ] exclude = [ + "honk", "ofl", ] diff --git a/WORKSPACE.honk b/WORKSPACE.honk new file mode 100644 index 000000000..91011b3d7 --- /dev/null +++ b/WORKSPACE.honk @@ -0,0 +1,5 @@ +load("//honk/rules/cargo/workspace.honk", "cargo_workspace") + +cargo_workspace(manifest="//Cargo.toml") + +# TODO specify website construction & HTTP server diff --git a/dom/Cargo.toml b/dom/Cargo.toml index 9bbbfc0c2..f5e6e14c1 100644 --- a/dom/Cargo.toml +++ b/dom/Cargo.toml @@ -17,6 +17,9 @@ edition = "2018" default-target = "wasm32-unknown-unknown" all-features = true +[package.metadata.honk] +browser-tests = true + [lib] crate-type = [ "cdylib", "rlib", ] diff --git a/dom/augdom/Cargo.toml b/dom/augdom/Cargo.toml index 16736445f..94e3f543f 100644 --- a/dom/augdom/Cargo.toml +++ b/dom/augdom/Cargo.toml @@ -17,6 +17,9 @@ edition = "2018" default-target = "wasm32-unknown-unknown" all-features = true +[package.metadata.honk] +browser-tests = true + [features] default = ["webdom"] rsdom = ["illicit"] diff --git a/dom/examples/drivertest/Cargo.toml b/dom/examples/drivertest/Cargo.toml index 6a6944858..cdcc53e76 100644 --- a/dom/examples/drivertest/Cargo.toml +++ b/dom/examples/drivertest/Cargo.toml @@ -5,6 +5,9 @@ version = "0.1.0" authors = ["Adam Perry "] edition = "2018" +[package.metadata.honk] +browser-tests = true + [package.metadata.wasm-pack.profile.release] wasm-opt = false diff --git a/dom/examples/hacking/Cargo.toml b/dom/examples/hacking/Cargo.toml index d72822c98..bb9b2c098 100644 --- a/dom/examples/hacking/Cargo.toml +++ b/dom/examples/hacking/Cargo.toml @@ -7,6 +7,9 @@ edition = "2018" license-file = "../../../../LICENSE-MIT" repository = "https://github.com/anp/moxie.git" +[package.metadata.honk] +browser-tests = true + [package.metadata.wasm-pack.profile.release] wasm-opt = false diff --git a/dom/examples/todo/Cargo.toml b/dom/examples/todo/Cargo.toml index db34d64c4..f2daac302 100644 --- a/dom/examples/todo/Cargo.toml +++ b/dom/examples/todo/Cargo.toml @@ -7,6 +7,9 @@ edition = "2018" license-file = "../../../../LICENSE-MIT" repository = "https://github.com/anp/moxie.git" +[package.metadata.honk] +browser-tests = true + [package.metadata.wasm-pack.profile.release] wasm-opt = false diff --git a/dom/prettiest/Cargo.toml b/dom/prettiest/Cargo.toml index 834774224..f5b6f4fce 100644 --- a/dom/prettiest/Cargo.toml +++ b/dom/prettiest/Cargo.toml @@ -13,6 +13,9 @@ repository = "https://github.com/anp/moxie.git" authors = ["Adam Perry "] edition = "2018" +[package.metadata.honk] +browser-tests = true + [dependencies] js-sys = "0.3.25" scopeguard = "1.1.0" diff --git a/honk/Cargo.lock b/honk/Cargo.lock new file mode 100644 index 000000000..453e4a181 --- /dev/null +++ b/honk/Cargo.lock @@ -0,0 +1,3187 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "actix" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1be241f88f3b1e7e9a3fbe3b5a8a0f6915b5a1d7ee0d9a248d3376d01068cc60" +dependencies = [ + "actix-rt", + "actix_derive", + "bitflags", + "bytes 0.5.6", + "crossbeam-channel", + "derive_more", + "futures-channel", + "futures-util", + "log", + "once_cell", + "parking_lot", + "pin-project 0.4.28", + "smallvec", + "tokio", + "tokio-util", + "trust-dns-proto", + "trust-dns-resolver", +] + +[[package]] +name = "actix-codec" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78d1833b3838dbe990df0f1f87baf640cf6146e898166afe401839d1b001e570" +dependencies = [ + "bitflags", + "bytes 0.5.6", + "futures-core", + "futures-sink", + "log", + "pin-project 0.4.28", + "tokio", + "tokio-util", +] + +[[package]] +name = "actix-connect" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177837a10863f15ba8d3ae3ec12fac1099099529ed20083a27fdfe247381d0dc" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "derive_more", + "either", + "futures-util", + "http", + "log", + "trust-dns-proto", + "trust-dns-resolver", +] + +[[package]] +name = "actix-http" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "452299e87817ae5673910e53c243484ca38be3828db819b6011736fc6982e874" +dependencies = [ + "actix-codec", + "actix-connect", + "actix-rt", + "actix-service", + "actix-threadpool", + "actix-utils", + "base64 0.13.0", + "bitflags", + "brotli2", + "bytes 0.5.6", + "cookie", + "copyless", + "derive_more", + "either", + "encoding_rs", + "flate2", + "futures-channel", + "futures-core", + "futures-util", + "fxhash", + "h2", + "http", + "httparse", + "indexmap", + "itoa", + "language-tags", + "lazy_static", + "log", + "mime", + "percent-encoding", + "pin-project 1.0.6", + "rand", + "regex", + "serde", + "serde_json", + "serde_urlencoded", + "sha-1", + "slab", + "time 0.2.26", +] + +[[package]] +name = "actix-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ca8ce00b267af8ccebbd647de0d61e0674b6e61185cc7a592ff88772bed655" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "actix-router" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ad299af73649e1fc893e333ccf86f377751eb95ff875d095131574c6f43452c" +dependencies = [ + "bytestring", + "http", + "log", + "regex", + "serde", +] + +[[package]] +name = "actix-rt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "143fcc2912e0d1de2bcf4e2f720d2a60c28652ab4179685a1ee159e0fb3db227" +dependencies = [ + "actix-macros", + "actix-threadpool", + "copyless", + "futures-channel", + "futures-util", + "smallvec", + "tokio", +] + +[[package]] +name = "actix-server" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45407e6e672ca24784baa667c5d32ef109ccdd8d5e0b5ebb9ef8a67f4dfb708e" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "futures-channel", + "futures-util", + "log", + "mio", + "mio-uds", + "num_cpus", + "slab", + "socket2", +] + +[[package]] +name = "actix-service" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0052435d581b5be835d11f4eb3bce417c8af18d87ddf8ace99f8e67e595882bb" +dependencies = [ + "futures-util", + "pin-project 0.4.28", +] + +[[package]] +name = "actix-testing" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47239ca38799ab74ee6a8a94d1ce857014b2ac36f242f70f3f75a66f691e791c" +dependencies = [ + "actix-macros", + "actix-rt", + "actix-server", + "actix-service", + "log", + "socket2", +] + +[[package]] +name = "actix-threadpool" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d209f04d002854b9afd3743032a27b066158817965bf5d036824d19ac2cc0e30" +dependencies = [ + "derive_more", + "futures-channel", + "lazy_static", + "log", + "num_cpus", + "parking_lot", + "threadpool", +] + +[[package]] +name = "actix-tls" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24789b7d7361cf5503a504ebe1c10806896f61e96eca9a7350e23001aca715fb" +dependencies = [ + "actix-codec", + "actix-service", + "actix-utils", + "futures-util", +] + +[[package]] +name = "actix-utils" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9022dec56632d1d7979e59af14f0597a28a830a9c1c7fec8b2327eb9f16b5a" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "bitflags", + "bytes 0.5.6", + "either", + "futures-channel", + "futures-sink", + "futures-util", + "log", + "pin-project 0.4.28", + "slab", +] + +[[package]] +name = "actix-web" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e641d4a172e7faa0862241a20ff4f1f5ab0ab7c279f00c2d4587b77483477b86" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-testing", + "actix-threadpool", + "actix-tls", + "actix-utils", + "actix-web-codegen", + "awc", + "bytes 0.5.6", + "derive_more", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "fxhash", + "log", + "mime", + "pin-project 1.0.6", + "regex", + "serde", + "serde_json", + "serde_urlencoded", + "socket2", + "time 0.2.26", + "tinyvec", + "url", +] + +[[package]] +name = "actix-web-actors" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6edf3c2693e2a8c422800c87ee89a6a4eac7dd01109bc172a1093ce1f4f001" +dependencies = [ + "actix", + "actix-codec", + "actix-http", + "actix-web", + "bytes 0.5.6", + "futures-channel", + "futures-core", + "pin-project 0.4.28", +] + +[[package]] +name = "actix-web-codegen" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad26f77093333e0e7c6ffe54ebe3582d908a104e448723eec6d43d08b07143fb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "actix_derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b95aceadaf327f18f0df5962fedc1bde2f870566a0b9f65c89508a3b1f79334c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "addr2line" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +dependencies = [ + "memchr", +] + +[[package]] +name = "annotate-snippets" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c96c3d1062ea7101741480185a6a1275eab01cbe8b20e378d1311bc056d2e08" +dependencies = [ + "unicode-width", + "yansi-term", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "anyhow" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b" + +[[package]] +name = "argh" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91792f088f87cdc7a2cfb1d617fa5ea18d7f1dc22ef0e1b5f82f3157cdc522be" +dependencies = [ + "argh_derive", + "argh_shared", +] + +[[package]] +name = "argh_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4eb0c0c120ad477412dc95a4ce31e38f2113e46bd13511253f79196ca68b067" +dependencies = [ + "argh_shared", + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "argh_shared" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781f336cc9826dbaddb9754cb5db61e64cab4f69668bd19dcc4a0394a86f4cb1" + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "ascii-canvas" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff8eb72df928aafb99fe5d37b383f2fe25bd2a765e3e5f7c365916b6f2463a29" +dependencies = [ + "term", +] + +[[package]] +name = "async-trait" +version = "0.1.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36ea56748e10732c49404c153638a15ec3d6211ec5ff35d9bb20e13b93576adf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "awc" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b381e490e7b0cfc37ebc54079b0413d8093ef43d14a4e4747083f7fa47a9e691" +dependencies = [ + "actix-codec", + "actix-http", + "actix-rt", + "actix-service", + "base64 0.13.0", + "bytes 0.5.6", + "cfg-if 1.0.0", + "derive_more", + "futures-core", + "log", + "mime", + "percent-encoding", + "rand", + "serde", + "serde_json", + "serde_urlencoded", +] + +[[package]] +name = "backtrace" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc" +dependencies = [ + "addr2line", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base-x" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" + +[[package]] +name = "base64" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "beef" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "474a626a67200bd107d44179bb3d4fc61891172d11696609264589be6a0e6a43" + +[[package]] +name = "bit-set" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "blake2b_simd" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "brotli2" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" +dependencies = [ + "brotli-sys", + "libc", +] + +[[package]] +name = "bson" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b6553abdb9d2d8f262f0b5bccf807321d5b7d1a12796bcede8e1f150e85f2e" +dependencies = [ + "base64 0.13.0", + "chrono", + "hex", + "lazy_static", + "linked-hash-map", + "rand", + "serde", + "serde_json", + "uuid", +] + +[[package]] +name = "bumpalo" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" + +[[package]] +name = "bytes" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" + +[[package]] +name = "bytestring" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90706ba19e97b90786e19dc0d5e2abd80008d99d4c0c5d1ad0b5e72cec7c494d" +dependencies = [ + "bytes 1.0.1", +] + +[[package]] +name = "cc" +version = "1.0.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time 0.1.43", + "winapi 0.3.9", +] + +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "ansi_term 0.11.0", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "color-eyre" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b29030875fd8376e4a28ef497790d5b4a7843d8d1396bf08ce46f5eec562c5c" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6eee477a4a8a72f4addd4de416eb56d54bc307b284d6601bafdee1f4ea462d1" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "const_fn" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076a6803b0dacd6a88cfe64deba628b01533ff5ef265687e6938280c1afd0a28" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a5d7b21829bc7b4bf4754a978a241ae54ea55a40f92bb20216e54096f4b951" +dependencies = [ + "percent-encoding", + "time 0.2.26", + "version_check", +] + +[[package]] +name = "copyless" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536" + +[[package]] +name = "cpuid-bool" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" + +[[package]] +name = "crc32fast" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "crossbeam-channel" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" +dependencies = [ + "crossbeam-utils 0.7.2", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg", + "cfg-if 0.1.10", + "lazy_static", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "lazy_static", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "debugserver-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf6834a70ed14e8e4e41882df27190bea150f1f6ecf461f1033f8739cd8af4a" +dependencies = [ + "schemafy", + "serde", + "serde_json", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "0.99.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f82b1b72f1263f214c0f823371768776c4f5841b942c9883aa8e5ec584fd0ba6" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_utils" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532b4c15dccee12c7044f1fcad956e98410860b22231e44a3b827464797ca7bf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "diff" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "dirs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" +dependencies = [ + "libc", + "redox_users 0.3.5", + "winapi 0.3.9", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users 0.4.0", + "winapi 0.3.9", +] + +[[package]] +name = "discard" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "ena" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7402b94a93c24e742487327a7cd839dc9d36fec9de9fb25b09f2dae459f36c3" +dependencies = [ + "log", +] + +[[package]] +name = "encoding_rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "enum-as-inner" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c5f0096a91d210159eceb2ff5e1c4da18388a170e1e3ce948aac9c8fdbbf595" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "eyre" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "221239d1d5ea86bf5d6f91c9d6bc3646ffe471b08ff9b0f91c44f115ac969d2b" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "filetime" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.2.5", + "winapi 0.3.9", +] + +[[package]] +name = "fixedbitset" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" + +[[package]] +name = "flate2" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" +dependencies = [ + "cfg-if 1.0.0", + "crc32fast", + "libc", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "fs-err" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcd1163ae48bda72a20ae26d66a04d3094135cadab911cff418ae5e33f253431" + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "fsevent" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" +dependencies = [ + "bitflags", + "fsevent-sys", +] + +[[package]] +name = "fsevent-sys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" +dependencies = [ + "libc", +] + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +dependencies = [ + "bitflags", + "fuchsia-zircon-sys", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" + +[[package]] +name = "futures" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d5813545e459ad3ca1bff9915e9ad7f1a47dc6a91b627ce321d5863b7dd253" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce79c6a52a299137a6013061e0cf0e688fce5d7f1bc60125f520912fdb29ec25" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "098cd1c6dda6ca01650f1a37a794245eb73181d0d4d4e955e2f3c37db7af1815" + +[[package]] +name = "futures-enum" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3422d14de7903a52e9dbc10ae05a7e14445ec61890100e098754e120b2bd7b1e" +dependencies = [ + "derive_utils", + "quote", + "syn", +] + +[[package]] +name = "futures-executor" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f6cb7042eda00f0049b1d2080aa4b93442997ee507eb3828e8bd7577f94c9d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "365a1a1fb30ea1c03a830fdb2158f5236833ac81fa0ad12fe35b29cddc35cb04" + +[[package]] +name = "futures-macro" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668c6733a182cd7deb4f1de7ba3bf2120823835b3bcfbeacf7d2c4a773c1bb8b" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5629433c555de3d82861a7a4e3794a4c40040390907cfbfd7143a92a426c23" + +[[package]] +name = "futures-task" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba7aa51095076f3ba6d9a1f702f74bd05ec65f555d70d2033d55ba8d69f581bc" + +[[package]] +name = "futures-util" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c144ad54d60f23927f0a6b6d816e4271278b64f005ad65e4e35291d2de9c025" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite 0.2.6", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gazebo" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b91762e4652014f5a677ca8cc00546f09f78a8ebc1e6624a6bc931cd9656e8" +dependencies = [ + "gazebo_derive", +] + +[[package]] +name = "gazebo_derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d67a8bf744290be7799e50aa9f9d50fa1b693fd7bc37daf7bca57d20988f2c63" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "graphql-parser" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1abd4ce5247dfc04a03ccde70f87a048458c9356c7e41d21ad8c407b3dde6f2" +dependencies = [ + "combine", + "thiserror", +] + +[[package]] +name = "h2" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" +dependencies = [ + "bytes 0.5.6", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", + "tracing-futures", +] + +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" + +[[package]] +name = "heck" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "honk" +version = "7.0.0" +dependencies = [ + "actix-web", + "anyhow", + "argh", + "color-eyre", + "crossbeam-channel", + "gazebo", + "glob", + "juniper", + "juniper_actix", + "memofs", + "once_cell", + "parking_lot", + "petgraph", + "serde_json", + "starlark", + "starlark_module", + "thiserror", + "tracing", + "tracing-error", + "tracing-subscriber", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi 0.3.9", +] + +[[package]] +name = "http" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" +dependencies = [ + "bytes 1.0.1", + "fnv", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc35c995b9d93ec174cf9a27d425c7892722101e14993cd227fdb51d70cf9589" + +[[package]] +name = "idna" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" +dependencies = [ + "autocfg", + "hashbrown", + "serde", +] + +[[package]] +name = "inotify" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" +dependencies = [ + "bitflags", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "instant" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", +] + +[[package]] +name = "ipconfig" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" +dependencies = [ + "socket2", + "widestring", + "winapi 0.3.9", + "winreg", +] + +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d572918e350e82412fe766d24b15e6682fb2ed2bbe018280caa810397cb319" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" + +[[package]] +name = "juniper" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e1330b4b3b2fe7de256fd08738f7fba28ffa574109c834988c28972f0760dbd" +dependencies = [ + "async-trait", + "bson", + "chrono", + "fnv", + "futures", + "futures-enum", + "graphql-parser", + "indexmap", + "juniper_codegen", + "serde", + "smartstring", + "static_assertions", + "url", + "uuid", +] + +[[package]] +name = "juniper_actix" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3afc38d7583ee66c8a0f7e18e9b7de55cc5717e19990eb4ae7280a0094a2f3c" +dependencies = [ + "actix", + "actix-web", + "actix-web-actors", + "anyhow", + "futures", + "juniper", + "juniper_graphql_ws", + "serde", + "serde_json", + "thiserror", + "tokio", +] + +[[package]] +name = "juniper_codegen" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3faf2a1e2e86cadc6bcc6082d63c73e8eafe6b703a0c5723e585b3d4afcec9cd" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "juniper_graphql_ws" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d4b8208e5a27e81dbc3217a8752adfa661538b91456534baf1c9ae724fdfbd" +dependencies = [ + "juniper", + "juniper_subscriptions", + "serde", + "tokio", +] + +[[package]] +name = "juniper_subscriptions" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a20ddcec070ee33abcaa88383dc61a23d13965e40d1cab84e3533fc3b34d03c0" +dependencies = [ + "futures", + "juniper", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "lalrpop" +version = "0.19.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46962a8c71b91c3524b117dfdd70844d4265a173c4c9109f98171aebdcf1195f" +dependencies = [ + "ascii-canvas", + "atty", + "bit-set", + "diff", + "ena", + "itertools 0.10.0", + "lalrpop-util", + "petgraph", + "pico-args", + "regex", + "regex-syntax", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "lalrpop-util" +version = "0.19.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a708007b751af124d09e9c5d97515257902bc6b486a56b40bcafd939e8ff467" +dependencies = [ + "regex", +] + +[[package]] +name = "language-tags" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56d855069fafbb9b344c0f962150cd2c1187975cb1c22c1522c240d8c4986714" + +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + +[[package]] +name = "lock_api" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3c91c24eae6777794bb1997ad98bbb87daf92890acab859f7eaa4320333176" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "logos" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91c49573597a5d6c094f9031617bb1fed15c0db68c81e6546d313414ce107e4" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-derive" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "797b1f8a0571b331c1b47e7db245af3dc634838da7a92b3bef4e30376ae1c347" +dependencies = [ + "beef", + "fnv", + "proc-macro2", + "quote", + "regex-syntax", + "syn", + "utf8-ranges", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "lsp-server" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fce8851309a325974ec76efe7c9d954d152c9ff4fded6520eb3c96d0aa3a96" +dependencies = [ + "crossbeam-channel", + "log", + "serde", + "serde_json", +] + +[[package]] +name = "lsp-types" +version = "0.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d0cf64ea141b43d9e055f6b9df13f0bce32b103d84237509ce0a571ab9b159" +dependencies = [ + "base64 0.11.0", + "bitflags", + "serde", + "serde_json", + "serde_repr", + "url", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" + +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + +[[package]] +name = "memchr" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" + +[[package]] +name = "memofs" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcb1dfd75643be5531e4be536c41ffe01be42d12d5c58c52b38ee23707d7b9b" +dependencies = [ + "crossbeam-channel", + "fs-err", + "notify", + "serde", +] + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "mio" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +dependencies = [ + "cfg-if 0.1.10", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log", + "miow", + "net2", + "slab", + "winapi 0.2.8", +] + +[[package]] +name = "mio-extras" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" +dependencies = [ + "lazycell", + "log", + "mio", + "slab", +] + +[[package]] +name = "mio-uds" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" +dependencies = [ + "iovec", + "libc", + "mio", +] + +[[package]] +name = "miow" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" +dependencies = [ + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", +] + +[[package]] +name = "net2" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "nix" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ccba0cfe4fdf15982d1674c69b1fd80bad427d293849982668dfe454bd61f2" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", +] + +[[package]] +name = "notify" +version = "4.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80ae4a7688d1fab81c5bf19c64fc8db920be8d519ce6336ed4e7efe024724dbd" +dependencies = [ + "bitflags", + "filetime", + "fsevent", + "fsevent-sys", + "inotify", + "libc", + "mio", + "mio-extras", + "walkdir", + "winapi 0.3.9", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" + +[[package]] +name = "once_cell" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "owo-colors" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2386b4ebe91c2f7f51082d4cefa145d030e33a1842a96b12e4885cc3c01f7a55" + +[[package]] +name = "parking_lot" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall 0.2.5", + "smallvec", + "winapi 0.3.9", +] + +[[package]] +name = "paste" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "petgraph" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pico-args" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d70072c20945e1ab871c472a285fc772aefd4f5407723c206242f2c6f94595d6" + +[[package]] +name = "pin-project" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918192b5c59119d51e0cd221f4d49dde9112824ba717369e903c97d076083d0f" +dependencies = [ + "pin-project-internal 0.4.28", +] + +[[package]] +name = "pin-project" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc174859768806e91ae575187ada95c91a29e96a98dc5d2cd9a1fed039501ba6" +dependencies = [ + "pin-project-internal 1.0.6", +] + +[[package]] +name = "pin-project-internal" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be26700300be6d9d23264c73211d8190e755b6b5ca7a1b28230025511b52a5e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a490329918e856ed1b083f244e3bfe2d8c4f336407e4ea9e1a9f479ff09049e5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" + +[[package]] +name = "pin-project-lite" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro-nested" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" + +[[package]] +name = "proc-macro2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "redox_syscall" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +dependencies = [ + "getrandom 0.1.16", + "redox_syscall 0.1.57", + "rust-argon2", +] + +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom 0.2.2", + "redox_syscall 0.2.5", +] + +[[package]] +name = "regex" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" +dependencies = [ + "byteorder", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548" + +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] + +[[package]] +name = "rust-argon2" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" +dependencies = [ + "base64 0.13.0", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils 0.8.3", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "rustyline" +version = "7.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8227301bfc717136f0ecbd3d064ba8199e44497a0bdd46bb01ede4387cfd2cec" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "dirs-next", + "fs2", + "libc", + "log", + "memchr", + "nix", + "scopeguard", + "unicode-segmentation", + "unicode-width", + "utf8parse", + "winapi 0.3.9", +] + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemafy" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c16a6854d2bb501c578caa4c760efa1f689c6de9c416b09df043cf26de3c05e3" +dependencies = [ + "Inflector", + "schemafy_core", + "schemafy_lib", + "serde", + "serde_derive", + "serde_json", + "serde_repr", + "syn", +] + +[[package]] +name = "schemafy_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8335227b124c84befc4021af80ab1d47c4a3a25f0fee28e61e45cef11e51dd60" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "schemafy_lib" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c96bf8382cc2e9f5900598b7f161ab1ea6d8c4146ab766a949509924cbb5c6" +dependencies = [ + "Inflector", + "proc-macro2", + "quote", + "schemafy_core", + "serde", + "serde_derive", + "serde_json", + "syn", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dc6b7951b17b051f3210b063f12cc17320e2fe30ae05b0fe2a3abb068551c76" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha-1" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfebf75d25bd900fd1e7d11501efab59bc846dbc76196839663e6637bba9f25f" +dependencies = [ + "block-buffer", + "cfg-if 1.0.0", + "cpuid-bool", + "digest", + "opaque-debug", +] + +[[package]] +name = "sha1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" + +[[package]] +name = "sharded-slab" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79c719719ee05df97490f80a45acfc99e5a30ce98a1e4fb67aee422745ae14e3" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signal-hook-registry" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" +dependencies = [ + "libc", +] + +[[package]] +name = "siphasher" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbce6d4507c7e4a3962091436e56e95290cb71fa302d0d270e32130b75fbff27" + +[[package]] +name = "slab" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" + +[[package]] +name = "smallvec" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" + +[[package]] +name = "smartstring" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ada87540bf8ef4cf8a1789deb175626829bb59b1fefd816cf7f7f55efcdbae9" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "socket2" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "standback" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" +dependencies = [ + "version_check", +] + +[[package]] +name = "starlark" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd4a5e075ef3a8778f3e9ee4e5ff5f52337f31a02914e2073f378cb8586425e" +dependencies = [ + "annotate-snippets", + "anyhow", + "bumpalo", + "debugserver-types", + "derivative", + "derive_more", + "either", + "gazebo", + "indexmap", + "itertools 0.9.0", + "lalrpop", + "lalrpop-util", + "logos", + "lsp-server", + "lsp-types", + "maplit", + "once_cell", + "paste", + "regex", + "rustyline", + "serde", + "serde_json", + "starlark_module", + "static_assertions", + "structopt", + "thiserror", + "void", + "walkdir", +] + +[[package]] +name = "starlark_module" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d14a34c22bb57848d5fc890ca61a28649f599a3137f3fb0580861a3959f303cd" +dependencies = [ + "gazebo", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stdweb" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" +dependencies = [ + "discard", + "rustc_version", + "stdweb-derive", + "stdweb-internal-macros", + "stdweb-internal-runtime", + "wasm-bindgen", +] + +[[package]] +name = "stdweb-derive" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "serde_derive", + "syn", +] + +[[package]] +name = "stdweb-internal-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" +dependencies = [ + "base-x", + "proc-macro2", + "quote", + "serde", + "serde_derive", + "serde_json", + "sha1", + "syn", +] + +[[package]] +name = "stdweb-internal-runtime" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" + +[[package]] +name = "string_cache" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ddb1139b5353f96e429e1a5e19fbaf663bddedaa06d1dbd49f82e352601209a" +dependencies = [ + "lazy_static", + "new_debug_unreachable", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "structopt" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c" +dependencies = [ + "clap", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ce15dd3ed8aa2f8eeac4716d6ef5ab58b6b9256db41d7e1a0224c2788e8fd87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "term" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd106a334b7657c10b7c540a0106114feadeb4dc314513e97df481d5d966f42" +dependencies = [ + "byteorder", + "dirs", + "winapi 0.3.9", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +dependencies = [ + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "time" +version = "0.2.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a8cbfbf47955132d0202d1662f49b2423ae35862aee471f3ba4b133358f372" +dependencies = [ + "const_fn", + "libc", + "standback", + "stdweb", + "time-macros", + "version_check", + "winapi 0.3.9", +] + +[[package]] +name = "time-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" +dependencies = [ + "proc-macro-hack", + "time-macros-impl", +] + +[[package]] +name = "time-macros-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "standback", + "syn", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinyvec" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" +dependencies = [ + "bytes 0.5.6", + "fnv", + "futures-core", + "iovec", + "lazy_static", + "libc", + "memchr", + "mio", + "mio-uds", + "pin-project-lite 0.1.12", + "signal-hook-registry", + "slab", + "tokio-macros", + "winapi 0.3.9", +] + +[[package]] +name = "tokio-macros" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e44da00bfc73a25f814cd8d7e57a68a5c31b74b3152a0a1d1f590c97ed06265a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-util" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" +dependencies = [ + "bytes 0.5.6", + "futures-core", + "futures-io", + "futures-sink", + "log", + "pin-project-lite 0.1.12", + "tokio", +] + +[[package]] +name = "tracing" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" +dependencies = [ + "cfg-if 1.0.0", + "log", + "pin-project-lite 0.2.6", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tracing-error" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4d7c0b83d4a500748fa5879461652b361edf5c9d51ede2a2ac03875ca185e24" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project 1.0.6", + "tracing", +] + +[[package]] +name = "tracing-log" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "705096c6f83bf68ea5d357a6aa01829ddbdac531b357b45abeca842938085baa" +dependencies = [ + "ansi_term 0.12.1", + "chrono", + "lazy_static", + "matchers", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "trust-dns-proto" +version = "0.19.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cad71a0c0d68ab9941d2fb6e82f8fb2e86d9945b94e1661dd0aaea2b88215a9" +dependencies = [ + "async-trait", + "cfg-if 1.0.0", + "enum-as-inner", + "futures", + "idna", + "lazy_static", + "log", + "rand", + "smallvec", + "thiserror", + "tokio", + "url", +] + +[[package]] +name = "trust-dns-resolver" +version = "0.19.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "710f593b371175db53a26d0b38ed2978fafb9e9e8d3868b1acd753ea18df0ceb" +dependencies = [ + "cfg-if 0.1.10", + "futures", + "ipconfig", + "lazy_static", + "log", + "lru-cache", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "trust-dns-proto", +] + +[[package]] +name = "typenum" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" + +[[package]] +name = "unicode-bidi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +dependencies = [ + "matches", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" + +[[package]] +name = "unicode-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "url" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8-ranges" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ae116fef2b7fea257ed6440d3cfcff7f190865f170cdad00bb6465bf18ecba" + +[[package]] +name = "utf8parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi 0.3.9", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasm-bindgen" +version = "0.2.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83240549659d187488f91f33c0f8547cbfef0b2088bc470c116d1d260ef623d9" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae70622411ca953215ca6d06d3ebeb1e915f0f6613e3b495122878d7ebec7dae" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e734d91443f177bfdb41969de821e15c516931c3c3db3d318fa1b68975d0f6f" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53739ff08c8a68b0fdbcd54c372b8ab800b1449ab3c9d706503bc7dd1621b2c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9a543ae66aa233d14bb765ed9af4a33e81b8b58d1584cf1b47ff8cd0b9e4489" + +[[package]] +name = "widestring" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winreg" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "yansi-term" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" +dependencies = [ + "winapi 0.3.9", +] diff --git a/honk/Cargo.toml b/honk/Cargo.toml new file mode 100644 index 000000000..e448c8c9f --- /dev/null +++ b/honk/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "honk" +version = "7.0.0" +description = "An awful billed system." +categories = [] +keywords = ["build", "task", "cargo", "make"] +readme = "README.md" + +# update here, update everywhere! +license = "MIT/Apache-2.0" +homepage = "https://moxie.rs" +repository = "https://github.com/anp/moxie.git" +authors = ["Adam Perry "] +edition = "2018" + +[dependencies] +actix-web = "3" +anyhow = "1" +argh = "0.1.4" +color-eyre = "0.5.6" +crossbeam-channel = "0.4.0" +gazebo = "0.2.0" +glob = "0.3.0" +juniper = "0.15" +juniper_actix = { version = "0.2", features = ["subscriptions"] } +memofs = "0.1.2" +once_cell = "1" +parking_lot = "0.11.1" +petgraph = "0.5.1" +serde_json = "1.0.59" +starlark = "0.4" +starlark_module = "0.4" +thiserror = "1.0.21" +tracing = "0.1.21" +tracing-error = "0.1.2" +tracing-subscriber = { version = "0.2.15", features = ["fmt"] } diff --git a/honk/README.md b/honk/README.md new file mode 100644 index 000000000..376a145c2 --- /dev/null +++ b/honk/README.md @@ -0,0 +1,3 @@ +# honk + +An awful billed system. Experimental. diff --git a/honk/rules/cargo/clippy.honk b/honk/rules/cargo/clippy.honk new file mode 100644 index 000000000..79ceede32 --- /dev/null +++ b/honk/rules/cargo/clippy.honk @@ -0,0 +1,22 @@ +load("//honk/rules/cargo/metadata.honk", "rust_files_in_package") + + +def lint_crate(package): + """ + Run clippy on ${package}. + """ + target( + name="lint-" + package.name, + command=command( + "cargo", + args=[ + "clippy", + "--all-targets", + "--all-features", + "--package", + package.name, + ], + inputs=rust_files_in_package(package), + outputs=[], + ), + ) diff --git a/honk/rules/cargo/metadata.honk b/honk/rules/cargo/metadata.honk new file mode 100644 index 000000000..420659fc5 --- /dev/null +++ b/honk/rules/cargo/metadata.honk @@ -0,0 +1,170 @@ +# Functions to handle https://doc.rust-lang.org/cargo/commands/cargo-metadata.html#output-format. + + +def _dependency_dict_to_struct(dep): + return struct( + name=dep["name"], + source=dep["source"], + req=dep["req"], + kind=dep["kind"], + rename=dep["rename"], + optional=dep["optional"], + uses_default_features=dep["uses_default_features"], + features=dep["features"], + target=dep["target"], + registry=dep["registry"], + ) + + +def _target_dict_to_struct(target): + return struct( + name=target["name"], + kind=target["kind"], + crate_types=target["crate_types"], + src_path=path(target["src_path"]), + edition=target["edition"], + required_features=target.get("required-features"), + doctest=target["doctest"], + test=target.get("test"), + ) + + +def rust_files_in_target(manifest_path, target): + """ + Defined in https://doc.rust-lang.org/cargo/guide/project-layout.html. + """ + crate_dir = manifest_path.parent() + files = [] + bin_files = crate_dir.glob("src/bin/**/*.rs") + for file in crate_dir.glob("src/**/*.rs"): + if file not in bin_files: + files.append(file) + + if target.src_path.filename() == "main.rs": + files.extend(target.src_path.parent().glob("**/*.rs")) + else: + files.append(target.src_path) + + # FIXME restore set() call here + return list(files) + + +def rust_files_in_package(package): + # FIXME restore set() call here + files = list() + for target in package.targets: + files += rust_files_in_target(package.manifest_path, target) + return files + + +def _custom_honk_metadata(package): + browser_tests = False + metadata = package.get("metadata") + if metadata: + honk_metadata = metadata.get("honk") + if honk_metadata and honk_metadata.get("browser-tests"): + browser_tests = True + + return struct( + browser_tests=browser_tests, + ) + + +def _package_dict_to_struct(package): + dependencies = [_dependency_dict_to_struct(dep) for dep in package["dependencies"]] + targets = [_target_dict_to_struct(target) for target in package["targets"]] + + return struct( + name=package["name"], + version=package["version"], + id=package["id"], + license=package["license"], + license_file=package["license_file"], + description=package["description"], + source=package["source"], + dependencies=dependencies, + targets=targets, + features=package["features"], + manifest_path=path(package["manifest_path"]), + metadata=package["metadata"], + publish=package["publish"], + authors=package["authors"], + categories=package["categories"], + keywords=package["keywords"], + readme=package["readme"], + repository=package["repository"], + edition=package["edition"], + links=package["links"], + honk=_custom_honk_metadata(package), + ) + + +def _dep_is_local(metadata, dep): + for id in metadata.member_ids: + package = metadata.packages[id] + if package.name == dep.name: + return True + return False + + +def package_workspace_deps(metadata, package): + local_deps = [] + for dep in package.dependencies: + if _dep_is_local(metadata, dep): + local_deps.append(dep) + return local_deps + + +def _metadata_dict_to_struct(metadata): + packages = dict() + for raw_package in metadata["packages"]: + package = _package_dict_to_struct(raw_package) + packages[package.id] = package + + return struct( + version=metadata["version"], + root=metadata["workspace_root"], + target_dir=metadata["target_directory"], + member_ids=metadata["workspace_members"], + packages=packages, + ) + + +def cargo_metadata(manifest): + requested_version = 1 # only valid value at time of writing + + metadata_inputs = [] + # TODO make incremental globs more efficient and uncomment + # metadata_inputs = manifest.parent().globs( + # # TODO figure out a better way to exclude target + # [ + # "**/Cargo.toml", + # "**/Cargo.lock", + # "**/src/*.rs", + # "**/benches/**/*.rs", + # "**/examples/**/*.rs", + # "**/tests/**/*.rs", + # ] + # ) + + # TODO find a way to mark this volatile + metadata_command = command( + "cargo", # TODO get this from a specified toolchain + args=[ + "metadata", + "--format-version", + requested_version, + "--manifest-path", + manifest, + ], + inputs=metadata_inputs, + outputs=[], + ) + command_output = metadata_command.run().stdout() + decoded = json.decode(command_output) + metadata = _metadata_dict_to_struct(decoded) + + if metadata.version != requested_version: + fail(msg="Got metadata v" + metadata.version + ", expected v" + requested_version) + + return metadata diff --git a/honk/rules/cargo/rustfmt.honk b/honk/rules/cargo/rustfmt.honk new file mode 100644 index 000000000..6aa455129 --- /dev/null +++ b/honk/rules/cargo/rustfmt.honk @@ -0,0 +1,24 @@ +load("//honk/rules/cargo/metadata.honk", "rust_files_in_target") + + +def format_crate(package, check=False): + """ + Runs `rustfmt --edition ${package.edition} [--check] ${target.src_path}` for each target + in ${package}. + """ + + args = ["--edition", package.edition] + if check: + args += "--check" + + for target in package.targets: + target_files = rust_files_in_target(package.manifest_path, target) + formatter( + name="format-" + package.name + "-" + target.name, + command=command( + "rustfmt", + args=args + [target.src_path], + inputs=target_files, + outputs=target_files, + ), + ) diff --git a/honk/rules/cargo/wasm-pack.honk b/honk/rules/cargo/wasm-pack.honk new file mode 100644 index 000000000..bdf5ea306 --- /dev/null +++ b/honk/rules/cargo/wasm-pack.honk @@ -0,0 +1,5 @@ +def maybe_wasm_crate(package): + # TODO figure out a way to define wasm "binary" targets for wasm-pack + if package.honk.browser_tests: + # TODO define wasm-bindgen-test stuff + pass diff --git a/honk/rules/cargo/workspace.honk b/honk/rules/cargo/workspace.honk new file mode 100644 index 000000000..bb3737c22 --- /dev/null +++ b/honk/rules/cargo/workspace.honk @@ -0,0 +1,97 @@ +load("//honk/rules/cargo/clippy.honk", "lint_crate") +load( + "//honk/rules/cargo/metadata.honk", + "cargo_metadata", "package_workspace_deps", "rust_files_in_package" +) +load("//honk/rules/cargo/rustfmt.honk", "format_crate") +load("//honk/rules/cargo/wasm-pack.honk", "maybe_wasm_crate") + + +# TODO do the tests in two stages -- a build and then a run +# something like this to discover the filename cargo makes (thanks @yaahc) +# cargo test --no-run --message-format=json | \ +# jq -r "select(.profile.test == true) | \ +# .filenames[]" | grep -v dSYM - > filenames.txt + + +# TODO add workspace dependencies between crates + + +def test_crate(metadata, package): + """ + Run `cargo test --all-targets -p ${package}`. + """ + deps = [] + for local_dep in package_workspace_deps(metadata, package): + # TODO think of a way to distinguish target deps from path deps other than type + deps.append("test-" + local_dep.name) + + target( + name="test-" + package.name, + command=command( + "cargo", + args=["test", "--all-targets", "--package", package.name], + inputs=rust_files_in_package(package), + # TODO more granular output tracking somehow? + # TODO automagically convert strings for inputs/outputs + outputs=[path("target")], + ), + deps=deps, + ) + + +def doctest_crate(package): + """ + Run `cargo test --doc -p ${package}`. + """ + target( + name="doctest-" + package.name, + command=command( + "cargo", + args=["test", "--doc", "--package", package.name], + inputs=rust_files_in_package(package), + # TODO more granular output tracking somehow? + # TODO automagically convert strings for inputs/outputs + outputs=[path("target")], + ), + ) + + +def document_crate(package): + """ + Run `cargo doc --no-deps -p ${package}`. + """ + target( + name="rustdoc-" + package.name, + command=command( + "cargo", + args=["doc", "--no-deps", "--package", package.name], + inputs=rust_files_in_package(package), + # TODO more granular output tracking somehow? + # TODO automagically convert strings for inputs/outputs + outputs=[path("target/doc")], + ), + ) + + +def cargo_workspace(manifest): + """ + Discovers targets from a Cargo workspace, defined by the path to its root ${manifest}. + """ + manifest = path(manifest) + metadata = cargo_metadata(manifest) + for id in metadata.member_ids: + package = metadata.packages[id] + + # mutators + format_crate(package) + + # assets + # TODO discover binary targets for `honk run` + maybe_wasm_crate(package) + document_crate(package) + + # "tests" + test_crate(metadata, package) + doctest_crate(package) + lint_crate(package) diff --git a/honk/src/builtins.rs b/honk/src/builtins.rs new file mode 100644 index 000000000..0b103562d --- /dev/null +++ b/honk/src/builtins.rs @@ -0,0 +1,29 @@ +/// To be invoked inside of an `impl TypedValue<'_> for Foo { ... }` item. Expands to an +/// implementation of the `get_members()` method. +macro_rules! declare_members { + ($register:ident) => { + fn get_members(&self) -> Option<&'static starlark::environment::Globals> { + use once_cell::sync::Lazy; + use starlark::environment::{Globals, GlobalsBuilder}; + + static MEMBERS: Lazy = + Lazy::new(|| GlobalsBuilder::new().with($register).build()); + + Some(&*MEMBERS) + } + }; +} + +pub mod command; +pub mod formatter; +pub mod json; +pub mod path; +pub mod target; + +pub fn register(globals: &mut starlark::environment::GlobalsBuilder) { + command::register(globals); + formatter::register(globals); + json::register(globals); + path::register(globals); + target::register(globals); +} diff --git a/honk/src/builtins/command.rs b/honk/src/builtins/command.rs new file mode 100644 index 000000000..ea86e506a --- /dev/null +++ b/honk/src/builtins/command.rs @@ -0,0 +1,121 @@ +use crate::{builtins::path::HonkPath, error::Error}; +use starlark::{ + environment::GlobalsBuilder, + starlark_simple_value, + values::{ARef, StarlarkValue, Value}, +}; +use starlark_module::starlark_module; +use tracing::instrument; + +#[starlark_module] +pub fn register(builder: &mut GlobalsBuilder) { + fn command( + command: String, + _args: Vec>, + inputs: Vec>, + outputs: Vec>, + ) -> HonkCommand { + let args = _args.iter().map(|a| a.to_str()).collect(); + let inputs = inputs.iter().map(|i| (*i).clone()).collect(); + let outputs = outputs.iter().map(|o| (*o).clone()).collect(); + Ok(HonkCommand { command, args, inputs, outputs }) + } +} + +#[derive(Clone, Debug)] +pub struct HonkCommand { + pub command: String, + pub args: Vec, + pub inputs: Vec, + pub outputs: Vec, +} + +impl HonkCommand { + #[instrument] + pub fn run(&self) -> Result { + // TODO read file metadata for inputs from vfs + let output = Output { + // TODO set working dir + // TODO set environment + inner: std::process::Command::new(&self.command).args(&self.args).output()?, + command: self.to_string(), + }; + if output.inner.status.success() { + Ok(output) + } else { + Err(Error::CommandFailed(output)) + } + } +} + +starlark_simple_value!(HonkCommand); + +#[starlark_module::starlark_module] +fn register_command_methods(globals: &mut GlobalsBuilder) { + fn run(this: ARef) -> Output { + Ok(this.run()?) + } +} + +impl StarlarkValue<'_> for HonkCommand { + starlark::starlark_type!("command"); + declare_members!(register_command_methods); + + fn collect_repr(&self, buf: &mut String) { + use std::fmt::Write; + write!(buf, "{}", self).unwrap(); + } +} + +impl std::fmt::Display for HonkCommand { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f, "HonkCommand:")?; + write!(f, "\t{}", &self.command)?; + for arg in &self.args { + write!(f, " {}", arg)?; + } + + if !self.inputs.is_empty() { + write!(f, "\n\tinputs:")?; + for input in &self.inputs { + write!(f, " {},", input)?; + } + } + + if !self.outputs.is_empty() { + writeln!(f, "\n\toutputs:")?; + for output in &self.outputs { + write!(f, " {},", output)?; + } + } + + Ok(()) + } +} + +#[derive(Debug, Clone)] +pub struct Output { + command: String, + inner: std::process::Output, +} + +impl Output { + fn stdout(&self) -> Result { + Ok(String::from_utf8(self.inner.stdout.clone()) + .map_err(|source| Error::StdoutEncoding { source, command: self.command.to_owned() })?) + } +} + +#[starlark_module::starlark_module] +fn register_output_methods(globals: &mut GlobalsBuilder) { + fn stdout(this: ARef) -> String { + Ok(this.stdout()?) + } +} + +starlark_simple_value!(Output); + +impl StarlarkValue<'_> for Output { + starlark::starlark_type!("Output"); + declare_members!(register_output_methods); +} diff --git a/honk/src/builtins/formatter.rs b/honk/src/builtins/formatter.rs new file mode 100644 index 000000000..26f9294ae --- /dev/null +++ b/honk/src/builtins/formatter.rs @@ -0,0 +1,13 @@ +use crate::{builtins::command::HonkCommand, EvaluatorExt}; +use starlark::{ + environment::GlobalsBuilder, + values::{none::NoneType, ARef}, +}; + +#[starlark_module::starlark_module] +pub fn register(globals: &mut GlobalsBuilder) { + fn formatter(name: &str, command: ARef) -> NoneType { + ctx.revision().register_formatter(name, &*command); + Ok(NoneType) + } +} diff --git a/honk/src/builtins/json.rs b/honk/src/builtins/json.rs new file mode 100644 index 000000000..80c9955f5 --- /dev/null +++ b/honk/src/builtins/json.rs @@ -0,0 +1,59 @@ +use serde_json::Value as JsonValue; +use starlark::{ + collections::SmallMap, + environment::GlobalsBuilder, + starlark_simple_value, + values::{dict::Dict, list::List, ARef, Heap, StarlarkValue, Value}, +}; +use starlark_module::starlark_module; +use std::convert::TryInto; + +#[starlark_module::starlark_module] +pub fn register(globals: &mut GlobalsBuilder) { + const json: JsonModule = JsonModule; +} + +#[derive(Debug)] +struct JsonModule; + +#[starlark_module] +fn register_json_methods(globals: &mut GlobalsBuilder) { + fn decode(_this: ARef, x: String) -> Value<'v> { + Ok(json_to_starlark(heap, serde_json::from_str(&x)?)) + } +} + +starlark_simple_value!(JsonModule); + +impl StarlarkValue<'_> for JsonModule { + starlark::starlark_type!("json"); + declare_members!(register_json_methods); +} + +fn json_to_starlark<'h>(heap: &'h Heap, value: JsonValue) -> Value<'h> { + match value { + JsonValue::Null => Value::new_none(), + JsonValue::Bool(b) => Value::new_bool(b), + JsonValue::Number(n) => { + let n = n.as_i64().expect("floats not yet supported"); + let n: i32 = n.try_into().expect("only numbers within +/- 2gb are supported"); + Value::new_int(n) + } + JsonValue::String(s) => heap.alloc(s), + JsonValue::Array(a) => { + let mut list = List::default(); + for value in a { + list.push(json_to_starlark(heap, value)); + } + heap.alloc(list) + } + JsonValue::Object(o) => { + let mut dict: SmallMap = Default::default(); + for (key, value) in o { + let key = heap.alloc(key); + dict.insert_hashed(key.get_hashed().unwrap(), json_to_starlark(heap, value)); + } + heap.alloc(Dict::new(dict)) + } + } +} diff --git a/honk/src/builtins/path.rs b/honk/src/builtins/path.rs new file mode 100644 index 000000000..1cab04590 --- /dev/null +++ b/honk/src/builtins/path.rs @@ -0,0 +1,145 @@ +use starlark::{ + environment::GlobalsBuilder, + starlark_simple_value, starlark_type, + values::{list::List, ARef, AllocValue, Heap, StarlarkValue, Value}, +}; +use starlark_module::starlark_module; +use std::{ + hash::{Hash, Hasher}, + path::PathBuf, +}; + +#[starlark_module] +pub fn register(builder: &mut GlobalsBuilder) { + fn honk_root() -> HonkPath { + Ok(honk_root_impl()) + } + + fn path(p: &str) -> HonkPath { + Ok(HonkPath::new(p)) + } +} + +fn honk_root_impl() -> HonkPath { + // FIXME get this from the CLI arg + HonkPath { inner: std::env::current_dir().unwrap() } +} + +fn opt_typed_val<'h>(heap: &'h Heap, v: Option>) -> Value<'h> { + if let Some(v) = v { + heap.alloc(v) + } else { + Value::new_none() + } +} + +#[derive(Clone, Debug, Eq, Hash, PartialEq)] +pub struct HonkPath { + inner: PathBuf, +} + +impl HonkPath { + fn new(inner: &str) -> Self { + Self { + inner: if inner.starts_with("//") { + honk_root_impl().inner.join(inner.trim_start_matches("//")) + } else { + PathBuf::from(inner) + }, + } + } + + fn exists(&self) -> bool { + self.inner.exists() + } + + fn parent(&self) -> Option { + self.inner.parent().map(|p| Self { inner: p.to_path_buf() }) + } + + fn filename(&self) -> Option { + self.inner.file_name().map(|n| n.to_string_lossy().to_string()) + } + + fn join(&self, to_join: &str) -> Self { + Self { inner: self.inner.join(to_join) } + } + + fn canonicalize(&self) -> Self { + // TODO handle errors here + Self { inner: self.inner.canonicalize().unwrap() } + } + + // TODO return a Set once exposed from starlark crate + fn globs<'h>(&self, heap: &'h Heap, patterns: &[impl AsRef]) -> List<'h> { + let mut results = List::default(); + + for pattern in patterns { + let pattern = pattern.as_ref(); + // FIXME this might be a broken way to do globs "scoped" to a parent path? + let full_pattern = self.inner.to_string_lossy() + "/" + pattern; + + // TODO glob against the vfs + for entry in glob::glob(&full_pattern).expect("must pass a valid glob") { + results.push(heap.alloc(HonkPath { inner: entry.unwrap() })); + } + } + + results + } +} + +impl std::fmt::Display for HonkPath { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.inner.display().fmt(f) + } +} + +#[starlark_module::starlark_module] +fn register_path_methods(globals: &mut GlobalsBuilder) { + fn exists(this: ARef) -> bool { + Ok(this.exists()) + } + + fn parent(this: ARef) -> Value<'v> { + Ok(opt_typed_val(heap, this.parent())) + } + + fn filename(this: ARef) -> Value<'v> { + Ok(opt_typed_val(heap, this.filename())) + } + + fn join(this: ARef, to_join: &str) -> HonkPath { + Ok(this.join(&to_join)) + } + + fn canonicalize(this: ARef) -> HonkPath { + Ok(this.canonicalize()) + } + + fn glob(this: ARef, pattern: &str) -> List<'v> { + Ok(this.globs(heap, &[pattern])) + } + + fn globs(this: ARef, patterns: Vec<&str>) -> List<'v> { + Ok(this.globs(heap, &patterns)) + } +} + +impl StarlarkValue<'_> for HonkPath { + starlark_type!("path"); + declare_members!(register_path_methods); + + fn get_hash(&self) -> anyhow::Result { + let mut hasher = std::collections::hash_map::DefaultHasher::new(); + self.hash(&mut hasher); + Ok(hasher.finish()) + } + + fn collect_repr(&self, collector: &mut String) { + use std::fmt::Write; + write!(collector, "{}", self).expect("when can write! into a string even fail???"); + } +} + +starlark_simple_value!(HonkPath); diff --git a/honk/src/builtins/target.rs b/honk/src/builtins/target.rs new file mode 100644 index 000000000..d91b4fe89 --- /dev/null +++ b/honk/src/builtins/target.rs @@ -0,0 +1,41 @@ +use crate::{builtins::command::HonkCommand, EvaluatorExt}; +use starlark::{ + environment::GlobalsBuilder, + values::{none::NoneType, ARef, Value}, +}; +use std::collections::BTreeSet; + +#[starlark_module::starlark_module] +pub fn register(globals: &mut GlobalsBuilder) { + fn target(name: &str, command: ARef, deps: Option>>) -> NoneType { + let deps: DepSet = deps.into(); + ctx.revision().register_target(name, &*command, &deps); + Ok(NoneType) + } +} + +#[derive(Clone, Debug, Default)] +pub struct DepSet { + inner: BTreeSet, +} + +impl<'a> From>>> for DepSet { + fn from(v: Option>>) -> Self { + Self { + inner: v + .into_iter() + .map(IntoIterator::into_iter) + .flatten() + .map(|a| a.to_str()) + .collect(), + } + } +} + +impl<'a> IntoIterator for &'a DepSet { + type Item = &'a String; + type IntoIter = <&'a BTreeSet as IntoIterator>::IntoIter; + fn into_iter(self) -> Self::IntoIter { + (&self.inner).into_iter() + } +} diff --git a/honk/src/error.rs b/honk/src/error.rs new file mode 100644 index 000000000..baebc8172 --- /dev/null +++ b/honk/src/error.rs @@ -0,0 +1,49 @@ +use crate::builtins::command::Output; +use starlark::values::ValueError; +use std::{path::PathBuf, str::Utf8Error, string::FromUtf8Error}; + +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("i/o error: {source}")] + Io { + #[from] + source: std::io::Error, + }, + + #[error("starlark error:\n{0}")] + StarlarkError(#[source] anyhow::Error), + + #[error("failed to run command: {0:#?}")] + CommandFailed(Output), + + #[error("`{command}` returned non utf-8: {source}")] + StdoutEncoding { source: FromUtf8Error, command: String }, + + #[error("error handling JSON: {source}")] + JsonError { + #[from] + source: serde_json::Error, + }, + + #[allow(unused)] + #[error("non utf-8 *.honk script encountered at {}", file.display())] + ScriptEncoding { source: Utf8Error, file: PathBuf }, + + #[error("graph contains cycle but cycles are not allowed because fixpoints suuuuck")] + GraphContainsCycles(petgraph::algo::Cycle), + + #[error( + "graph must have all nodes reachable as a single \ + connected component, found {num_components} components" + )] + GraphIsSplit { num_components: usize }, + + #[error("couldn't find {target} in the dependency graph")] + GraphResolutionFailure { target: String }, +} + +impl From for ValueError { + fn from(e: Error) -> Self { + todo!("uh do this conversion properly: {:?}", e); + } +} diff --git a/honk/src/gql.rs b/honk/src/gql.rs new file mode 100644 index 000000000..e1d177b7d --- /dev/null +++ b/honk/src/gql.rs @@ -0,0 +1,47 @@ +use crate::state::WorkspaceState; +use actix_web::{http::header, middleware, web, App, Error, HttpResponse, HttpServer}; +use juniper::{graphql_object, EmptyMutation, EmptySubscription, GraphQLObject, RootNode}; +use juniper_actix::{graphiql_handler, graphql_handler, playground_handler}; + +impl juniper::Context for WorkspaceState {} + +pub struct Query; + +#[graphql_object(context = WorkspaceState)] +impl Query { + fn apiVersion() -> String { + "1.0".to_string() + } + // #[graphql(arguments(id(description = "id of the user")))] + // fn user(database: &Database, id: i32) -> Option<&User> { + // database.get_user(&id) + // } +} + +pub type Schema = + RootNode<'static, Query, EmptyMutation, EmptySubscription>; + +pub fn schema() -> Schema { + Schema::new( + Query, + EmptyMutation::::new(), + EmptySubscription::::new(), + ) +} + +pub async fn graphiql_route() -> Result { + graphiql_handler("/graphgl", None).await +} + +pub async fn playground_route() -> Result { + playground_handler("/graphgl", None).await +} + +pub async fn graphql_route( + req: actix_web::HttpRequest, + // state: &WorkspaceState, + payload: actix_web::web::Payload, + schema: web::Data, +) -> Result { + graphql_handler(&schema, todo!("get the state"), req, payload).await +} diff --git a/honk/src/graph.rs b/honk/src/graph.rs new file mode 100644 index 000000000..13325a912 --- /dev/null +++ b/honk/src/graph.rs @@ -0,0 +1,211 @@ +use crate::{ + builtins::{command::HonkCommand, path::HonkPath, target::DepSet}, + error::Error, +}; +use petgraph::prelude::*; +use std::{collections::HashMap, sync::Arc}; + +pub type ActionGraph = DiGraph; +pub type DepGraph = DiGraph, i32>; + +pub struct GraphBuilder { + inner: DepGraph, + indices: HashMap, NodeIndex>, + formatted: Arc, + pending_target_name_deps: HashMap>, + target_name_to_idx: HashMap, +} + +impl GraphBuilder { + pub fn new() -> Self { + let mut inner = DepGraph::default(); + let mut indices = HashMap::default(); + let formatted = Arc::new(Node::Formatted); + indices.insert(formatted.clone(), inner.add_node(formatted.clone())); + Self { + inner, + indices, + formatted, + pending_target_name_deps: Default::default(), + target_name_to_idx: Default::default(), + } + } + + pub fn command(&mut self, name: &str, command: &HonkCommand, deps: &DepSet) -> NodeIndex { + let idx = self.action( + name, + &command.command, + &command.args[..], + &command.inputs[..], + &command.outputs[..], + deps, + ); + + for input in &command.inputs { + let input = self.file(input); + self.dep(idx, input); + } + + for output in &command.outputs { + let output = self.file(output); + self.dep(output, idx); + } + + idx + } + + pub fn file(&mut self, path: &HonkPath) -> NodeIndex { + let Self { inner, indices, .. } = self; + // TODO less allocating? + let node = Arc::new(Node::File(path.to_owned())); + *indices.entry(node.clone()).or_insert_with(|| inner.add_node(node)) + } + + pub fn action( + &mut self, + name: &str, + command: &str, + args: &[String], + inputs: &[HonkPath], + outputs: &[HonkPath], + deps: &DepSet, + ) -> NodeIndex { + let Self { inner, indices, target_name_to_idx, .. } = self; + // TODO less allocating? + let args = args.iter().map(|a| a.to_string()).collect(); + let node = Arc::new(Node::Action(Action { + name: name.to_owned(), + command: command.to_owned(), + args, + inputs: inputs.to_vec(), + outputs: outputs.to_vec(), + })); + let idx = *indices.entry(node.clone()).or_insert_with(|| { + let idx = inner.add_node(node); + target_name_to_idx.insert(name.to_owned(), idx); + idx + }); + + for dep in deps { + self.pending_target_name_deps.entry(dep.to_string()).or_default().push(idx); + } + + idx + } + + pub fn formatted(&self) -> NodeIndex { + self.indices[&self.formatted] + } + + pub fn dep(&mut self, from: NodeIndex, to: NodeIndex) { + self.inner.update_edge(from, to, 0); + } + + pub fn build(mut self) -> crate::Result { + self.drain_pending()?; + let graph = self.collapse_non_action_edges()?; + + let num_components = petgraph::algo::connected_components(&graph); + if num_components != 1 { + Err(Error::GraphIsSplit { num_components }) + } else { + Ok(graph) + } + } + + fn drain_pending(&mut self) -> crate::Result<()> { + for (target, deps) in self.pending_target_name_deps.drain().collect::>() { + let target = if let Some(t) = self.target_name_to_idx.get(&target) { + *t + } else { + return Err(Error::GraphResolutionFailure { target }); + }; + for dep in deps { + self.dep(dep, target); + } + } + + Ok(()) + } + + fn collapse_non_action_edges(&mut self) -> crate::Result { + // for each non action edge, get all ins and all outs, make edges between + for i in self.inner.node_indices() { + if matches!(&*self.inner[i], Node::Action(..)) { + continue; + } + + let mut in_neighbors = vec![]; + add_all_action_indices(&self.inner, i, &mut in_neighbors, Direction::Incoming); + + let mut out_neighbors = vec![]; + add_all_action_indices(&self.inner, i, &mut out_neighbors, Direction::Outgoing); + + for in_neighbor in in_neighbors { + for out_neighbor in &out_neighbors { + self.inner.add_edge(in_neighbor, *out_neighbor, 0); + } + } + } + + // produce a new graph without any file/formatted edges + let graph = self.inner.filter_map( + |_, n| match &**n { + Node::Action(a) => Some(a.clone()), + _ => None, + }, + |_, e| Some(*e), + ); + + Ok(graph) + } +} + +fn add_all_action_indices( + graph: &DepGraph, + node: NodeIndex, + neighbors: &mut Vec, + dir: Direction, +) { + for neighbor in graph.neighbors_directed(node, dir) { + match &*graph[neighbor] { + Node::Action(..) => neighbors.push(neighbor), + _ => add_all_action_indices(graph, neighbor, neighbors, dir), + } + } +} + +#[derive(Debug, Eq, Hash, PartialEq)] +pub enum Node { + /// A special node used to schedule all formatters before anything that relies on their output. + Formatted, + /// A file in the build graph. + File(HonkPath), + /// A command to run in the build graph. + Action(Action), +} + +impl std::fmt::Display for Node { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Formatted => "FORMATTER BARRIER".fmt(f), + Self::File(p) => write!(f, "file:{}", p), + Self::Action(a) => write!(f, "{}", a), + } + } +} + +#[derive(Clone, Debug, Eq, Hash, PartialEq)] +pub struct Action { + name: String, + command: String, + args: Vec, + inputs: Vec, + outputs: Vec, +} + +impl std::fmt::Display for Action { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "action:{}", &self.name) + } +} diff --git a/honk/src/lib.rs b/honk/src/lib.rs new file mode 100644 index 000000000..e696c78a7 --- /dev/null +++ b/honk/src/lib.rs @@ -0,0 +1,94 @@ +use crate::{error::Error, revision::EvaluatorExt, state::WorkspaceState}; +use actix_web::{get, middleware, web, App, HttpResponse, HttpServer, Responder}; +use juniper_actix::graphql_handler; +use std::{path::Path, thread::JoinHandle}; +use tracing::{debug, error, info, instrument}; + +pub mod builtins; +pub mod error; +pub mod gql; +pub mod graph; +pub mod revision; +pub mod state; +pub mod vfs; + +pub(crate) type Result = color_eyre::eyre::Result; + +pub struct Workspace { + state: WorkspaceState, +} + +impl Workspace { + /// The asset path used to resolve the root of a honk workspace. + const ASSET_PATH: &'static str = "WORKSPACE.honk"; + + pub fn new(root: impl AsRef) -> Self { + let state = WorkspaceState::new(root); + Self { state } + } + + pub fn maintain(self) -> crate::Result<()> { + // TODO change current directory to workspace root? + info!("maintaining workspace"); + spawn_server(self.state.clone()); + loop { + if let Err(error) = self.converge() { + error!(%error, "couldn't converge current workspace revision"); + } + self.state.wait_for_changes(); + } + } + + #[instrument(level = "info", skip(self), fields(root = %self.state.root().display()))] + fn converge(&self) -> crate::Result<()> { + debug!("constructing workspace env"); + self.state.start_new_revision(); + let _workspace_env = self.state.load(Self::ASSET_PATH)?; + + let _build = self.state.resolve()?; + info!("discovered targets"); + + tracing::warn!("uh run some builds i guess?"); + + info!("finished"); + Ok(()) + } +} + +pub fn spawn_server(state: crate::WorkspaceState) -> JoinHandle> { + info!("spawning server"); + std::thread::spawn(move || { + actix_web::rt::System::new("honk_workspace_server").block_on(async move { + HttpServer::new(move || { + App::new() + .wrap(middleware::Compress::default()) + .wrap(middleware::Logger::default()) + .data(state.clone()) + .service(http_root) + .service( + web::resource("/graphgl") + .route(web::post().to(gql::graphql_route)) + .route(web::get().to(gql::graphql_route)), + ) + .service( + web::resource("/playground").route(web::get().to(gql::playground_route)), + ) + .service(web::resource("/graphiql").route(web::get().to(gql::graphiql_route))) + }) + // FIXME make this configurable + .bind("[::1]:8080")? + .run() + .await + }) + }) +} + +#[get("/")] +async fn http_root(data: web::Data) -> impl Responder { + use petgraph::dot::{Config, Dot}; + HttpResponse::Ok().body(format!( + "Hello world! from {}\n\n{}", + data.root().display(), + Dot::with_config(&data.resolve().unwrap(), &[Config::EdgeNoLabel]), + )) +} diff --git a/honk/src/main.rs b/honk/src/main.rs new file mode 100644 index 000000000..58408823b --- /dev/null +++ b/honk/src/main.rs @@ -0,0 +1,21 @@ +use argh::FromArgs; +use honk::Workspace; +use std::path::PathBuf; +use tracing_subscriber::Layer; + +/// An awful billed system. +#[derive(Debug, FromArgs)] +struct HonkCli { + /// path to directory containing `workspace.honk`. + #[argh(option, default = "std::env::current_dir().unwrap()")] + workspace: PathBuf, +} + +fn main() -> color_eyre::eyre::Result<()> { + let subscriber = tracing_error::ErrorLayer::default() + .with_subscriber(tracing_subscriber::fmt::fmt().pretty().finish()); + tracing::subscriber::set_global_default(subscriber)?; + color_eyre::install()?; + let HonkCli { workspace } = argh::from_env(); + Ok(Workspace::new(workspace).maintain()?) +} diff --git a/honk/src/revision.rs b/honk/src/revision.rs new file mode 100644 index 000000000..c07bfd4c8 --- /dev/null +++ b/honk/src/revision.rs @@ -0,0 +1,78 @@ +use crate::{ + builtins::{command::HonkCommand, target::DepSet}, + graph::{ActionGraph, GraphBuilder}, +}; +use gazebo::any::AnyLifetime; +use parking_lot::Mutex; +use starlark::eval::Evaluator; +use std::{collections::BTreeMap, sync::Arc}; + +#[derive(AnyLifetime, Clone, Debug, Default)] +pub struct Revision { + inner: Arc>, +} + +impl Revision { + pub fn register_formatter(&self, name: &str, command: &HonkCommand) { + self.inner.lock().register_formatter(name, command); + } + + pub fn register_target(&self, name: &str, command: &HonkCommand, deps: &DepSet) { + self.inner.lock().register_target(name, command, deps); + } + + pub fn resolve(&self) -> crate::Result { + self.inner.lock().resolve() + } +} + +#[derive(Debug, Default)] +struct RevisionState { + formatters: BTreeMap, + targets: BTreeMap, +} + +impl RevisionState { + fn register_formatter(&mut self, name: &str, command: &HonkCommand) { + let mut command = command.clone(); + // TODO find a better way to avoid cycles in the dep graph + command.inputs.clear(); + command.outputs.clear(); + self.formatters.insert(name.to_owned(), (command, Default::default())); + } + + fn register_target(&mut self, name: &str, command: &HonkCommand, deps: &DepSet) { + self.targets.insert(name.to_owned(), (command.clone(), deps.clone())); + } + + fn resolve(&mut self) -> crate::Result { + let mut graph = GraphBuilder::new(); + + for (name, (formatter, deps)) in &self.formatters { + let idx = graph.command(name, formatter, deps); + graph.dep(graph.formatted(), idx); + } + + for (name, (target, deps)) in &self.targets { + let idx = graph.command(name, target, deps); + graph.dep(idx, graph.formatted()); + } + + graph.build() + } +} + +pub trait EvaluatorExt<'r> { + fn set_revision(&mut self, revision: &'r Revision); + fn revision(&self) -> &'r Revision; +} + +impl<'a> EvaluatorExt<'a> for Evaluator<'_, 'a> { + fn set_revision(&mut self, revision: &'a Revision) { + self.extra = Some(revision); + } + + fn revision(&self) -> &'a Revision { + self.extra.clone().unwrap().downcast_ref().unwrap() + } +} diff --git a/honk/src/state.rs b/honk/src/state.rs new file mode 100644 index 000000000..3131f6876 --- /dev/null +++ b/honk/src/state.rs @@ -0,0 +1,110 @@ +use crate::{ + error::Error, + revision::{EvaluatorExt, Revision}, + vfs::Vfs, +}; +use parking_lot::Mutex; +use starlark::{ + environment::{FrozenModule, GlobalsBuilder, LibraryExtension, Module}, + eval::{Evaluator, FileLoader}, + syntax::{AstModule, Dialect}, +}; +use std::{ + path::{Path, PathBuf}, + sync::Arc, +}; +use tracing::{debug, instrument}; + +#[derive(Clone)] +pub struct WorkspaceState { + inner: Arc>, +} + +impl WorkspaceState { + pub fn new(root: impl AsRef) -> Self { + Self { + inner: Arc::new(Mutex::new(InnerState { + vfs: Vfs::new(), + root: root.as_ref().to_path_buf(), + current_revision: Default::default(), + _prev_revision: Default::default(), + })), + } + } + + pub fn root(&self) -> PathBuf { + self.inner.lock().root.clone() + } + + pub fn load(&self, path: &str) -> crate::Result { + self.inner.lock().load(path).map_err(Error::StarlarkError) + } + + pub fn current_revision(&self) -> Revision { + self.inner.lock().current_revision.clone() + } + + pub fn resolve(&self) -> crate::Result { + self.inner.lock().current_revision.resolve() + } + + pub fn start_new_revision(&self) { + self.inner.lock().start_new_revision() + } + + pub fn wait_for_changes(&self) { + // can't one-liner because we need the lock to be dropped + let spawned = { self.inner.lock().spawn_wait_for_changes() }; + spawned.join().unwrap(); + } +} + +struct InnerState { + /// Path to `workspace.honk`. + root: PathBuf, + + /// Tracks changes to files we've read. + vfs: Vfs, + + current_revision: Revision, + _prev_revision: Revision, +} + +impl InnerState { + fn start_new_revision(&mut self) { + self._prev_revision = std::mem::replace(&mut self.current_revision, Revision::default()); + } + + fn spawn_wait_for_changes(&mut self) -> std::thread::JoinHandle<()> { + self.vfs.spawn_wait_for_changes() + } +} + +impl FileLoader for InnerState { + #[instrument(skip(self))] + fn load(&mut self, path: &str) -> anyhow::Result { + // TODO smarter way to resolve assets etc + // TODO handle relative paths somehow? + let path = path.strip_prefix("//").unwrap_or(path); + let file = self.root.join(path); + debug!(file = %file.display(), "loading"); + + let root_contents = self.vfs.read(&file)?; + let root_contents = std::str::from_utf8(&*root_contents)?; + + let ast: AstModule = AstModule::parse(path, root_contents.to_string(), &Dialect::Standard)?; + + let globals = GlobalsBuilder::extended_by(&[LibraryExtension::StructType]) + .with(crate::builtins::register) + .build(); + let module: Module = Module::new(); + let mut eval: Evaluator = Evaluator::new(&module, &globals); + + let revision = self.current_revision.clone(); + eval.set_revision(&revision); + eval.set_loader(self); + let _res = eval.eval_module(ast)?; + + Ok(module.freeze()) + } +} diff --git a/honk/src/vfs.rs b/honk/src/vfs.rs new file mode 100644 index 000000000..7f1bfcfbe --- /dev/null +++ b/honk/src/vfs.rs @@ -0,0 +1,52 @@ +use crossbeam_channel::TryRecvError; +use memofs::{Vfs as MemoVfs, VfsEvent}; +use std::ops::{Deref, DerefMut}; +use tracing::{debug, info, trace}; + +pub struct Vfs { + inner: MemoVfs, +} + +impl Vfs { + pub fn new() -> Self { + Self { inner: MemoVfs::new_default() } + } + + pub fn spawn_wait_for_changes(&self) -> std::thread::JoinHandle<()> { + let changes = self.inner.event_receiver(); + std::thread::spawn(move || { + match changes.recv().unwrap() { + VfsEvent::Create(created) => info!(created = %created.display()), + VfsEvent::Write(modified) => info!(modified = %modified.display()), + VfsEvent::Remove(removed) => info!(removed = %removed.display()), + _ => unimplemented!("unrecognized filesystem event"), + } + + // TODO figure out how much memofs debounces, make sure its enough or we do some + debug!("draining other fs events until quiescent"); + loop { + match changes.try_recv() { + Ok(event) => trace!(?event, "discarding"), + Err(TryRecvError::Empty) => break, + Err(TryRecvError::Disconnected) => { + unreachable!("other end is kept alive by ourselves") + } + } + } + }) + } +} + +impl Deref for Vfs { + type Target = MemoVfs; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +impl DerefMut for Vfs { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.inner + } +} diff --git a/ofl/src/format.rs b/ofl/src/format.rs index 957f92951..275b105b0 100644 --- a/ofl/src/format.rs +++ b/ofl/src/format.rs @@ -32,6 +32,11 @@ impl Format { command.args(ofl_targets.iter().map(|t| &t.src_path)); } + for honk_member in workspace.honk_members() { + let honk_targets = &workspace.honk_metadata[&honk_member].targets; + command.args(honk_targets.iter().map(|t| &t.src_path)); + } + debug!({ ?command }, "running rustfmt"); let status = command.status().context("running rustfmt command")?; diff --git a/ofl/src/workspace.rs b/ofl/src/workspace.rs index 1c5024a23..bf269059f 100644 --- a/ofl/src/workspace.rs +++ b/ofl/src/workspace.rs @@ -7,6 +7,7 @@ use tracing::info; pub struct Workspace { pub metadata: Metadata, pub ofl_metadata: Metadata, + pub honk_metadata: Metadata, pub repo: Repository, } @@ -17,6 +18,7 @@ impl Workspace { Ok(Self { metadata: metadata_for_directory(project_root)?, ofl_metadata: metadata_for_directory(project_root.join("ofl"))?, + honk_metadata: metadata_for_directory(project_root.join("honk"))?, repo: Repository::open(project_root)?, }) } @@ -29,6 +31,10 @@ impl Workspace { local_metadata_members_reverse_topo(&self.ofl_metadata) } + pub fn honk_members(&self) -> Vec { + local_metadata_members_reverse_topo(&self.honk_metadata) + } + /// Returns a list of all crates which express a dependency upon `id` in /// their manifest. pub fn local_dependents(&self, id: &PackageId) -> Vec {