diff --git a/Cargo.lock b/Cargo.lock index fe53ea88f..03dffc876 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1947,80 +1947,33 @@ name = "docs-rs" version = "0.6.0" dependencies = [ "anyhow", - "askama", - "async-stream", - "axum", - "axum-extra", - "base64", "chrono", "clap", - "comrak", - "constant_time_eq", "derive_builder", - "derive_more 2.1.1", "docs_rs_build_limits", "docs_rs_build_queue", "docs_rs_builder", "docs_rs_cargo_metadata", "docs_rs_context", "docs_rs_database", - "docs_rs_env_vars", "docs_rs_fastly", "docs_rs_headers", "docs_rs_logging", - "docs_rs_mimes", "docs_rs_opentelemetry", "docs_rs_registry_api", "docs_rs_repository_stats", "docs_rs_storage", - "docs_rs_test_fakes", "docs_rs_types", - "docs_rs_uri", "docs_rs_utils", "docs_rs_watcher", - "fn-error-context", - "font-awesome-as-a-crate", + "docs_rs_web", "futures-util", - "getrandom 0.3.4", - "grass", - "http 1.4.0", - "http-body-util", - "indoc", - "itertools 0.14.0", - "kuchikiki", - "lol_html", - "md5", - "mime", - "mockito", - "num_cpus", - "opentelemetry", "opentelemetry_sdk", - "phf 0.13.1", - "phf_codegen 0.13.1", - "postcard", - "pretty_assertions", "rand 0.9.2", - "rayon", - "regex", - "reqwest 0.13.1", - "sentry", - "serde", - "serde_json", - "slug", "sqlx", - "syntect", - "test-case", - "thiserror 2.0.17", - "time", "tokio", - "tokio-util", - "toml 0.9.10+spec-1.1.0", "tower", - "tower-http", "tracing", - "tracing-futures", - "url", - "walkdir", ] [[package]] @@ -2118,6 +2071,7 @@ version = "0.1.0" dependencies = [ "anyhow", "bon", + "docs_rs_build_limits", "docs_rs_build_queue", "docs_rs_database", "docs_rs_fastly", @@ -2247,6 +2201,7 @@ name = "docs_rs_registry_api" version = "0.1.0" dependencies = [ "anyhow", + "bon", "chrono", "docs_rs_env_vars", "docs_rs_types", @@ -2416,6 +2371,82 @@ dependencies = [ "tracing", ] +[[package]] +name = "docs_rs_web" +version = "0.1.0" +dependencies = [ + "anyhow", + "askama", + "async-stream", + "axum", + "axum-extra", + "base64", + "bon", + "chrono", + "clap", + "comrak", + "constant_time_eq", + "derive_more 2.1.1", + "docs_rs_build_limits", + "docs_rs_build_queue", + "docs_rs_builder", + "docs_rs_cargo_metadata", + "docs_rs_context", + "docs_rs_database", + "docs_rs_env_vars", + "docs_rs_headers", + "docs_rs_logging", + "docs_rs_mimes", + "docs_rs_opentelemetry", + "docs_rs_registry_api", + "docs_rs_storage", + "docs_rs_test_fakes", + "docs_rs_types", + "docs_rs_uri", + "docs_rs_utils", + "font-awesome-as-a-crate", + "futures-util", + "getrandom 0.3.4", + "grass", + "http 1.4.0", + "http-body-util", + "indoc", + "itertools 0.14.0", + "kuchikiki", + "lol_html", + "md5", + "mime", + "mockito", + "num_cpus", + "opentelemetry", + "opentelemetry_sdk", + "phf 0.13.1", + "phf_codegen 0.13.1", + "postcard", + "pretty_assertions", + "rayon", + "regex", + "reqwest 0.13.1", + "sentry", + "serde", + "serde_json", + "slug", + "sqlx", + "syntect", + "test-case", + "thiserror 2.0.17", + "time", + "tokio", + "tokio-util", + "toml 0.9.10+spec-1.1.0", + "tower", + "tower-http", + "tracing", + "tracing-futures", + "url", + "walkdir", +] + [[package]] name = "docsrs-metadata" version = "0.1.0" @@ -2641,17 +2672,6 @@ dependencies = [ "spin", ] -[[package]] -name = "fn-error-context" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd66269887534af4b0c3e3337404591daa8dc8b9b2b3db71f9523beb4bafb41" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - [[package]] name = "fnv" version = "1.0.7" diff --git a/Cargo.toml b/Cargo.toml index ddc22b062..86b2a9d4c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,6 @@ authors = ["Onur Aslan ", "The Rust Project Developers"] readme = "README.md" license = "MIT" repository = "https://github.com/rust-lang/docs.rs" -build = "build.rs" edition = "2024" [workspace] @@ -27,7 +26,7 @@ askama = "0.15.1" async-stream = "0.3.5" axum-extra = { version = "0.12.0", features = ["typed-header", "routing", "middleware"] } base64 = "0.22" -bon = "3.8.1" +bon = { version = "3.8.1", features = ["experimental-overwritable"] } chrono = { version = "0.4.11", default-features = false, features = ["clock", "serde"] } clap = { version = "4.0.22", features = [ "derive" ] } derive_more = { version = "2.0.0", features = ["display", "deref", "from", "into", "from_str"] } @@ -66,80 +65,27 @@ walkdir = "2" docs_rs_build_limits = { path = "crates/lib/docs_rs_build_limits" } docs_rs_build_queue = { path = "crates/lib/docs_rs_build_queue" } docs_rs_builder = { path = "crates/bin/docs_rs_builder" } -docs_rs_cargo_metadata = { path = "crates/lib/docs_rs_cargo_metadata" } docs_rs_context = { path = "crates/lib/docs_rs_context" } docs_rs_database = { path = "crates/lib/docs_rs_database" } -docs_rs_env_vars = { path = "crates/lib/docs_rs_env_vars" } docs_rs_fastly = { path = "crates/lib/docs_rs_fastly" } -docs_rs_headers = { path = "crates/lib/docs_rs_headers" } docs_rs_logging = { path = "crates/lib/docs_rs_logging" } -docs_rs_mimes = { path = "crates/lib/docs_rs_mimes" } docs_rs_opentelemetry = { path = "crates/lib/docs_rs_opentelemetry" } docs_rs_registry_api = { path = "crates/lib/docs_rs_registry_api" } docs_rs_repository_stats = { path = "crates/lib/docs_rs_repository_stats" } docs_rs_storage = { path = "crates/lib/docs_rs_storage" } docs_rs_types = { path = "crates/lib/docs_rs_types" } -docs_rs_uri = { path = "crates/lib/docs_rs_uri" } docs_rs_utils = { path = "crates/lib/docs_rs_utils" } docs_rs_watcher = { path = "crates/bin/docs_rs_watcher" } +docs_rs_web = { path = "crates/bin/docs_rs_web" } -sentry = { workspace = true } +anyhow = { workspace = true } tracing = { workspace = true } -regex = { workspace = true } +chrono = { workspace = true } clap = { workspace = true } -rayon = { workspace = true } -num_cpus = "1.15.0" -reqwest = { workspace = true } -slug = { workspace = true } -sqlx = { workspace = true } -url = { workspace = true } -anyhow = { workspace = true } -thiserror = { workspace = true } -comrak = { version = "0.49.0", default-features = false } -syntect = { version = "5.0.0", default-features = false, features = ["parsing", "html", "dump-load", "regex-onig"] } -toml = { workspace = true } -opentelemetry = { workspace = true } -opentelemetry_sdk = { workspace = true } -base64 = { workspace = true } -lol_html = "2.0.0" -font-awesome-as-a-crate = { path = "crates/lib/font-awesome-as-a-crate" } -getrandom = "0.3.1" -itertools = { workspace = true } -derive_more = { workspace = true } -derive_builder = "0.20.2" - -# Async tokio = { workspace = true } -tokio-util = { version = "0.7.15", default-features = false, features = ["io"] } -tracing-futures= { version = "0.2.5", features = ["std-future", "futures-03"] } +derive_builder = "0.20.2" futures-util = { workspace = true } -async-stream = { workspace = true } -http = { workspace = true } - -# Data serialization and deserialization -serde = { workspace = true } -serde_json = { workspace = true } -postcard = { workspace = true } - -# axum dependencies -axum = { version = "0.8.1", features = ["macros"] } -axum-extra = { workspace = true } -tower = "0.5.1" -tower-http = { version = "0.6.0", features = ["fs", "trace", "timeout", "catch-panic"] } -mime = { workspace = true } - -fn-error-context = "0.2.0" - -# Templating -askama = { workspace = true } -walkdir = { workspace = true } -phf = "0.13.1" - -# Date and Time utilities -chrono = { workspace = true } - -# Transitive dependencies we don't use directly but need to have specific versions of -constant_time_eq = "0.4.2" +sqlx = { workspace = true } [dev-dependencies] docs_rs_build_queue = { path = "crates/lib/docs_rs_build_queue", features = ["testing"] } @@ -150,33 +96,11 @@ docs_rs_fastly = { path = "crates/lib/docs_rs_fastly", features = ["testing"] } docs_rs_headers = { path = "crates/lib/docs_rs_headers", features = ["testing"] } docs_rs_opentelemetry = { path = "crates/lib/docs_rs_opentelemetry", features = ["testing"] } docs_rs_storage = { path = "crates/lib/docs_rs_storage", features = ["testing"] } -docs_rs_test_fakes = { path = "crates/lib/docs_rs_test_fakes" } docs_rs_types = { path = "crates/lib/docs_rs_types", features = ["testing"] } -kuchikiki = "0.8" -http-body-util = "0.1.0" rand = { workspace = true } -mockito = { workspace = true } -test-case = { workspace = true } tower = { version = "0.5.1", features = ["util"] } opentelemetry_sdk = { version = "0.31.0", features = ["rt-tokio", "testing"] } -indoc = "2.0.0" -pretty_assertions = { workspace = true } - -[build-dependencies] -time = "0.3" -md5 = "0.8.0" -phf_codegen = "0.13" -walkdir = "2" -anyhow = { version = "1.0.42", features = ["backtrace"] } -grass = { version = "0.13.1", default-features = false } -syntect = { version = "5.0.0", default-features = false, features = ["parsing", "dump-create", "yaml-load", "regex-onig"] } - -[package.metadata.cargo-machete] -ignored = [ - "phf", # used in build script output - "slug", # used in askama templates, can be moved to web binary -] [[bin]] name = "cratesfyi" diff --git a/assets/syntaxes/Packages/CSS/.python-version b/assets/syntaxes/Packages/CSS/.python-version deleted file mode 100644 index 3767b4b17..000000000 --- a/assets/syntaxes/Packages/CSS/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.14 \ No newline at end of file diff --git a/assets/syntaxes/Packages/Diff/.python-version b/assets/syntaxes/Packages/Diff/.python-version deleted file mode 100644 index 3767b4b17..000000000 --- a/assets/syntaxes/Packages/Diff/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.14 \ No newline at end of file diff --git a/assets/syntaxes/Packages/HTML/.python-version b/assets/syntaxes/Packages/HTML/.python-version deleted file mode 100644 index 3767b4b17..000000000 --- a/assets/syntaxes/Packages/HTML/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.14 \ No newline at end of file diff --git a/assets/syntaxes/Packages/ShellScript/.python-version b/assets/syntaxes/Packages/ShellScript/.python-version deleted file mode 100644 index 3767b4b17..000000000 --- a/assets/syntaxes/Packages/ShellScript/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.14 \ No newline at end of file diff --git a/crates/bin/docs_rs_builder/src/main.rs b/crates/bin/docs_rs_builder/src/main.rs index d905f9e8c..3024286a5 100644 --- a/crates/bin/docs_rs_builder/src/main.rs +++ b/crates/bin/docs_rs_builder/src/main.rs @@ -42,19 +42,17 @@ impl CommandLine { let config = Arc::new(Config::from_environment()?); let ctx = runtime.block_on(async { Context::builder() + .with_runtime() .await? + .with_meter_provider()? .with_pool() .await? .with_storage() .await? - .with_cdn() - .await? - .with_build_queue() - .await? - .with_registry_api() - .await? - .with_repository_stats() - .await? + .with_cdn()? + .with_build_queue()? + .with_registry_api()? + .with_repository_stats()? .build() })?; diff --git a/crates/bin/docs_rs_builder/src/testing/test_env.rs b/crates/bin/docs_rs_builder/src/testing/test_env.rs index 8028cc023..b86451743 100644 --- a/crates/bin/docs_rs_builder/src/testing/test_env.rs +++ b/crates/bin/docs_rs_builder/src/testing/test_env.rs @@ -49,11 +49,12 @@ impl TestEnvironment { config: Arc::new(config), context: runtime.block_on(async { Context::builder() + .with_runtime() .await? + .with_meter_provider()? .pool(db_config.into(), db.pool().clone()) .storage(storage_config.clone(), test_storage.storage()) - .with_build_queue() - .await? + .with_build_queue()? .maybe_cdn( docs_rs_fastly::Config::from_environment()?.into(), Some(Cdn::mock().into()), diff --git a/crates/bin/docs_rs_watcher/src/main.rs b/crates/bin/docs_rs_watcher/src/main.rs index a38e5762e..942b62964 100644 --- a/crates/bin/docs_rs_watcher/src/main.rs +++ b/crates/bin/docs_rs_watcher/src/main.rs @@ -52,17 +52,16 @@ impl CommandLine { async fn handle_args(self) -> Result<()> { let config = Arc::new(Config::from_environment()?); let ctx = Context::builder() + .with_runtime() .await? + .with_meter_provider()? .with_pool() .await? .with_storage() .await? - .with_cdn() - .await? - .with_build_queue() - .await? - .with_repository_stats() - .await? + .with_cdn()? + .with_build_queue()? + .with_repository_stats()? .build()?; match self { diff --git a/crates/bin/docs_rs_watcher/src/testing/test_env.rs b/crates/bin/docs_rs_watcher/src/testing/test_env.rs index fb54468d0..fbe314b26 100644 --- a/crates/bin/docs_rs_watcher/src/testing/test_env.rs +++ b/crates/bin/docs_rs_watcher/src/testing/test_env.rs @@ -40,17 +40,17 @@ impl TestEnvironment { Ok(Self { config: Arc::new(config), context: Context::builder() + .with_runtime() .await? + .with_meter_provider()? .pool(db_config.into(), db.pool().clone()) .storage(storage_config.clone(), test_storage.storage()) - .with_build_queue() - .await? + .with_build_queue()? .maybe_cdn( docs_rs_fastly::Config::from_environment()?.into(), Some(Cdn::mock().into()), ) - .with_repository_stats() - .await? + .with_repository_stats()? .build()?, db, storage: test_storage, diff --git a/crates/bin/docs_rs_web/.sqlx/query-007a6d355f893370b544dda0d6129096357aa95c67c76905a6709a66247450ff.json b/crates/bin/docs_rs_web/.sqlx/query-007a6d355f893370b544dda0d6129096357aa95c67c76905a6709a66247450ff.json new file mode 100644 index 000000000..f13d5b020 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-007a6d355f893370b544dda0d6129096357aa95c67c76905a6709a66247450ff.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE builds SET output = $2 WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Text" + ] + }, + "nullable": [] + }, + "hash": "007a6d355f893370b544dda0d6129096357aa95c67c76905a6709a66247450ff" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-05bc6ad8a62d65aeedfff6c4a10a8d09ff86b671b31668bb2571b151206ef7f5.json b/crates/bin/docs_rs_web/.sqlx/query-05bc6ad8a62d65aeedfff6c4a10a8d09ff86b671b31668bb2571b151206ef7f5.json new file mode 100644 index 000000000..66bade59a --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-05bc6ad8a62d65aeedfff6c4a10a8d09ff86b671b31668bb2571b151206ef7f5.json @@ -0,0 +1,71 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n crates.name as \"name: KrateName\",\n releases.version,\n releases.description,\n releases.target_name,\n releases.rustdoc_status,\n releases.default_target,\n releases.doc_targets,\n releases.yanked,\n builds.rustc_version as \"rustc_version?\"\n FROM releases\n INNER JOIN crates ON crates.id = releases.crate_id\n LEFT JOIN LATERAL (\n SELECT * FROM builds\n WHERE builds.rid = releases.id\n ORDER BY builds.build_finished\n DESC LIMIT 1\n ) AS builds ON true\n WHERE crates.name = $1 AND releases.version = $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "name: KrateName", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "version", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "description", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "target_name", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "rustdoc_status", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "default_target", + "type_info": "Varchar" + }, + { + "ordinal": 6, + "name": "doc_targets", + "type_info": "Json" + }, + { + "ordinal": 7, + "name": "yanked", + "type_info": "Bool" + }, + { + "ordinal": 8, + "name": "rustc_version?", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + false, + true, + true, + true, + true, + true, + true, + true + ] + }, + "hash": "05bc6ad8a62d65aeedfff6c4a10a8d09ff86b671b31668bb2571b151206ef7f5" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-0a932ffd17414950513a2c8aca2ccd5e29780e00b105fbf79d2de83a11d33ddd.json b/crates/bin/docs_rs_web/.sqlx/query-0a932ffd17414950513a2c8aca2ccd5e29780e00b105fbf79d2de83a11d33ddd.json new file mode 100644 index 000000000..4c95721d1 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-0a932ffd17414950513a2c8aca2ccd5e29780e00b105fbf79d2de83a11d33ddd.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM owner_rels\n WHERE\n cid = $1 AND\n NOT (oid = ANY($2))", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4Array" + ] + }, + "nullable": [] + }, + "hash": "0a932ffd17414950513a2c8aca2ccd5e29780e00b105fbf79d2de83a11d33ddd" +} diff --git a/.sqlx/query-0b4084390b6c738c6f26c2dd13eff6ec8e7ea47c4d005d6cc00dbc60f69380cf.json b/crates/bin/docs_rs_web/.sqlx/query-0b4084390b6c738c6f26c2dd13eff6ec8e7ea47c4d005d6cc00dbc60f69380cf.json similarity index 100% rename from .sqlx/query-0b4084390b6c738c6f26c2dd13eff6ec8e7ea47c4d005d6cc00dbc60f69380cf.json rename to crates/bin/docs_rs_web/.sqlx/query-0b4084390b6c738c6f26c2dd13eff6ec8e7ea47c4d005d6cc00dbc60f69380cf.json diff --git a/crates/bin/docs_rs_web/.sqlx/query-1002ada46a8b06269d7aa42acc52e90e944d9009d75ad527e7442e312be98ea9.json b/crates/bin/docs_rs_web/.sqlx/query-1002ada46a8b06269d7aa42acc52e90e944d9009d75ad527e7442e312be98ea9.json new file mode 100644 index 000000000..f1374e312 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-1002ada46a8b06269d7aa42acc52e90e944d9009d75ad527e7442e312be98ea9.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO repositories (host, host_id, name, description, last_commit, stars, forks, issues, updated_at)\n VALUES ('github.com', $1, $2, 'Fake description!', NOW(), $3, $4, $5, NOW())\n RETURNING id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Int4", + "Int4", + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "1002ada46a8b06269d7aa42acc52e90e944d9009d75ad527e7442e312be98ea9" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-120c268463e7890553e639ac37e667f3fcdc3f5ceaab3c229b71dbb799c0cddc.json b/crates/bin/docs_rs_web/.sqlx/query-120c268463e7890553e639ac37e667f3fcdc3f5ceaab3c229b71dbb799c0cddc.json new file mode 100644 index 000000000..fa8db5d2f --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-120c268463e7890553e639ac37e667f3fcdc3f5ceaab3c229b71dbb799c0cddc.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO compression_rels (release, algorithm)\n VALUES ($1, $2)\n ON CONFLICT DO NOTHING;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "120c268463e7890553e639ac37e667f3fcdc3f5ceaab3c229b71dbb799c0cddc" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-12c203c76454f3b597186769c28550affce7342fc6a79de7c3b3da048232e3ec.json b/crates/bin/docs_rs_web/.sqlx/query-12c203c76454f3b597186769c28550affce7342fc6a79de7c3b3da048232e3ec.json new file mode 100644 index 000000000..fd127620f --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-12c203c76454f3b597186769c28550affce7342fc6a79de7c3b3da048232e3ec.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO crate_priorities (pattern, priority) VALUES ($1, $2)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "12c203c76454f3b597186769c28550affce7342fc6a79de7c3b3da048232e3ec" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-130cd68b74145ec609a4903c644ce6bc8c9a6d1c3af4953e81a1dfc248a05a3c.json b/crates/bin/docs_rs_web/.sqlx/query-130cd68b74145ec609a4903c644ce6bc8c9a6d1c3af4953e81a1dfc248a05a3c.json new file mode 100644 index 000000000..14efdbfd4 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-130cd68b74145ec609a4903c644ce6bc8c9a6d1c3af4953e81a1dfc248a05a3c.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE queue\n SET priority = GREATEST(priority, $1)\n WHERE\n name = $2\n AND version != $3\n AND attempt < $4\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Text", + "Text", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "130cd68b74145ec609a4903c644ce6bc8c9a6d1c3af4953e81a1dfc248a05a3c" +} diff --git a/.sqlx/query-192d91c85fff00d311fa28dd7f5781ea30207795b833c4951f3c8303c49e699e.json b/crates/bin/docs_rs_web/.sqlx/query-192d91c85fff00d311fa28dd7f5781ea30207795b833c4951f3c8303c49e699e.json similarity index 100% rename from .sqlx/query-192d91c85fff00d311fa28dd7f5781ea30207795b833c4951f3c8303c49e699e.json rename to crates/bin/docs_rs_web/.sqlx/query-192d91c85fff00d311fa28dd7f5781ea30207795b833c4951f3c8303c49e699e.json diff --git a/crates/bin/docs_rs_web/.sqlx/query-1be3826465e3cd76738b3bfc9d46df14795d1f18830783080bf3a58b909ab16a.json b/crates/bin/docs_rs_web/.sqlx/query-1be3826465e3cd76738b3bfc9d46df14795d1f18830783080bf3a58b909ab16a.json new file mode 100644 index 000000000..1cac273c1 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-1be3826465e3cd76738b3bfc9d46df14795d1f18830783080bf3a58b909ab16a.json @@ -0,0 +1,34 @@ +{ + "db_name": "PostgreSQL", + "query": "WITH params AS (\n -- get maximum possible id-value in crates-table\n SELECT last_value AS max_id FROM crates_id_seq\n )\n SELECT\n crates.name as \"name: KrateName\",\n releases.version as \"version: Version\",\n releases.target_name\n FROM (\n -- generate random numbers in the ID-range.\n SELECT DISTINCT 1 + trunc(random() * params.max_id)::INTEGER AS id\n FROM params, generate_series(1, $1)\n ) AS r\n INNER JOIN crates ON r.id = crates.id\n INNER JOIN releases ON crates.latest_version_id = releases.id\n INNER JOIN repositories ON releases.repository_id = repositories.id\n WHERE\n releases.rustdoc_status = TRUE AND\n repositories.stars >= 100\n LIMIT 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "name: KrateName", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "version: Version", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "target_name", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + true + ] + }, + "hash": "1be3826465e3cd76738b3bfc9d46df14795d1f18830783080bf3a58b909ab16a" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-1e660947261dfa1a5d1745d1732df59e0cf67ef1906da818086d063e6a0e21c6.json b/crates/bin/docs_rs_web/.sqlx/query-1e660947261dfa1a5d1745d1732df59e0cf67ef1906da818086d063e6a0e21c6.json new file mode 100644 index 000000000..e1bcf20ab --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-1e660947261dfa1a5d1745d1732df59e0cf67ef1906da818086d063e6a0e21c6.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE crates\n SET latest_version_id = $2\n WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "1e660947261dfa1a5d1745d1732df59e0cf67ef1906da818086d063e6a0e21c6" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-2056327f710b8e427e21bf427a24edaffcf58f68237f572e1c14801dc41fba3a.json b/crates/bin/docs_rs_web/.sqlx/query-2056327f710b8e427e21bf427a24edaffcf58f68237f572e1c14801dc41fba3a.json new file mode 100644 index 000000000..6d4f685e9 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-2056327f710b8e427e21bf427a24edaffcf58f68237f572e1c14801dc41fba3a.json @@ -0,0 +1,40 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE builds\n SET\n rustc_version = $1,\n docsrs_version = $2,\n build_status = $3,\n build_server = $4,\n errors = $5,\n documentation_size = $6,\n rustc_nightly_date = $7,\n build_finished = NOW()\n WHERE\n id = $8\n RETURNING rid as \"rid: ReleaseId\" ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "rid: ReleaseId", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + { + "Custom": { + "name": "build_status", + "kind": { + "Enum": [ + "in_progress", + "success", + "failure" + ] + } + } + }, + "Text", + "Text", + "Int8", + "Date", + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "2056327f710b8e427e21bf427a24edaffcf58f68237f572e1c14801dc41fba3a" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-2b8b1aae3740a05cb7179be9c7d5af30e8362c3cba0b07bc18fa32ff1a2232cc.json b/crates/bin/docs_rs_web/.sqlx/query-2b8b1aae3740a05cb7179be9c7d5af30e8362c3cba0b07bc18fa32ff1a2232cc.json new file mode 100644 index 000000000..d4b4d31a5 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-2b8b1aae3740a05cb7179be9c7d5af30e8362c3cba0b07bc18fa32ff1a2232cc.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT releases.files\n FROM releases\n INNER JOIN crates ON crates.id = releases.crate_id\n WHERE crates.name = $1 AND releases.version = $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "files", + "type_info": "Json" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + true + ] + }, + "hash": "2b8b1aae3740a05cb7179be9c7d5af30e8362c3cba0b07bc18fa32ff1a2232cc" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-2c1f393f0c38c013c99629b5f0d3611c5153730091dd5488e2ef21b495942b93.json b/crates/bin/docs_rs_web/.sqlx/query-2c1f393f0c38c013c99629b5f0d3611c5153730091dd5488e2ef21b495942b93.json new file mode 100644 index 000000000..b76453c01 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-2c1f393f0c38c013c99629b5f0d3611c5153730091dd5488e2ef21b495942b93.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO crates (name)\n VALUES ($1)\n ON CONFLICT (name) DO UPDATE\n SET -- this `SET` is needed so the id is always returned.\n name = EXCLUDED.name\n RETURNING id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "2c1f393f0c38c013c99629b5f0d3611c5153730091dd5488e2ef21b495942b93" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-38ca6c4bca81a0762e6e2db08a05ef0ba191d37199165d2745c64a4036e20790.json b/crates/bin/docs_rs_web/.sqlx/query-38ca6c4bca81a0762e6e2db08a05ef0ba191d37199165d2745c64a4036e20790.json new file mode 100644 index 000000000..c7752a36e --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-38ca6c4bca81a0762e6e2db08a05ef0ba191d37199165d2745c64a4036e20790.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT slug FROM keywords WHERE slug = ANY($1)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "slug", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "TextArray" + ] + }, + "nullable": [ + false + ] + }, + "hash": "38ca6c4bca81a0762e6e2db08a05ef0ba191d37199165d2745c64a4036e20790" +} diff --git a/.sqlx/query-3a46fdff86a84ce2140ad14a5bdc951c1d43e600ef5bc25d23c1fe42f6136869.json b/crates/bin/docs_rs_web/.sqlx/query-3a46fdff86a84ce2140ad14a5bdc951c1d43e600ef5bc25d23c1fe42f6136869.json similarity index 100% rename from .sqlx/query-3a46fdff86a84ce2140ad14a5bdc951c1d43e600ef5bc25d23c1fe42f6136869.json rename to crates/bin/docs_rs_web/.sqlx/query-3a46fdff86a84ce2140ad14a5bdc951c1d43e600ef5bc25d23c1fe42f6136869.json diff --git a/crates/bin/docs_rs_web/.sqlx/query-3aac87e4968ad4d83991de6b4ec164c44f00495b3a9a2e9b5ae460697a19278f.json b/crates/bin/docs_rs_web/.sqlx/query-3aac87e4968ad4d83991de6b4ec164c44f00495b3a9a2e9b5ae460697a19278f.json new file mode 100644 index 000000000..ab68991d0 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-3aac87e4968ad4d83991de6b4ec164c44f00495b3a9a2e9b5ae460697a19278f.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO keyword_rels (rid, kid)\n SELECT $1 as rid, id as kid\n FROM keywords\n WHERE slug = ANY($2)\n ON CONFLICT DO NOTHING;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "TextArray" + ] + }, + "nullable": [] + }, + "hash": "3aac87e4968ad4d83991de6b4ec164c44f00495b3a9a2e9b5ae460697a19278f" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-4115addabb6f03cd0de31ac2ddeafd6797b25b99a7112cb68a93a4fac5b07a23.json b/crates/bin/docs_rs_web/.sqlx/query-4115addabb6f03cd0de31ac2ddeafd6797b25b99a7112cb68a93a4fac5b07a23.json new file mode 100644 index 000000000..aed78ccde --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-4115addabb6f03cd0de31ac2ddeafd6797b25b99a7112cb68a93a4fac5b07a23.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT id as \"id: CrateId\" FROM crates WHERE crates.name = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id: CrateId", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "4115addabb6f03cd0de31ac2ddeafd6797b25b99a7112cb68a93a4fac5b07a23" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-440b3d15186a21435c470279a5c482315132d6baff4c517df246bc39638f5527.json b/crates/bin/docs_rs_web/.sqlx/query-440b3d15186a21435c470279a5c482315132d6baff4c517df246bc39638f5527.json new file mode 100644 index 000000000..a88c69335 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-440b3d15186a21435c470279a5c482315132d6baff4c517df246bc39638f5527.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT host_id\n FROM repositories\n WHERE host = $1 AND updated_at < NOW() - INTERVAL '1 day';", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "host_id", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "440b3d15186a21435c470279a5c482315132d6baff4c517df246bc39638f5527" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json b/crates/bin/docs_rs_web/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json new file mode 100644 index 000000000..ca0a44f4b --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84.json @@ -0,0 +1,87 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n releases.id as \"id: ReleaseId\",\n releases.version as \"version: Version\",\n release_build_status.build_status as \"build_status!: BuildStatus\",\n releases.yanked,\n releases.is_library,\n releases.rustdoc_status,\n releases.release_time,\n releases.target_name,\n releases.default_target,\n releases.doc_targets\n FROM releases\n INNER JOIN release_build_status ON releases.id = release_build_status.rid\n WHERE\n releases.crate_id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id: ReleaseId", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "version: Version", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "build_status!: BuildStatus", + "type_info": { + "Custom": { + "name": "build_status", + "kind": { + "Enum": [ + "in_progress", + "success", + "failure" + ] + } + } + } + }, + { + "ordinal": 3, + "name": "yanked", + "type_info": "Bool" + }, + { + "ordinal": 4, + "name": "is_library", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "rustdoc_status", + "type_info": "Bool" + }, + { + "ordinal": 6, + "name": "release_time", + "type_info": "Timestamptz" + }, + { + "ordinal": 7, + "name": "target_name", + "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "default_target", + "type_info": "Varchar" + }, + { + "ordinal": 9, + "name": "doc_targets", + "type_info": "Json" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + true, + true, + true, + true, + true, + true, + true + ] + }, + "hash": "4894c7d8c4e354dca1d952362b2e0cb25441e8e65b273e01ed86d2d3ecebfe84" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-48eac6628305a8235aa12b45e1299615bfce99d0e693739d5d497f37600a6349.json b/crates/bin/docs_rs_web/.sqlx/query-48eac6628305a8235aa12b45e1299615bfce99d0e693739d5d497f37600a6349.json new file mode 100644 index 000000000..ae5a0b475 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-48eac6628305a8235aa12b45e1299615bfce99d0e693739d5d497f37600a6349.json @@ -0,0 +1,53 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n id,\n name as \"name: KrateName\",\n version as \"version: Version\",\n priority,\n registry,\n attempt\n FROM queue\n WHERE\n attempt < $1 AND\n (last_attempt IS NULL OR last_attempt < NOW() - make_interval(secs => $2))\n ORDER BY priority ASC, attempt ASC, id ASC\n LIMIT 1\n FOR UPDATE SKIP LOCKED", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name: KrateName", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "version: Version", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "priority", + "type_info": "Int4" + }, + { + "ordinal": 4, + "name": "registry", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "attempt", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4", + "Float8" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + false + ] + }, + "hash": "48eac6628305a8235aa12b45e1299615bfce99d0e693739d5d497f37600a6349" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-494e6b594aba915ba2582eca4797b13012576b2800c257ae3b0d3b7706c69a2c.json b/crates/bin/docs_rs_web/.sqlx/query-494e6b594aba915ba2582eca4797b13012576b2800c257ae3b0d3b7706c69a2c.json new file mode 100644 index 000000000..cf141db65 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-494e6b594aba915ba2582eca4797b13012576b2800c257ae3b0d3b7706c69a2c.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO doc_coverage (\n release_id, total_items, documented_items,\n total_items_needing_examples, items_with_examples\n )\n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (release_id) DO UPDATE\n SET\n total_items = $2,\n documented_items = $3,\n total_items_needing_examples = $4,\n items_with_examples = $5\n RETURNING release_id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "release_id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4", + "Int4", + "Int4", + "Int4", + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "494e6b594aba915ba2582eca4797b13012576b2800c257ae3b0d3b7706c69a2c" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-4a6887c2d436121cb2ba6a9c5069455b8f222d929672dc1ff810fa49c2940e2c.json b/crates/bin/docs_rs_web/.sqlx/query-4a6887c2d436121cb2ba6a9c5069455b8f222d929672dc1ff810fa49c2940e2c.json new file mode 100644 index 000000000..530c4d879 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-4a6887c2d436121cb2ba6a9c5069455b8f222d929672dc1ff810fa49c2940e2c.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO config (name, value)\n VALUES ($1, $2)\n ON CONFLICT (name) DO UPDATE SET value = $2;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Json" + ] + }, + "nullable": [] + }, + "hash": "4a6887c2d436121cb2ba6a9c5069455b8f222d929672dc1ff810fa49c2940e2c" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-4b13fe2c8df2b8b8bf019344313b2bc6442482a604cf90fb6106154f8e69a1c2.json b/crates/bin/docs_rs_web/.sqlx/query-4b13fe2c8df2b8b8bf019344313b2bc6442482a604cf90fb6106154f8e69a1c2.json new file mode 100644 index 000000000..6d306761e --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-4b13fe2c8df2b8b8bf019344313b2bc6442482a604cf90fb6106154f8e69a1c2.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE\n FROM queue\n WHERE\n name = $1 AND\n version = $2\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "4b13fe2c8df2b8b8bf019344313b2bc6442482a604cf90fb6106154f8e69a1c2" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-4b4bfd97b03f632357a68c84f281c286fa0ec399ed98db0dda1ee81e6a6e7f3a.json b/crates/bin/docs_rs_web/.sqlx/query-4b4bfd97b03f632357a68c84f281c286fa0ec399ed98db0dda1ee81e6a6e7f3a.json new file mode 100644 index 000000000..dd15d3dde --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-4b4bfd97b03f632357a68c84f281c286fa0ec399ed98db0dda1ee81e6a6e7f3a.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO releases (crate_id, version, archive_storage)\n VALUES ($1, $2, TRUE)\n ON CONFLICT (crate_id, version) DO UPDATE\n SET -- this `SET` is needed so the id is always returned.\n version = EXCLUDED.version\n RETURNING id as \"id: ReleaseId\" ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id: ReleaseId", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "4b4bfd97b03f632357a68c84f281c286fa0ec399ed98db0dda1ee81e6a6e7f3a" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-4f81678f0d680c4be7215ef0667729e8518063e0ee4ecad5aa7e559e88b8e1cb.json b/crates/bin/docs_rs_web/.sqlx/query-4f81678f0d680c4be7215ef0667729e8518063e0ee4ecad5aa7e559e88b8e1cb.json new file mode 100644 index 000000000..a95b272dd --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-4f81678f0d680c4be7215ef0667729e8518063e0ee4ecad5aa7e559e88b8e1cb.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT id FROM crates WHERE crates.name = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "4f81678f0d680c4be7215ef0667729e8518063e0ee4ecad5aa7e559e88b8e1cb" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-543694448dbb43af41dc18c29017c5b211f45f7722811fdcabea26f796d4514b.json b/crates/bin/docs_rs_web/.sqlx/query-543694448dbb43af41dc18c29017c5b211f45f7722811fdcabea26f796d4514b.json new file mode 100644 index 000000000..d3de58075 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-543694448dbb43af41dc18c29017c5b211f45f7722811fdcabea26f796d4514b.json @@ -0,0 +1,64 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n crates.name as \"name: KrateName\",\n releases.version as \"version: Version\",\n releases.description,\n release_build_status.last_build_time,\n releases.target_name,\n releases.rustdoc_status,\n repositories.stars as \"stars?\",\n EXISTS (\n SELECT 1\n FROM releases AS all_releases\n WHERE\n all_releases.crate_id = crates.id AND\n all_releases.yanked = false\n ) AS has_unyanked_releases\n\n FROM crates\n INNER JOIN releases ON crates.latest_version_id = releases.id\n INNER JOIN release_build_status ON releases.id = release_build_status.rid\n LEFT JOIN repositories ON releases.repository_id = repositories.id\n\n WHERE\n crates.name = ANY($1) AND\n release_build_status.build_status <> 'in_progress'", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "name: KrateName", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "version: Version", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "description", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "last_build_time", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "target_name", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "rustdoc_status", + "type_info": "Bool" + }, + { + "ordinal": 6, + "name": "stars?", + "type_info": "Int4" + }, + { + "ordinal": 7, + "name": "has_unyanked_releases", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "TextArray" + ] + }, + "nullable": [ + false, + false, + true, + true, + true, + true, + false, + null + ] + }, + "hash": "543694448dbb43af41dc18c29017c5b211f45f7722811fdcabea26f796d4514b" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-58c1056e05fa7efdd691ad1c568bc00ec0f7c56584bdbe9d88963cc2f7ed7133.json b/crates/bin/docs_rs_web/.sqlx/query-58c1056e05fa7efdd691ad1c568bc00ec0f7c56584bdbe9d88963cc2f7ed7133.json new file mode 100644 index 000000000..cd88562f2 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-58c1056e05fa7efdd691ad1c568bc00ec0f7c56584bdbe9d88963cc2f7ed7133.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO keywords (name, slug) VALUES ($1, $2)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "58c1056e05fa7efdd691ad1c568bc00ec0f7c56584bdbe9d88963cc2f7ed7133" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-5ad9cd6cd9d444d258f7486fda178d4dd071cf43cb0ea950574af8e2f37b4a21.json b/crates/bin/docs_rs_web/.sqlx/query-5ad9cd6cd9d444d258f7486fda178d4dd071cf43cb0ea950574af8e2f37b4a21.json new file mode 100644 index 000000000..264e19fd2 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-5ad9cd6cd9d444d258f7486fda178d4dd071cf43cb0ea950574af8e2f37b4a21.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT value FROM config WHERE name = $1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "value", + "type_info": "Json" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "5ad9cd6cd9d444d258f7486fda178d4dd071cf43cb0ea950574af8e2f37b4a21" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-5b401b6a191f7364be11110c23228933120dc7c39d0ef436ececc8bee9695c05.json b/crates/bin/docs_rs_web/.sqlx/query-5b401b6a191f7364be11110c23228933120dc7c39d0ef436ececc8bee9695c05.json new file mode 100644 index 000000000..cc79bd27a --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-5b401b6a191f7364be11110c23228933120dc7c39d0ef436ececc8bee9695c05.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE releases SET repository_id = $1 WHERE id = $2;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "5b401b6a191f7364be11110c23228933120dc7c39d0ef436ececc8bee9695c05" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-5cf9b185b54dde447b6ba1458178c4fad4c75e72c6a7b7735d17835b9b746ac3.json b/crates/bin/docs_rs_web/.sqlx/query-5cf9b185b54dde447b6ba1458178c4fad4c75e72c6a7b7735d17835b9b746ac3.json new file mode 100644 index 000000000..92b428002 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-5cf9b185b54dde447b6ba1458178c4fad4c75e72c6a7b7735d17835b9b746ac3.json @@ -0,0 +1,61 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE releases\n SET release_time = $2,\n dependencies = $3,\n target_name = $4,\n yanked = $5,\n rustdoc_status = $6,\n test_status = $7,\n license = $8,\n repository_url = $9,\n homepage_url = $10,\n description = $11,\n description_long = $12,\n readme = $13,\n keywords = $14,\n have_examples = $15,\n downloads = $16,\n files = $17,\n doc_targets = $18,\n is_library = $19,\n documentation_url = $20,\n default_target = $21,\n features = $22,\n repository_id = $23,\n archive_storage = $24,\n source_size = $25\n WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Timestamptz", + "Json", + "Varchar", + "Bool", + "Bool", + "Bool", + "Varchar", + "Varchar", + "Varchar", + "Varchar", + "Varchar", + "Varchar", + "Json", + "Bool", + "Int4", + "Json", + "Json", + "Bool", + "Varchar", + "Varchar", + { + "Custom": { + "name": "feature[]", + "kind": { + "Array": { + "Custom": { + "name": "feature", + "kind": { + "Composite": [ + [ + "name", + "Text" + ], + [ + "subfeatures", + "TextArray" + ] + ] + } + } + } + } + } + }, + "Int4", + "Bool", + "Int8" + ] + }, + "nullable": [] + }, + "hash": "5cf9b185b54dde447b6ba1458178c4fad4c75e72c6a7b7735d17835b9b746ac3" +} diff --git a/.sqlx/query-5f31665c91028ac845408991812b704acf7b879860b7e5c55a1df04202e0ec65.json b/crates/bin/docs_rs_web/.sqlx/query-5f31665c91028ac845408991812b704acf7b879860b7e5c55a1df04202e0ec65.json similarity index 100% rename from .sqlx/query-5f31665c91028ac845408991812b704acf7b879860b7e5c55a1df04202e0ec65.json rename to crates/bin/docs_rs_web/.sqlx/query-5f31665c91028ac845408991812b704acf7b879860b7e5c55a1df04202e0ec65.json diff --git a/.sqlx/query-61e8789f7d2ddcfa951dc86c5f455cf4451f8f3b683c6bd1033e8ebaab97692e.json b/crates/bin/docs_rs_web/.sqlx/query-61e8789f7d2ddcfa951dc86c5f455cf4451f8f3b683c6bd1033e8ebaab97692e.json similarity index 100% rename from .sqlx/query-61e8789f7d2ddcfa951dc86c5f455cf4451f8f3b683c6bd1033e8ebaab97692e.json rename to crates/bin/docs_rs_web/.sqlx/query-61e8789f7d2ddcfa951dc86c5f455cf4451f8f3b683c6bd1033e8ebaab97692e.json diff --git a/crates/bin/docs_rs_web/.sqlx/query-688c28ae99e5511238a6cbe1c53e3abc3924b4ecffc216e1556a53dda936ceae.json b/crates/bin/docs_rs_web/.sqlx/query-688c28ae99e5511238a6cbe1c53e3abc3924b4ecffc216e1556a53dda936ceae.json new file mode 100644 index 000000000..dcc82bf13 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-688c28ae99e5511238a6cbe1c53e3abc3924b4ecffc216e1556a53dda936ceae.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO blacklisted_crates (crate_name) VALUES ($1);", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "688c28ae99e5511238a6cbe1c53e3abc3924b4ecffc216e1556a53dda936ceae" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-718576e299a41495b28c843737921e3493a61c0629a9d9a5d04066d443663965.json b/crates/bin/docs_rs_web/.sqlx/query-718576e299a41495b28c843737921e3493a61c0629a9d9a5d04066d443663965.json new file mode 100644 index 000000000..032419e27 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-718576e299a41495b28c843737921e3493a61c0629a9d9a5d04066d443663965.json @@ -0,0 +1,29 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO repositories (\n host, host_id, name, description, last_commit, stars, forks, issues, updated_at\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, NOW())\n ON CONFLICT (host, host_id) DO\n UPDATE SET\n name = $3,\n description = $4,\n last_commit = $5,\n stars = $6,\n forks = $7,\n issues = $8,\n updated_at = NOW()\n RETURNING id;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + "Varchar", + "Timestamptz", + "Int4", + "Int4", + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "718576e299a41495b28c843737921e3493a61c0629a9d9a5d04066d443663965" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-73ff86cdb5b9d0ab312493690d4108803ce04531d497d6dd8d67ad05a844eab3.json b/crates/bin/docs_rs_web/.sqlx/query-73ff86cdb5b9d0ab312493690d4108803ce04531d497d6dd8d67ad05a844eab3.json new file mode 100644 index 000000000..6f21daee0 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-73ff86cdb5b9d0ab312493690d4108803ce04531d497d6dd8d67ad05a844eab3.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO sandbox_overrides (\n crate_name, max_memory_bytes, max_targets, timeout_seconds\n )\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (crate_name) DO UPDATE\n SET\n max_memory_bytes = $2,\n max_targets = $3,\n timeout_seconds = $4\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Int8", + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "73ff86cdb5b9d0ab312493690d4108803ce04531d497d6dd8d67ad05a844eab3" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-743604e86c489f7f330adf83d66c810678cd8bbee215532ce26f2c4e76e54a67.json b/crates/bin/docs_rs_web/.sqlx/query-743604e86c489f7f330adf83d66c810678cd8bbee215532ce26f2c4e76e54a67.json new file mode 100644 index 000000000..55b209a3f --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-743604e86c489f7f330adf83d66c810678cd8bbee215532ce26f2c4e76e54a67.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO queue (name, version, priority, registry)\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (name, version) DO UPDATE\n SET priority = EXCLUDED.priority,\n registry = EXCLUDED.registry,\n attempt = 0,\n last_attempt = NULL\n ;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Int4", + "Text" + ] + }, + "nullable": [] + }, + "hash": "743604e86c489f7f330adf83d66c810678cd8bbee215532ce26f2c4e76e54a67" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-7544bfef94310c33c8d34c30bc24e91b4aa2f198c1efd0f9ef562c0b85f4dddb.json b/crates/bin/docs_rs_web/.sqlx/query-7544bfef94310c33c8d34c30bc24e91b4aa2f198c1efd0f9ef562c0b85f4dddb.json new file mode 100644 index 000000000..1928a3804 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-7544bfef94310c33c8d34c30bc24e91b4aa2f198c1efd0f9ef562c0b85f4dddb.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO release_build_status(rid, last_build_time, build_status)\n SELECT\n summary.id,\n summary.last_build_time,\n CASE\n WHEN summary.success_count > 0 THEN 'success'::build_status\n WHEN summary.failure_count > 0 THEN 'failure'::build_status\n ELSE 'in_progress'::build_status\n END as build_status\n\n FROM (\n SELECT\n r.id,\n MAX(b.build_finished) as last_build_time,\n SUM(CASE WHEN b.build_status = 'success' THEN 1 ELSE 0 END) as success_count,\n SUM(CASE WHEN b.build_status = 'failure' THEN 1 ELSE 0 END) as failure_count\n FROM\n releases as r\n LEFT OUTER JOIN builds AS b on b.rid = r.id\n WHERE\n r.id = $1\n GROUP BY r.id\n ) as summary\n\n ON CONFLICT (rid) DO UPDATE\n SET\n last_build_time = EXCLUDED.last_build_time,\n build_status=EXCLUDED.build_status", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "7544bfef94310c33c8d34c30bc24e91b4aa2f198c1efd0f9ef562c0b85f4dddb" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-75aa15d4c8898403835cdaf3d27c9973a3f45abc9cf73e171011a2ded4d97dfc.json b/crates/bin/docs_rs_web/.sqlx/query-75aa15d4c8898403835cdaf3d27c9973a3f45abc9cf73e171011a2ded4d97dfc.json new file mode 100644 index 000000000..60e1078e6 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-75aa15d4c8898403835cdaf3d27c9973a3f45abc9cf73e171011a2ded4d97dfc.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE builds\n SET\n build_status = 'failure',\n errors = $2\n WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Text" + ] + }, + "nullable": [] + }, + "hash": "75aa15d4c8898403835cdaf3d27c9973a3f45abc9cf73e171011a2ded4d97dfc" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-7c7149524e09ebc1578b1806643b3c5be340e9f9a60e994e6da80b2e9302a168.json b/crates/bin/docs_rs_web/.sqlx/query-7c7149524e09ebc1578b1806643b3c5be340e9f9a60e994e6da80b2e9302a168.json new file mode 100644 index 000000000..59d4a4eaf --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-7c7149524e09ebc1578b1806643b3c5be340e9f9a60e994e6da80b2e9302a168.json @@ -0,0 +1,52 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n id,\n name as \"name: KrateName\",\n version as \"version: Version\",\n priority,\n registry,\n attempt\n FROM queue\n WHERE attempt < $1\n ORDER BY priority ASC, attempt ASC, id ASC", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name: KrateName", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "version: Version", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "priority", + "type_info": "Int4" + }, + { + "ordinal": 4, + "name": "registry", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "attempt", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + false + ] + }, + "hash": "7c7149524e09ebc1578b1806643b3c5be340e9f9a60e994e6da80b2e9302a168" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-7fda06d8c2a6cac88f9bf06b3480f07d801c711693e19ee40991f069b2393fec.json b/crates/bin/docs_rs_web/.sqlx/query-7fda06d8c2a6cac88f9bf06b3480f07d801c711693e19ee40991f069b2393fec.json new file mode 100644 index 000000000..60bddfbca --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-7fda06d8c2a6cac88f9bf06b3480f07d801c711693e19ee40991f069b2393fec.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT crate_id as \"crate_id: CrateId\"\n FROM releases\n WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "crate_id: CrateId", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "7fda06d8c2a6cac88f9bf06b3480f07d801c711693e19ee40991f069b2393fec" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-864a659b317f451949bf793899a7ea5b78ebf8a962fbb12b88eb8f1d807fbab6.json b/crates/bin/docs_rs_web/.sqlx/query-864a659b317f451949bf793899a7ea5b78ebf8a962fbb12b88eb8f1d807fbab6.json new file mode 100644 index 000000000..cc5d0f370 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-864a659b317f451949bf793899a7ea5b78ebf8a962fbb12b88eb8f1d807fbab6.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM blacklisted_crates WHERE crate_name = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "864a659b317f451949bf793899a7ea5b78ebf8a962fbb12b88eb8f1d807fbab6" +} diff --git a/.sqlx/query-86cb6c0a4d2e6b18df6339f12a98692cb4abb0a4b62d611679c956be3fb9494f.json b/crates/bin/docs_rs_web/.sqlx/query-86cb6c0a4d2e6b18df6339f12a98692cb4abb0a4b62d611679c956be3fb9494f.json similarity index 100% rename from .sqlx/query-86cb6c0a4d2e6b18df6339f12a98692cb4abb0a4b62d611679c956be3fb9494f.json rename to crates/bin/docs_rs_web/.sqlx/query-86cb6c0a4d2e6b18df6339f12a98692cb4abb0a4b62d611679c956be3fb9494f.json diff --git a/crates/bin/docs_rs_web/.sqlx/query-87952bd450ed2c13b99bd502a73a84edd7d17e6171523ebbd57f1d9dd7c9b46c.json b/crates/bin/docs_rs_web/.sqlx/query-87952bd450ed2c13b99bd502a73a84edd7d17e6171523ebbd57f1d9dd7c9b46c.json new file mode 100644 index 000000000..8aedc7865 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-87952bd450ed2c13b99bd502a73a84edd7d17e6171523ebbd57f1d9dd7c9b46c.json @@ -0,0 +1,34 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO owners (login, avatar, kind)\n VALUES ($1, $2, $3)\n ON CONFLICT (login) DO UPDATE\n SET\n avatar = EXCLUDED.avatar,\n kind = EXCLUDED.kind\n RETURNING id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Text", + { + "Custom": { + "name": "owner_kind", + "kind": { + "Enum": [ + "user", + "team" + ] + } + } + } + ] + }, + "nullable": [ + false + ] + }, + "hash": "87952bd450ed2c13b99bd502a73a84edd7d17e6171523ebbd57f1d9dd7c9b46c" +} diff --git a/.sqlx/query-87cd28092cc0d8646d48687bedd2bbb76530bcc207d2899736b8ca6e564d2a51.json b/crates/bin/docs_rs_web/.sqlx/query-87cd28092cc0d8646d48687bedd2bbb76530bcc207d2899736b8ca6e564d2a51.json similarity index 100% rename from .sqlx/query-87cd28092cc0d8646d48687bedd2bbb76530bcc207d2899736b8ca6e564d2a51.json rename to crates/bin/docs_rs_web/.sqlx/query-87cd28092cc0d8646d48687bedd2bbb76530bcc207d2899736b8ca6e564d2a51.json diff --git a/.sqlx/query-8cdeaffe16408187897e5c8f2b0d6054a31d0a2df37a8a1d7659208092929ce8.json b/crates/bin/docs_rs_web/.sqlx/query-8cdeaffe16408187897e5c8f2b0d6054a31d0a2df37a8a1d7659208092929ce8.json similarity index 100% rename from .sqlx/query-8cdeaffe16408187897e5c8f2b0d6054a31d0a2df37a8a1d7659208092929ce8.json rename to crates/bin/docs_rs_web/.sqlx/query-8cdeaffe16408187897e5c8f2b0d6054a31d0a2df37a8a1d7659208092929ce8.json diff --git a/crates/bin/docs_rs_web/.sqlx/query-8f1900a52809215672eb6c5ca684082c77a81874c88cab453681eaa660a13ae0.json b/crates/bin/docs_rs_web/.sqlx/query-8f1900a52809215672eb6c5ca684082c77a81874c88cab453681eaa660a13ae0.json new file mode 100644 index 000000000..9af771395 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-8f1900a52809215672eb6c5ca684082c77a81874c88cab453681eaa660a13ae0.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT pattern, priority FROM crate_priorities", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "pattern", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "priority", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false + ] + }, + "hash": "8f1900a52809215672eb6c5ca684082c77a81874c88cab453681eaa660a13ae0" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-90ff19a8b5452159a09930f450d614fd5f516c362bb2c195bcbea917775b9b54.json b/crates/bin/docs_rs_web/.sqlx/query-90ff19a8b5452159a09930f450d614fd5f516c362bb2c195bcbea917775b9b54.json new file mode 100644 index 000000000..7e7ce93f0 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-90ff19a8b5452159a09930f450d614fd5f516c362bb2c195bcbea917775b9b54.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT pattern, priority FROM crate_priorities WHERE $1 LIKE pattern LIMIT 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "pattern", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "priority", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "90ff19a8b5452159a09930f450d614fd5f516c362bb2c195bcbea917775b9b54" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-915642dcaea4c90bb15b7ad4c6b3889c846d64fa11463719e65496b950ae039f.json b/crates/bin/docs_rs_web/.sqlx/query-915642dcaea4c90bb15b7ad4c6b3889c846d64fa11463719e65496b950ae039f.json new file mode 100644 index 000000000..80e54a1b7 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-915642dcaea4c90bb15b7ad4c6b3889c846d64fa11463719e65496b950ae039f.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT COUNT(*) FROM repositories", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + null + ] + }, + "hash": "915642dcaea4c90bb15b7ad4c6b3889c846d64fa11463719e65496b950ae039f" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-95bc487e596e04e5e1cfd20903d8bdb54917c2ea91a0ee9c1dad7d5290ca2e62.json b/crates/bin/docs_rs_web/.sqlx/query-95bc487e596e04e5e1cfd20903d8bdb54917c2ea91a0ee9c1dad7d5290ca2e62.json new file mode 100644 index 000000000..312fd50c3 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-95bc487e596e04e5e1cfd20903d8bdb54917c2ea91a0ee9c1dad7d5290ca2e62.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO owner_rels (cid, oid)\n SELECT $1,oid\n FROM UNNEST($2::int[]) as oid\n ON CONFLICT (cid,oid)\n DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4Array" + ] + }, + "nullable": [] + }, + "hash": "95bc487e596e04e5e1cfd20903d8bdb54917c2ea91a0ee9c1dad7d5290ca2e62" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-96b68919f9016705a1a36ef11a5a659e7fb431beb0017fbcfd21132f105ce722.json b/crates/bin/docs_rs_web/.sqlx/query-96b68919f9016705a1a36ef11a5a659e7fb431beb0017fbcfd21132f105ce722.json new file mode 100644 index 000000000..984eff3ac --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-96b68919f9016705a1a36ef11a5a659e7fb431beb0017fbcfd21132f105ce722.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT relname\n FROM pg_class\n INNER JOIN pg_namespace ON\n pg_class.relnamespace = pg_namespace.oid\n WHERE pg_class.relkind = 'S'\n AND pg_namespace.nspname = $1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "relname", + "type_info": "Name" + } + ], + "parameters": { + "Left": [ + "Name" + ] + }, + "nullable": [ + false + ] + }, + "hash": "96b68919f9016705a1a36ef11a5a659e7fb431beb0017fbcfd21132f105ce722" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-97a9b51028cbf8e585e120382efdff87417d99c179c695ded1bdb6cd584a7323.json b/crates/bin/docs_rs_web/.sqlx/query-97a9b51028cbf8e585e120382efdff87417d99c179c695ded1bdb6cd584a7323.json new file mode 100644 index 000000000..33a64a917 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-97a9b51028cbf8e585e120382efdff87417d99c179c695ded1bdb6cd584a7323.json @@ -0,0 +1,40 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT releases.id, crates.name, releases.version, releases.repository_url\n FROM releases\n INNER JOIN crates ON (crates.id = releases.crate_id)\n WHERE repository_id IS NULL AND repository_url LIKE $1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "version", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "repository_url", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false, + false, + true + ] + }, + "hash": "97a9b51028cbf8e585e120382efdff87417d99c179c695ded1bdb6cd584a7323" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-9e7595c7b9b336b24241c133870b99e1ee70e750849956d268ef1cb6df4f53d4.json b/crates/bin/docs_rs_web/.sqlx/query-9e7595c7b9b336b24241c133870b99e1ee70e750849956d268ef1cb6df4f53d4.json new file mode 100644 index 000000000..fff5127ec --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-9e7595c7b9b336b24241c133870b99e1ee70e750849956d268ef1cb6df4f53d4.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE queue\n SET\n attempt = attempt + 1,\n last_attempt = NOW()\n WHERE id = $1\n RETURNING attempt;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "attempt", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "9e7595c7b9b336b24241c133870b99e1ee70e750849956d268ef1cb6df4f53d4" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-a0253cf77dc601990a9b972f4efebae94787e8cf83c956638ee7d3ce7f137299.json b/crates/bin/docs_rs_web/.sqlx/query-a0253cf77dc601990a9b972f4efebae94787e8cf83c956638ee7d3ce7f137299.json new file mode 100644 index 000000000..220a71c4e --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-a0253cf77dc601990a9b972f4efebae94787e8cf83c956638ee7d3ce7f137299.json @@ -0,0 +1,32 @@ +{ + "db_name": "PostgreSQL", + "query": "WITH dates AS (\n -- we need this series so that days in the statistic that don't have any releases are included\n SELECT generate_series(\n CURRENT_DATE - INTERVAL '30 days',\n CURRENT_DATE - INTERVAL '1 day',\n '1 day'::interval\n )::date AS date_\n ),\n release_stats AS (\n SELECT\n release_time::date AS date_,\n SUM(CAST(\n release_build_status.build_status != 'in_progress' AS INT\n )) AS counts,\n SUM(CAST((\n is_library = TRUE AND\n release_build_status.build_status = 'failure'\n ) AS INT)) AS failures\n FROM releases\n INNER JOIN release_build_status ON releases.id = release_build_status.rid\n\n WHERE\n release_time >= CURRENT_DATE - INTERVAL '30 days' AND\n release_time < CURRENT_DATE\n GROUP BY\n release_time::date\n )\n SELECT\n dates.date_ AS \"date!\",\n COALESCE(rs.counts, 0) AS \"counts!\",\n COALESCE(rs.failures, 0) AS \"failures!\"\n FROM\n dates\n LEFT OUTER JOIN Release_stats AS rs ON dates.date_ = rs.date_\n\n ORDER BY\n dates.date_\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "date!", + "type_info": "Date" + }, + { + "ordinal": 1, + "name": "counts!", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "failures!", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + null, + null, + null + ] + }, + "hash": "a0253cf77dc601990a9b972f4efebae94787e8cf83c956638ee7d3ce7f137299" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-a2c5c46a3e0058c3bd23d62f1844e3ca5d6b118da33795449e9386525eea912f.json b/crates/bin/docs_rs_web/.sqlx/query-a2c5c46a3e0058c3bd23d62f1844e3ca5d6b118da33795449e9386525eea912f.json new file mode 100644 index 000000000..b54abcdb0 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-a2c5c46a3e0058c3bd23d62f1844e3ca5d6b118da33795449e9386525eea912f.json @@ -0,0 +1,71 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n builds.rustc_version,\n builds.docsrs_version,\n builds.build_status as \"build_status: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n builds.output,\n builds.errors,\n releases.default_target\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE builds.id = $1 AND crates.name = $2 AND releases.version = $3", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "rustc_version", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "docsrs_version", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "build_status: BuildStatus", + "type_info": { + "Custom": { + "name": "build_status", + "kind": { + "Enum": [ + "in_progress", + "success", + "failure" + ] + } + } + } + }, + { + "ordinal": 3, + "name": "build_time", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "output", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "errors", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "default_target", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Int4", + "Text", + "Text" + ] + }, + "nullable": [ + true, + true, + false, + null, + true, + true, + true + ] + }, + "hash": "a2c5c46a3e0058c3bd23d62f1844e3ca5d6b118da33795449e9386525eea912f" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-a3920d6701d1a80f23562ee83682d82ff35a52eeaa93ed45a97adc5e559d3538.json b/crates/bin/docs_rs_web/.sqlx/query-a3920d6701d1a80f23562ee83682d82ff35a52eeaa93ed45a97adc5e559d3538.json new file mode 100644 index 000000000..87fe73890 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-a3920d6701d1a80f23562ee83682d82ff35a52eeaa93ed45a97adc5e559d3538.json @@ -0,0 +1,40 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM sandbox_overrides WHERE crate_name = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "crate_name", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "max_memory_bytes", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "timeout_seconds", + "type_info": "Int4" + }, + { + "ordinal": 3, + "name": "max_targets", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + true, + true, + true + ] + }, + "hash": "a3920d6701d1a80f23562ee83682d82ff35a52eeaa93ed45a97adc5e559d3538" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json b/crates/bin/docs_rs_web/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json new file mode 100644 index 000000000..9439ea53a --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68.json @@ -0,0 +1,35 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO builds(rid, build_status, build_server, build_started)\n VALUES ($1, $2, $3, NOW())\n RETURNING id as \"id: BuildId\" ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id: BuildId", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4", + { + "Custom": { + "name": "build_status", + "kind": { + "Enum": [ + "in_progress", + "success", + "failure" + ] + } + } + }, + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "a708e47c863614354e9a756da43b47d6071608366fd01f0d67db0991eb588b68" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-a76e4776415625ee9d323db74a68a8670070276be0cea27a46a73f487430c5a3.json b/crates/bin/docs_rs_web/.sqlx/query-a76e4776415625ee9d323db74a68a8670070276be0cea27a46a73f487430c5a3.json new file mode 100644 index 000000000..4f561d6a6 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-a76e4776415625ee9d323db74a68a8670070276be0cea27a46a73f487430c5a3.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n priority,\n COUNT(*) as \"count!\"\n FROM queue\n WHERE attempt < $1\n GROUP BY priority", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "priority", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "count!", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + null + ] + }, + "hash": "a76e4776415625ee9d323db74a68a8670070276be0cea27a46a73f487430c5a3" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-b7d805d65e97349dde8ac57e176bc92ae7ef49af5b09b0fc532f763947bd1aee.json b/crates/bin/docs_rs_web/.sqlx/query-b7d805d65e97349dde8ac57e176bc92ae7ef49af5b09b0fc532f763947bd1aee.json new file mode 100644 index 000000000..26969a794 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-b7d805d65e97349dde8ac57e176bc92ae7ef49af5b09b0fc532f763947bd1aee.json @@ -0,0 +1,64 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n builds.id as \"id: BuildId\",\n builds.rustc_version,\n builds.docsrs_version,\n builds.build_status as \"build_status: BuildStatus\",\n COALESCE(builds.build_finished, builds.build_started) as build_time,\n builds.errors\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE\n crates.name = $1 AND\n releases.version = $2\n ORDER BY builds.id DESC", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id: BuildId", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "rustc_version", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "docsrs_version", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "build_status: BuildStatus", + "type_info": { + "Custom": { + "name": "build_status", + "kind": { + "Enum": [ + "in_progress", + "success", + "failure" + ] + } + } + } + }, + { + "ordinal": 4, + "name": "build_time", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "errors", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + true, + true, + false, + null, + true + ] + }, + "hash": "b7d805d65e97349dde8ac57e176bc92ae7ef49af5b09b0fc532f763947bd1aee" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-c8328ef704887faa486f9caebba0ba39a115b8e278ac4c6bb6b67f2dafefcfbb.json b/crates/bin/docs_rs_web/.sqlx/query-c8328ef704887faa486f9caebba0ba39a115b8e278ac4c6bb6b67f2dafefcfbb.json new file mode 100644 index 000000000..b76920724 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-c8328ef704887faa486f9caebba0ba39a115b8e278ac4c6bb6b67f2dafefcfbb.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM queue WHERE id = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "c8328ef704887faa486f9caebba0ba39a115b8e278ac4c6bb6b67f2dafefcfbb" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-cd568b56b5d3e43427218845ee19c4e9d598f61cf18eab47b36205b1aa1be301.json b/crates/bin/docs_rs_web/.sqlx/query-cd568b56b5d3e43427218845ee19c4e9d598f61cf18eab47b36205b1aa1be301.json new file mode 100644 index 000000000..5dc057abf --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-cd568b56b5d3e43427218845ee19c4e9d598f61cf18eab47b36205b1aa1be301.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM crate_priorities WHERE pattern = $1 RETURNING priority", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "priority", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "cd568b56b5d3e43427218845ee19c4e9d598f61cf18eab47b36205b1aa1be301" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-ce3c4ceec1fee051b9c9716d7e3dc94b213dc5449083dc109c1d935164e647e2.json b/crates/bin/docs_rs_web/.sqlx/query-ce3c4ceec1fee051b9c9716d7e3dc94b213dc5449083dc109c1d935164e647e2.json new file mode 100644 index 000000000..4200b5330 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-ce3c4ceec1fee051b9c9716d7e3dc94b213dc5449083dc109c1d935164e647e2.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT id FROM repositories WHERE name = $1 AND host = $2 LIMIT 1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "ce3c4ceec1fee051b9c9716d7e3dc94b213dc5449083dc109c1d935164e647e2" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json b/crates/bin/docs_rs_web/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json new file mode 100644 index 000000000..0cfc44e90 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c.json @@ -0,0 +1,244 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n crates.id AS \"crate_id: CrateId\",\n releases.id AS \"release_id: ReleaseId\",\n crates.name as \"name: KrateName\",\n releases.version,\n releases.description,\n releases.dependencies,\n releases.readme,\n releases.description_long,\n releases.release_time,\n release_build_status.build_status as \"build_status!: BuildStatus\",\n -- this is the latest build ID that generated content\n -- it's used to invalidate some blob storage related caches.\n builds.id as \"latest_build_id?: BuildId\",\n releases.rustdoc_status,\n releases.archive_storage,\n releases.repository_url,\n releases.homepage_url,\n releases.keywords,\n releases.have_examples,\n releases.target_name,\n repositories.host as \"repo_host?\",\n repositories.stars as \"repo_stars?\",\n repositories.forks as \"repo_forks?\",\n repositories.issues as \"repo_issues?\",\n repositories.name as \"repo_name?\",\n releases.is_library,\n releases.yanked,\n releases.doc_targets,\n releases.license,\n releases.documentation_url,\n releases.default_target,\n releases.source_size as \"source_size?\",\n builds.documentation_size as \"documentation_size?\",\n -- we're using the rustc version here to set the correct CSS file\n -- in the metadata.\n -- So we're only interested in successful builds here.\n builds.rustc_version as \"rustc_version?\",\n doc_coverage.total_items,\n doc_coverage.documented_items,\n doc_coverage.total_items_needing_examples,\n doc_coverage.items_with_examples\n FROM releases\n INNER JOIN release_build_status ON releases.id = release_build_status.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n LEFT JOIN doc_coverage ON doc_coverage.release_id = releases.id\n LEFT JOIN repositories ON releases.repository_id = repositories.id\n LEFT JOIN LATERAL (\n SELECT rustc_version, documentation_size, id\n FROM builds\n WHERE\n builds.rid = releases.id AND\n builds.build_status = 'success'\n ORDER BY builds.build_finished\n DESC LIMIT 1\n ) AS builds ON true\n WHERE crates.name = $1 AND releases.version = $2;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "crate_id: CrateId", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "release_id: ReleaseId", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "name: KrateName", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "version", + "type_info": "Text" + }, + { + "ordinal": 4, + "name": "description", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "dependencies", + "type_info": "Json" + }, + { + "ordinal": 6, + "name": "readme", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "description_long", + "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "release_time", + "type_info": "Timestamptz" + }, + { + "ordinal": 9, + "name": "build_status!: BuildStatus", + "type_info": { + "Custom": { + "name": "build_status", + "kind": { + "Enum": [ + "in_progress", + "success", + "failure" + ] + } + } + } + }, + { + "ordinal": 10, + "name": "latest_build_id?: BuildId", + "type_info": "Int4" + }, + { + "ordinal": 11, + "name": "rustdoc_status", + "type_info": "Bool" + }, + { + "ordinal": 12, + "name": "archive_storage", + "type_info": "Bool" + }, + { + "ordinal": 13, + "name": "repository_url", + "type_info": "Varchar" + }, + { + "ordinal": 14, + "name": "homepage_url", + "type_info": "Varchar" + }, + { + "ordinal": 15, + "name": "keywords", + "type_info": "Json" + }, + { + "ordinal": 16, + "name": "have_examples", + "type_info": "Bool" + }, + { + "ordinal": 17, + "name": "target_name", + "type_info": "Varchar" + }, + { + "ordinal": 18, + "name": "repo_host?", + "type_info": "Varchar" + }, + { + "ordinal": 19, + "name": "repo_stars?", + "type_info": "Int4" + }, + { + "ordinal": 20, + "name": "repo_forks?", + "type_info": "Int4" + }, + { + "ordinal": 21, + "name": "repo_issues?", + "type_info": "Int4" + }, + { + "ordinal": 22, + "name": "repo_name?", + "type_info": "Varchar" + }, + { + "ordinal": 23, + "name": "is_library", + "type_info": "Bool" + }, + { + "ordinal": 24, + "name": "yanked", + "type_info": "Bool" + }, + { + "ordinal": 25, + "name": "doc_targets", + "type_info": "Json" + }, + { + "ordinal": 26, + "name": "license", + "type_info": "Varchar" + }, + { + "ordinal": 27, + "name": "documentation_url", + "type_info": "Varchar" + }, + { + "ordinal": 28, + "name": "default_target", + "type_info": "Varchar" + }, + { + "ordinal": 29, + "name": "source_size?", + "type_info": "Int8" + }, + { + "ordinal": 30, + "name": "documentation_size?", + "type_info": "Int8" + }, + { + "ordinal": 31, + "name": "rustc_version?", + "type_info": "Varchar" + }, + { + "ordinal": 32, + "name": "total_items", + "type_info": "Int4" + }, + { + "ordinal": 33, + "name": "documented_items", + "type_info": "Int4" + }, + { + "ordinal": 34, + "name": "total_items_needing_examples", + "type_info": "Int4" + }, + { + "ordinal": 35, + "name": "items_with_examples", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + true, + true, + true, + true, + false, + false, + true, + false, + true, + true, + true, + true, + true, + false, + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ] + }, + "hash": "cf5426dc0b94b07b8aea1fde144bbbb3caa1e6ebfb5d9348f5d27a134b82a55c" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-cf83cc24df4c285fe67808f1e1a2b56f850014b975a7506597a4ae3c5c6851aa.json b/crates/bin/docs_rs_web/.sqlx/query-cf83cc24df4c285fe67808f1e1a2b56f850014b975a7506597a4ae3c5c6851aa.json new file mode 100644 index 000000000..6bfe26455 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-cf83cc24df4c285fe67808f1e1a2b56f850014b975a7506597a4ae3c5c6851aa.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM repositories WHERE host_id = $1 AND host = $2;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "cf83cc24df4c285fe67808f1e1a2b56f850014b975a7506597a4ae3c5c6851aa" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-d16fc68c2607f6a1c94e92ca7cf95d26725b4fa8cc664a0c1474eceb67c31570.json b/crates/bin/docs_rs_web/.sqlx/query-d16fc68c2607f6a1c94e92ca7cf95d26725b4fa8cc664a0c1474eceb67c31570.json new file mode 100644 index 000000000..ba6be127c --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-d16fc68c2607f6a1c94e92ca7cf95d26725b4fa8cc664a0c1474eceb67c31570.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT COUNT(*) as \"count!\" FROM queue WHERE attempt >= $1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count!", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + null + ] + }, + "hash": "d16fc68c2607f6a1c94e92ca7cf95d26725b4fa8cc664a0c1474eceb67c31570" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-d2c3a85119eea791d48d035c4593b0fd730a139cb52ae92ac16cd662286dbe20.json b/crates/bin/docs_rs_web/.sqlx/query-d2c3a85119eea791d48d035c4593b0fd730a139cb52ae92ac16cd662286dbe20.json new file mode 100644 index 000000000..9df1cfcd5 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-d2c3a85119eea791d48d035c4593b0fd730a139cb52ae92ac16cd662286dbe20.json @@ -0,0 +1,29 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n releases.archive_storage,\n (\n SELECT id\n FROM builds\n WHERE\n builds.rid = releases.id AND\n builds.build_status = 'success'\n ORDER BY build_finished DESC\n LIMIT 1\n ) AS \"latest_build_id?: BuildId\"\n FROM releases\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE\n name = $1 AND\n version = $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "archive_storage", + "type_info": "Bool" + }, + { + "ordinal": 1, + "name": "latest_build_id?: BuildId", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + null + ] + }, + "hash": "d2c3a85119eea791d48d035c4593b0fd730a139cb52ae92ac16cd662286dbe20" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-d484acb977a659075364b39e6f021e18cb969b2d735c5e7bb08e8eb4e34f8418.json b/crates/bin/docs_rs_web/.sqlx/query-d484acb977a659075364b39e6f021e18cb969b2d735c5e7bb08e8eb4e34f8418.json new file mode 100644 index 000000000..a5bdecf4a --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-d484acb977a659075364b39e6f021e18cb969b2d735c5e7bb08e8eb4e34f8418.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n crate_name as \"crate_name: KrateName\"\n FROM blacklisted_crates\n ORDER BY crate_name asc;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "crate_name: KrateName", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false + ] + }, + "hash": "d484acb977a659075364b39e6f021e18cb969b2d735c5e7bb08e8eb4e34f8418" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-d5353f99e2f09d4264d925f26b70198ec623b7fc7a9f386dd108f2d0fcdab50c.json b/crates/bin/docs_rs_web/.sqlx/query-d5353f99e2f09d4264d925f26b70198ec623b7fc7a9f386dd108f2d0fcdab50c.json new file mode 100644 index 000000000..f6a32d74b --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-d5353f99e2f09d4264d925f26b70198ec623b7fc7a9f386dd108f2d0fcdab50c.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT 1 as \"dummy\"\n FROM releases\n INNER JOIN crates ON crates.id = releases.crate_id\n WHERE crates.name = $1 AND releases.version = $2\n LIMIT 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "dummy", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "d5353f99e2f09d4264d925f26b70198ec623b7fc7a9f386dd108f2d0fcdab50c" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-d675aff9079a87e41891c589eaffa2497eba27fcee660f3d92241eaeda02ac0f.json b/crates/bin/docs_rs_web/.sqlx/query-d675aff9079a87e41891c589eaffa2497eba27fcee660f3d92241eaeda02ac0f.json new file mode 100644 index 000000000..154247910 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-d675aff9079a87e41891c589eaffa2497eba27fcee660f3d92241eaeda02ac0f.json @@ -0,0 +1,35 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE builds\n SET\n build_status = $1,\n errors = $2\n WHERE id = $3\n RETURNING rid as \"rid: ReleaseId\" ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "rid: ReleaseId", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + { + "Custom": { + "name": "build_status", + "kind": { + "Enum": [ + "in_progress", + "success", + "failure" + ] + } + } + }, + "Text", + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "d675aff9079a87e41891c589eaffa2497eba27fcee660f3d92241eaeda02ac0f" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-d68c28ed8e41b9e3812d15e8447ad2ea418ce40868afa2fc51da3c77a3ca8d9c.json b/crates/bin/docs_rs_web/.sqlx/query-d68c28ed8e41b9e3812d15e8447ad2ea418ce40868afa2fc51da3c77a3ca8d9c.json new file mode 100644 index 000000000..b5f790a93 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-d68c28ed8e41b9e3812d15e8447ad2ea418ce40868afa2fc51da3c77a3ca8d9c.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n id as \"id: CrateId\",\n name as \"name: KrateName\"\n FROM crates\n WHERE normalize_crate_name(name) = normalize_crate_name($1)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id: CrateId", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name: KrateName", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Varchar" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "d68c28ed8e41b9e3812d15e8447ad2ea418ce40868afa2fc51da3c77a3ca8d9c" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-d87220d3f4503e99fa17815db0058ab7883bf28f216d5b5fd720c56fd8889eed.json b/crates/bin/docs_rs_web/.sqlx/query-d87220d3f4503e99fa17815db0058ab7883bf28f216d5b5fd720c56fd8889eed.json new file mode 100644 index 000000000..8c839d110 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-d87220d3f4503e99fa17815db0058ab7883bf28f216d5b5fd720c56fd8889eed.json @@ -0,0 +1,44 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT login, avatar, kind as \"kind: OwnerKind\"\n FROM owners\n INNER JOIN owner_rels ON owner_rels.oid = owners.id\n WHERE cid = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "login", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "avatar", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "kind: OwnerKind", + "type_info": { + "Custom": { + "name": "owner_kind", + "kind": { + "Enum": [ + "user", + "team" + ] + } + } + } + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "d87220d3f4503e99fa17815db0058ab7883bf28f216d5b5fd720c56fd8889eed" +} diff --git a/.sqlx/query-db4dacb4c559c87d8d6ed3b3b3e622c402acbe2080f4d0c5079251532b7ceb87.json b/crates/bin/docs_rs_web/.sqlx/query-db4dacb4c559c87d8d6ed3b3b3e622c402acbe2080f4d0c5079251532b7ceb87.json similarity index 100% rename from .sqlx/query-db4dacb4c559c87d8d6ed3b3b3e622c402acbe2080f4d0c5079251532b7ceb87.json rename to crates/bin/docs_rs_web/.sqlx/query-db4dacb4c559c87d8d6ed3b3b3e622c402acbe2080f4d0c5079251532b7ceb87.json diff --git a/crates/bin/docs_rs_web/.sqlx/query-de4ba149a561c4bb467bcea081bdedff233398cddf4996734a64536b6a8c6579.json b/crates/bin/docs_rs_web/.sqlx/query-de4ba149a561c4bb467bcea081bdedff233398cddf4996734a64536b6a8c6579.json new file mode 100644 index 000000000..945d619af --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-de4ba149a561c4bb467bcea081bdedff233398cddf4996734a64536b6a8c6579.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM sandbox_overrides WHERE crate_name = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "de4ba149a561c4bb467bcea081bdedff233398cddf4996734a64536b6a8c6579" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-df1c002b7c4f5e2567eeefff56ee51003d90122f83429313966add5b224f5f6c.json b/crates/bin/docs_rs_web/.sqlx/query-df1c002b7c4f5e2567eeefff56ee51003d90122f83429313966add5b224f5f6c.json new file mode 100644 index 000000000..ce7e21cd4 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-df1c002b7c4f5e2567eeefff56ee51003d90122f83429313966add5b224f5f6c.json @@ -0,0 +1,34 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT crates.name,\n releases.target_name,\n MAX(releases.release_time) as \"release_time!\"\n FROM crates\n INNER JOIN releases ON releases.crate_id = crates.id\n WHERE\n rustdoc_status = true AND\n crates.name ILIKE $1\n GROUP BY crates.name, releases.target_name\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "target_name", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "release_time!", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + true, + null + ] + }, + "hash": "df1c002b7c4f5e2567eeefff56ee51003d90122f83429313966add5b224f5f6c" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-e0a18d6ec1e1a0d4e14a1f2e4e4e9e8985fe619d5a502d8428af509ba1b9d9b0.json b/crates/bin/docs_rs_web/.sqlx/query-e0a18d6ec1e1a0d4e14a1f2e4e4e9e8985fe619d5a502d8428af509ba1b9d9b0.json new file mode 100644 index 000000000..7727acc22 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-e0a18d6ec1e1a0d4e14a1f2e4e4e9e8985fe619d5a502d8428af509ba1b9d9b0.json @@ -0,0 +1,52 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n releases.features as \"features?: Vec\",\n releases.dependencies\n FROM releases\n INNER JOIN crates ON crates.id = releases.crate_id\n WHERE crates.name = $1 AND releases.version = $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "features?: Vec", + "type_info": { + "Custom": { + "name": "feature[]", + "kind": { + "Array": { + "Custom": { + "name": "feature", + "kind": { + "Composite": [ + [ + "name", + "Text" + ], + [ + "subfeatures", + "TextArray" + ] + ] + } + } + } + } + } + } + }, + { + "ordinal": 1, + "name": "dependencies", + "type_info": "Json" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + true, + true + ] + }, + "hash": "e0a18d6ec1e1a0d4e14a1f2e4e4e9e8985fe619d5a502d8428af509ba1b9d9b0" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-e1a95bfd43982d86a56cf542fde99a6e5a42e56aedf068a3acf39f923eb32ade.json b/crates/bin/docs_rs_web/.sqlx/query-e1a95bfd43982d86a56cf542fde99a6e5a42e56aedf068a3acf39f923eb32ade.json new file mode 100644 index 000000000..c9bf149a6 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-e1a95bfd43982d86a56cf542fde99a6e5a42e56aedf068a3acf39f923eb32ade.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n crates.name as \"name: KrateName\",\n releases.version as \"version: Version\"\n FROM builds\n INNER JOIN releases ON releases.id = builds.rid\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE\n builds.build_status = 'in_progress'\n ORDER BY builds.id ASC", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "name: KrateName", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "version: Version", + "type_info": "Text" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false + ] + }, + "hash": "e1a95bfd43982d86a56cf542fde99a6e5a42e56aedf068a3acf39f923eb32ade" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json b/crates/bin/docs_rs_web/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json new file mode 100644 index 000000000..8699a9ded --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374.json @@ -0,0 +1,33 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT build_status AS \"build_status: BuildStatus\"\n FROM release_build_status\n WHERE rid = $1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "build_status: BuildStatus", + "type_info": { + "Custom": { + "name": "build_status", + "kind": { + "Enum": [ + "in_progress", + "success", + "failure" + ] + } + } + } + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "e3216009b040994f88958082b518e2bbdb89147a2ef8b29e85bb9695c4bc8374" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-e4c989a6678cff1c7187dd737f97d0548e814d98b6e161de1c39457d25c10e3b.json b/crates/bin/docs_rs_web/.sqlx/query-e4c989a6678cff1c7187dd737f97d0548e814d98b6e161de1c39457d25c10e3b.json new file mode 100644 index 000000000..150257361 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-e4c989a6678cff1c7187dd737f97d0548e814d98b6e161de1c39457d25c10e3b.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT 1 FROM blacklisted_crates WHERE crate_name = $1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "e4c989a6678cff1c7187dd737f97d0548e814d98b6e161de1c39457d25c10e3b" +} diff --git a/.sqlx/query-ec35a33dd4ea3758a2f82ac5a441e60ca47f46dde782fce4fdcb42789cf2fd16.json b/crates/bin/docs_rs_web/.sqlx/query-ec35a33dd4ea3758a2f82ac5a441e60ca47f46dde782fce4fdcb42789cf2fd16.json similarity index 100% rename from .sqlx/query-ec35a33dd4ea3758a2f82ac5a441e60ca47f46dde782fce4fdcb42789cf2fd16.json rename to crates/bin/docs_rs_web/.sqlx/query-ec35a33dd4ea3758a2f82ac5a441e60ca47f46dde782fce4fdcb42789cf2fd16.json diff --git a/crates/bin/docs_rs_web/.sqlx/query-f4765711eacc30103180cabe501b9c37ae3bbe46dceaa7e9332e8c898aed659c.json b/crates/bin/docs_rs_web/.sqlx/query-f4765711eacc30103180cabe501b9c37ae3bbe46dceaa7e9332e8c898aed659c.json new file mode 100644 index 000000000..403de85f9 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-f4765711eacc30103180cabe501b9c37ae3bbe46dceaa7e9332e8c898aed659c.json @@ -0,0 +1,24 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT id\n FROM queue\n WHERE\n attempt < $1 AND\n name = $2 AND\n version = $3\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4", + "Text", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "f4765711eacc30103180cabe501b9c37ae3bbe46dceaa7e9332e8c898aed659c" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-f8b389df3451e4b5e6539e9260ba6340edf69c7dba22e667aedd510e868b0f00.json b/crates/bin/docs_rs_web/.sqlx/query-f8b389df3451e4b5e6539e9260ba6340edf69c7dba22e667aedd510e868b0f00.json new file mode 100644 index 000000000..937d9c012 --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-f8b389df3451e4b5e6539e9260ba6340edf69c7dba22e667aedd510e868b0f00.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE\n FROM queue\n WHERE name = $1\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "f8b389df3451e4b5e6539e9260ba6340edf69c7dba22e667aedd510e868b0f00" +} diff --git a/crates/bin/docs_rs_web/.sqlx/query-fe36361977b1d8857f1bbd4d1c30ef29516987d053d35a9afc0a09fee31cd1c8.json b/crates/bin/docs_rs_web/.sqlx/query-fe36361977b1d8857f1bbd4d1c30ef29516987d053d35a9afc0a09fee31cd1c8.json new file mode 100644 index 000000000..4223b877d --- /dev/null +++ b/crates/bin/docs_rs_web/.sqlx/query-fe36361977b1d8857f1bbd4d1c30ef29516987d053d35a9afc0a09fee31cd1c8.json @@ -0,0 +1,38 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n crate_name as \"crate_name: KrateName\",\n max_memory_bytes,\n timeout_seconds,\n max_targets\n FROM sandbox_overrides\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "crate_name: KrateName", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "max_memory_bytes", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "timeout_seconds", + "type_info": "Int4" + }, + { + "ordinal": 3, + "name": "max_targets", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + true, + true, + true + ] + }, + "hash": "fe36361977b1d8857f1bbd4d1c30ef29516987d053d35a9afc0a09fee31cd1c8" +} diff --git a/crates/bin/docs_rs_web/Cargo.toml b/crates/bin/docs_rs_web/Cargo.toml new file mode 100644 index 000000000..0e1e9ea14 --- /dev/null +++ b/crates/bin/docs_rs_web/Cargo.toml @@ -0,0 +1,96 @@ +[package] +name = "docs_rs_web" +version = "0.1.0" +edition = "2024" +build = "build.rs" + +[dependencies] +anyhow = { workspace = true } +askama = { workspace = true } +async-stream = { workspace = true } +axum = { version = "0.8.1", features = ["macros"] } +axum-extra = { workspace = true } +base64 = { workspace = true } +bon = { workspace = true } +chrono = { workspace = true } +clap = { workspace = true } +comrak = { version = "0.49.0", default-features = false } +constant_time_eq = "0.4.2" +derive_more = { workspace = true } +docs_rs_build_limits = { path = "../../lib/docs_rs_build_limits" } +docs_rs_build_queue = { path = "../../lib/docs_rs_build_queue" } +docs_rs_cargo_metadata = { path = "../../lib/docs_rs_cargo_metadata" } +docs_rs_context = { path = "../../lib/docs_rs_context" } +docs_rs_database = { path = "../../lib/docs_rs_database" } +docs_rs_env_vars = { path = "../../lib/docs_rs_env_vars" } +docs_rs_headers = { path = "../../lib/docs_rs_headers" } +docs_rs_logging = { path = "../../lib/docs_rs_logging" } +docs_rs_mimes = { path = "../../lib/docs_rs_mimes" } +docs_rs_opentelemetry = { path = "../../lib/docs_rs_opentelemetry" } +docs_rs_registry_api = { path = "../../lib/docs_rs_registry_api" } +docs_rs_storage = { path = "../../lib/docs_rs_storage" } +docs_rs_types = { path = "../../lib/docs_rs_types" } +docs_rs_uri = { path = "../../lib/docs_rs_uri" } +docs_rs_utils = { path = "../../lib/docs_rs_utils" } +font-awesome-as-a-crate = { path = "../../lib/font-awesome-as-a-crate" } +futures-util = { workspace = true } +getrandom = "0.3.1" +http = { workspace = true } +itertools = { workspace = true } +lol_html = "2.0.0" +mime = { workspace = true } +num_cpus = "1.15.0" +opentelemetry = { workspace = true } +phf = "0.13.1" +postcard = { workspace = true } +rayon = { workspace = true } +regex = { workspace = true } +reqwest = { workspace = true } +sentry = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +slug = { workspace = true } +sqlx = { workspace = true } +syntect = { version = "5.0.0", default-features = false, features = ["parsing", "html", "dump-load", "regex-onig"] } +thiserror = { workspace = true } +tokio = { workspace = true } +tokio-util = { version = "0.7.15", default-features = false, features = ["io"] } +toml = { workspace = true } +tower = "0.5.1" +tower-http = { version = "0.6.0", features = ["fs", "trace", "timeout", "catch-panic"] } +tracing = { workspace = true } +tracing-futures= { version = "0.2.5", features = ["std-future", "futures-03"] } +url = { workspace = true } + +[build-dependencies] +anyhow = { version = "1.0.42", features = ["backtrace"] } +grass = { version = "0.13.1", default-features = false } +md5 = "0.8.0" +phf_codegen = "0.13" +syntect = { version = "5.0.0", default-features = false, features = ["parsing", "dump-create", "yaml-load", "regex-onig"] } +time = "0.3" +walkdir = { workspace = true } + +[dev-dependencies] +docs_rs_builder = { path = "../docs_rs_builder" } +docs_rs_context = { path = "../../lib/docs_rs_context", features = ["testing"] } +docs_rs_database = { path = "../../lib/docs_rs_database", features = ["testing"] } +docs_rs_headers = { path = "../../lib/docs_rs_headers", features = ["testing"] } +docs_rs_storage = { path = "../../lib/docs_rs_storage", features = ["testing"] } +docs_rs_test_fakes = { path = "../../lib/docs_rs_test_fakes" } +docs_rs_types = { path = "../../lib/docs_rs_types", features = ["testing"] } +http-body-util = "0.1.0" +indoc = "2.0.0" +kuchikiki = "0.8" +mockito = { workspace = true } +opentelemetry_sdk = { workspace = true } +pretty_assertions = { workspace = true } +test-case = { workspace = true } +walkdir = { workspace = true } + +[package.metadata.cargo-machete] +ignored = [ + "phf", # used in build script output + "slug", # used in askama templates, can be moved to web binary +] + diff --git a/assets/syntaxes/Extras/JavaScript (Babel).sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Extras/JavaScript (Babel).sublime-syntax similarity index 100% rename from assets/syntaxes/Extras/JavaScript (Babel).sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Extras/JavaScript (Babel).sublime-syntax diff --git a/assets/syntaxes/Extras/TOML/.gitignore b/crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/.gitignore similarity index 100% rename from assets/syntaxes/Extras/TOML/.gitignore rename to crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/.gitignore diff --git a/assets/syntaxes/Extras/TOML/Comments.YAML-tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/Comments.YAML-tmPreferences similarity index 100% rename from assets/syntaxes/Extras/TOML/Comments.YAML-tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/Comments.YAML-tmPreferences diff --git a/assets/syntaxes/Extras/TOML/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Extras/TOML/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/Comments.tmPreferences diff --git a/assets/syntaxes/Extras/TOML/LICENSE b/crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/LICENSE similarity index 100% rename from assets/syntaxes/Extras/TOML/LICENSE rename to crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/LICENSE diff --git a/assets/syntaxes/Extras/TOML/README.md b/crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/README.md similarity index 100% rename from assets/syntaxes/Extras/TOML/README.md rename to crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/README.md diff --git a/assets/syntaxes/Extras/TOML/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Extras/TOML/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/Symbol List.tmPreferences diff --git a/assets/syntaxes/Extras/TOML/TOML.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/TOML.sublime-syntax similarity index 100% rename from assets/syntaxes/Extras/TOML/TOML.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/TOML.sublime-syntax diff --git a/assets/syntaxes/Extras/TOML/syntax_test_toml.toml b/crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/syntax_test_toml.toml similarity index 100% rename from assets/syntaxes/Extras/TOML/syntax_test_toml.toml rename to crates/bin/docs_rs_web/assets/syntaxes/Extras/TOML/syntax_test_toml.toml diff --git a/assets/syntaxes/Packages/.github/ISSUE_TEMPLATE/01-bug-syntax-highlighting.md b/crates/bin/docs_rs_web/assets/syntaxes/Packages/.github/ISSUE_TEMPLATE/01-bug-syntax-highlighting.md similarity index 100% rename from assets/syntaxes/Packages/.github/ISSUE_TEMPLATE/01-bug-syntax-highlighting.md rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/.github/ISSUE_TEMPLATE/01-bug-syntax-highlighting.md diff --git a/assets/syntaxes/Packages/.github/ISSUE_TEMPLATE/02-bug-file-indexing.md b/crates/bin/docs_rs_web/assets/syntaxes/Packages/.github/ISSUE_TEMPLATE/02-bug-file-indexing.md similarity index 100% rename from assets/syntaxes/Packages/.github/ISSUE_TEMPLATE/02-bug-file-indexing.md rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/.github/ISSUE_TEMPLATE/02-bug-file-indexing.md diff --git a/assets/syntaxes/Packages/.github/ISSUE_TEMPLATE/03-supporting-files.md b/crates/bin/docs_rs_web/assets/syntaxes/Packages/.github/ISSUE_TEMPLATE/03-supporting-files.md similarity index 100% rename from assets/syntaxes/Packages/.github/ISSUE_TEMPLATE/03-supporting-files.md rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/.github/ISSUE_TEMPLATE/03-supporting-files.md diff --git a/assets/syntaxes/Packages/.github/PULL_REQUEST_TEMPLATE/01-syntax-update-small.md b/crates/bin/docs_rs_web/assets/syntaxes/Packages/.github/PULL_REQUEST_TEMPLATE/01-syntax-update-small.md similarity index 100% rename from assets/syntaxes/Packages/.github/PULL_REQUEST_TEMPLATE/01-syntax-update-small.md rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/.github/PULL_REQUEST_TEMPLATE/01-syntax-update-small.md diff --git a/assets/syntaxes/Packages/.github/PULL_REQUEST_TEMPLATE/02-syntax-update-significant.md b/crates/bin/docs_rs_web/assets/syntaxes/Packages/.github/PULL_REQUEST_TEMPLATE/02-syntax-update-significant.md similarity index 100% rename from assets/syntaxes/Packages/.github/PULL_REQUEST_TEMPLATE/02-syntax-update-significant.md rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/.github/PULL_REQUEST_TEMPLATE/02-syntax-update-significant.md diff --git a/assets/syntaxes/Packages/.github/PULL_REQUEST_TEMPLATE/03-supporting-files.md b/crates/bin/docs_rs_web/assets/syntaxes/Packages/.github/PULL_REQUEST_TEMPLATE/03-supporting-files.md similarity index 100% rename from assets/syntaxes/Packages/.github/PULL_REQUEST_TEMPLATE/03-supporting-files.md rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/.github/PULL_REQUEST_TEMPLATE/03-supporting-files.md diff --git a/assets/syntaxes/Packages/.travis.yml b/crates/bin/docs_rs_web/assets/syntaxes/Packages/.travis.yml similarity index 100% rename from assets/syntaxes/Packages/.travis.yml rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/.travis.yml diff --git a/assets/syntaxes/Packages/ASP/ASP.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/ASP.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/ASP/ASP.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/ASP.sublime-syntax diff --git a/assets/syntaxes/Packages/ASP/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/ASP/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/ASP/HTML-ASP.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/HTML-ASP.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/ASP/HTML-ASP.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/HTML-ASP.sublime-syntax diff --git a/assets/syntaxes/Packages/ASP/Indentation Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/Indentation Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/ASP/Indentation Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/Indentation Rules.tmPreferences diff --git a/assets/syntaxes/Packages/ASP/Indexed Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/Indexed Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/ASP/Indexed Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/Indexed Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/ASP/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/ASP/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/ASP/syntax_test_asp.asp b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/syntax_test_asp.asp similarity index 100% rename from assets/syntaxes/Packages/ASP/syntax_test_asp.asp rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ASP/syntax_test_asp.asp diff --git a/assets/syntaxes/Packages/ActionScript/ActionScript.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ActionScript/ActionScript.sublime-build similarity index 100% rename from assets/syntaxes/Packages/ActionScript/ActionScript.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ActionScript/ActionScript.sublime-build diff --git a/assets/syntaxes/Packages/ActionScript/ActionScript.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ActionScript/ActionScript.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/ActionScript/ActionScript.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ActionScript/ActionScript.sublime-syntax diff --git a/assets/syntaxes/Packages/ActionScript/syntax_test_as.as b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ActionScript/syntax_test_as.as similarity index 100% rename from assets/syntaxes/Packages/ActionScript/syntax_test_as.as rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ActionScript/syntax_test_as.as diff --git a/assets/syntaxes/Packages/AppleScript/AppleScript.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/AppleScript/AppleScript.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/AppleScript/AppleScript.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/AppleScript/AppleScript.sublime-syntax diff --git a/assets/syntaxes/Packages/AppleScript/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/AppleScript/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/AppleScript/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/AppleScript/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Batch File/Batch File.sublime-settings b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Batch File/Batch File.sublime-settings similarity index 100% rename from assets/syntaxes/Packages/Batch File/Batch File.sublime-settings rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Batch File/Batch File.sublime-settings diff --git a/assets/syntaxes/Packages/Batch File/Batch File.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Batch File/Batch File.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Batch File/Batch File.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Batch File/Batch File.sublime-syntax diff --git a/assets/syntaxes/Packages/Batch File/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Batch File/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Batch File/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Batch File/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Batch File/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Batch File/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Batch File/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Batch File/Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/Batch File/syntax_test_batch_file.bat b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Batch File/syntax_test_batch_file.bat similarity index 100% rename from assets/syntaxes/Packages/Batch File/syntax_test_batch_file.bat rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Batch File/syntax_test_batch_file.bat diff --git a/assets/syntaxes/Packages/C#/Build.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Build.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/C#/Build.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Build.sublime-syntax diff --git a/assets/syntaxes/Packages/C#/C#.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/C#.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/C#/C#.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/C#.sublime-syntax diff --git a/assets/syntaxes/Packages/C#/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C#/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/C#/Indentation.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Indentation.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C#/Indentation.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Indentation.tmPreferences diff --git a/assets/syntaxes/Packages/C#/Symbol List Classes.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Classes.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C#/Symbol List Classes.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Classes.tmPreferences diff --git a/assets/syntaxes/Packages/C#/Symbol List Constructors.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Constructors.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C#/Symbol List Constructors.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Constructors.tmPreferences diff --git a/assets/syntaxes/Packages/C#/Symbol List Enums.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Enums.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C#/Symbol List Enums.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Enums.tmPreferences diff --git a/assets/syntaxes/Packages/C#/Symbol List Index Constructors.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Index Constructors.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C#/Symbol List Index Constructors.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Index Constructors.tmPreferences diff --git a/assets/syntaxes/Packages/C#/Symbol List Inner Function.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Inner Function.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C#/Symbol List Inner Function.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Inner Function.tmPreferences diff --git a/assets/syntaxes/Packages/C#/Symbol List Interfaces.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Interfaces.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C#/Symbol List Interfaces.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Interfaces.tmPreferences diff --git a/assets/syntaxes/Packages/C#/Symbol List Namespace.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Namespace.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C#/Symbol List Namespace.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Namespace.tmPreferences diff --git a/assets/syntaxes/Packages/C#/Symbol List Region.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Region.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C#/Symbol List Region.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Region.tmPreferences diff --git a/assets/syntaxes/Packages/C#/Symbol List Structs.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Structs.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C#/Symbol List Structs.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/Symbol List Structs.tmPreferences diff --git a/assets/syntaxes/Packages/C#/doc_params.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/doc_params.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C#/doc_params.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/doc_params.sublime-snippet diff --git a/assets/syntaxes/Packages/C#/doc_see.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/doc_see.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C#/doc_see.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/doc_see.sublime-snippet diff --git a/assets/syntaxes/Packages/C#/doc_summary.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/doc_summary.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C#/doc_summary.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/doc_summary.sublime-snippet diff --git a/assets/syntaxes/Packages/C#/tests/syntax_test_C#7.cs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_C#7.cs similarity index 100% rename from assets/syntaxes/Packages/C#/tests/syntax_test_C#7.cs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_C#7.cs diff --git a/assets/syntaxes/Packages/C#/tests/syntax_test_Comments.cs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_Comments.cs similarity index 100% rename from assets/syntaxes/Packages/C#/tests/syntax_test_Comments.cs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_Comments.cs diff --git a/assets/syntaxes/Packages/C#/tests/syntax_test_GeneralStructure.cs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_GeneralStructure.cs similarity index 100% rename from assets/syntaxes/Packages/C#/tests/syntax_test_GeneralStructure.cs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_GeneralStructure.cs diff --git a/assets/syntaxes/Packages/C#/tests/syntax_test_Generics.cs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_Generics.cs similarity index 100% rename from assets/syntaxes/Packages/C#/tests/syntax_test_Generics.cs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_Generics.cs diff --git a/assets/syntaxes/Packages/C#/tests/syntax_test_HelloWorld.cs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_HelloWorld.cs similarity index 100% rename from assets/syntaxes/Packages/C#/tests/syntax_test_HelloWorld.cs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_HelloWorld.cs diff --git a/assets/syntaxes/Packages/C#/tests/syntax_test_Operators.cs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_Operators.cs similarity index 100% rename from assets/syntaxes/Packages/C#/tests/syntax_test_Operators.cs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_Operators.cs diff --git a/assets/syntaxes/Packages/C#/tests/syntax_test_PreprocessorDirectives.cs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_PreprocessorDirectives.cs similarity index 100% rename from assets/syntaxes/Packages/C#/tests/syntax_test_PreprocessorDirectives.cs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_PreprocessorDirectives.cs diff --git a/assets/syntaxes/Packages/C#/tests/syntax_test_Strings.cs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_Strings.cs similarity index 100% rename from assets/syntaxes/Packages/C#/tests/syntax_test_Strings.cs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_Strings.cs diff --git a/assets/syntaxes/Packages/C#/tests/syntax_test_Using.cs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_Using.cs similarity index 100% rename from assets/syntaxes/Packages/C#/tests/syntax_test_Using.cs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_Using.cs diff --git a/assets/syntaxes/Packages/C#/tests/syntax_test_c#.cs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_c#.cs similarity index 100% rename from assets/syntaxes/Packages/C#/tests/syntax_test_c#.cs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_c#.cs diff --git a/assets/syntaxes/Packages/C#/tests/syntax_test_query.cs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_query.cs similarity index 100% rename from assets/syntaxes/Packages/C#/tests/syntax_test_query.cs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C#/tests/syntax_test_query.cs diff --git a/assets/syntaxes/Packages/C++/C Single File.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C Single File.sublime-build similarity index 100% rename from assets/syntaxes/Packages/C++/C Single File.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C Single File.sublime-build diff --git a/assets/syntaxes/Packages/C++/C Standard Includes.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C Standard Includes.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/C++/C Standard Includes.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C Standard Includes.sublime-completions diff --git a/assets/syntaxes/Packages/C++/C++ Single File.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C++ Single File.sublime-build similarity index 100% rename from assets/syntaxes/Packages/C++/C++ Single File.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C++ Single File.sublime-build diff --git a/assets/syntaxes/Packages/C++/C++ Standard Includes.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C++ Standard Includes.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/C++/C++ Standard Includes.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C++ Standard Includes.sublime-completions diff --git a/assets/syntaxes/Packages/C++/C++.sublime-settings b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C++.sublime-settings similarity index 100% rename from assets/syntaxes/Packages/C++/C++.sublime-settings rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C++.sublime-settings diff --git a/assets/syntaxes/Packages/C++/C++.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C++.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/C++/C++.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C++.sublime-syntax diff --git a/assets/syntaxes/Packages/C++/C.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/C++/C.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/C.sublime-syntax diff --git a/assets/syntaxes/Packages/C++/Comments (C++).tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Comments (C++).tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C++/Comments (C++).tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Comments (C++).tmPreferences diff --git a/assets/syntaxes/Packages/C++/Completion Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Completion Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C++/Completion Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Completion Rules.tmPreferences diff --git a/assets/syntaxes/Packages/C++/Default.sublime-keymap b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Default.sublime-keymap similarity index 100% rename from assets/syntaxes/Packages/C++/Default.sublime-keymap rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Default.sublime-keymap diff --git a/assets/syntaxes/Packages/C++/Indentation Rules Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Indentation Rules Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C++/Indentation Rules Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Indentation Rules Comments.tmPreferences diff --git a/assets/syntaxes/Packages/C++/Indentation Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Indentation Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C++/Indentation Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Indentation Rules.tmPreferences diff --git a/assets/syntaxes/Packages/C++/Snippets/#ifndef-#define-#endif.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/#ifndef-#define-#endif.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/#ifndef-#define-#endif.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/#ifndef-#define-#endif.sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/#include-(#inc angle).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/#include-(#inc angle).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/#include-(#inc angle).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/#include-(#inc angle).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/#include-(#inc).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/#include-(#inc).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/#include-(#inc).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/#include-(#inc).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/#include-(inc angle).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/#include-(inc angle).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/#include-(inc angle).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/#include-(inc angle).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/#include-(inc).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/#include-(inc).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/#include-(inc).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/#include-(inc).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/$1.begin()-$1.end()-(beginend).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/$1.begin()-$1.end()-(beginend).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/$1.begin()-$1.end()-(beginend).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/$1.begin()-$1.end()-(beginend).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/030-for-int-loop-(fori).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/030-for-int-loop-(fori).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/030-for-int-loop-(fori).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/030-for-int-loop-(fori).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/Enumeration.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/Enumeration.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/Enumeration.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/Enumeration.sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/Typedef.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/Typedef.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/Typedef.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/Typedef.sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/class-..-(class).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/class-..-(class).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/class-..-(class).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/class-..-(class).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/do...while-loop-(do).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/do...while-loop-(do).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/do...while-loop-(do).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/do...while-loop-(do).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/forv.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/forv.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/forv.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/forv.sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/fprintf.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/fprintf.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/fprintf.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/fprintf.sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/if-..-(if).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/if-..-(if).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/if-..-(if).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/if-..-(if).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/main()-(int main).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/main()-(int main).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/main()-(int main).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/main()-(int main).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/main()-(main).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/main()-(main).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/main()-(main).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/main()-(main).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/namespace-..-(namespace).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/namespace-..-(namespace).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/namespace-..-(namespace).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/namespace-..-(namespace).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/printf-..-(printf).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/printf-..-(printf).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/printf-..-(printf).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/printf-..-(printf).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/read-file-(readF).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/read-file-(readF).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/read-file-(readF).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/read-file-(readF).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/std-map-(map).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/std-map-(map).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/std-map-(map).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/std-map-(map).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/std-vector-(v).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/std-vector-(v).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/std-vector-(v).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/std-vector-(v).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/struct.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/struct.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/struct.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/struct.sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Snippets/template-typename-..-(template).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/template-typename-..-(template).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/C++/Snippets/template-typename-..-(template).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Snippets/template-typename-..-(template).sublime-snippet diff --git a/assets/syntaxes/Packages/C++/Symbol Index Hide Ctors.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol Index Hide Ctors.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C++/Symbol Index Hide Ctors.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol Index Hide Ctors.tmPreferences diff --git a/assets/syntaxes/Packages/C++/Symbol Index Include Constants.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol Index Include Constants.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C++/Symbol Index Include Constants.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol Index Include Constants.tmPreferences diff --git a/assets/syntaxes/Packages/C++/Symbol Index.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol Index.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C++/Symbol Index.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol Index.tmPreferences diff --git a/assets/syntaxes/Packages/C++/Symbol List - Indent Class Methods.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol List - Indent Class Methods.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C++/Symbol List - Indent Class Methods.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol List - Indent Class Methods.tmPreferences diff --git a/assets/syntaxes/Packages/C++/Symbol List - Namespace Spacing.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol List - Namespace Spacing.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C++/Symbol List - Namespace Spacing.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol List - Namespace Spacing.tmPreferences diff --git a/assets/syntaxes/Packages/C++/Symbol List - Prefix Banner Items.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol List - Prefix Banner Items.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C++/Symbol List - Prefix Banner Items.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol List - Prefix Banner Items.tmPreferences diff --git a/assets/syntaxes/Packages/C++/Symbol List Hide Forward Decls.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol List Hide Forward Decls.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C++/Symbol List Hide Forward Decls.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol List Hide Forward Decls.tmPreferences diff --git a/assets/syntaxes/Packages/C++/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/C++/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/C++/syntax_test_accessor.c b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/syntax_test_accessor.c similarity index 100% rename from assets/syntaxes/Packages/C++/syntax_test_accessor.c rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/syntax_test_accessor.c diff --git a/assets/syntaxes/Packages/C++/syntax_test_accessor.cpp b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/syntax_test_accessor.cpp similarity index 100% rename from assets/syntaxes/Packages/C++/syntax_test_accessor.cpp rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/syntax_test_accessor.cpp diff --git a/assets/syntaxes/Packages/C++/syntax_test_c.c b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/syntax_test_c.c similarity index 100% rename from assets/syntaxes/Packages/C++/syntax_test_c.c rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/syntax_test_c.c diff --git a/assets/syntaxes/Packages/C++/syntax_test_cpp.cpp b/crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/syntax_test_cpp.cpp similarity index 100% rename from assets/syntaxes/Packages/C++/syntax_test_cpp.cpp rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/C++/syntax_test_cpp.cpp diff --git a/assets/syntaxes/Packages/CSS/CSS.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/CSS.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/CSS/CSS.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/CSS.sublime-syntax diff --git a/assets/syntaxes/Packages/CSS/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/CSS/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/CSS/Completion Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/Completion Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/CSS/Completion Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/Completion Rules.tmPreferences diff --git a/assets/syntaxes/Packages/CSS/Default.sublime-keymap b/crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/Default.sublime-keymap similarity index 100% rename from assets/syntaxes/Packages/CSS/Default.sublime-keymap rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/Default.sublime-keymap diff --git a/assets/syntaxes/Packages/CSS/Symbol Index.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/Symbol Index.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/CSS/Symbol Index.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/Symbol Index.tmPreferences diff --git a/assets/syntaxes/Packages/CSS/Symbol List Group.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/Symbol List Group.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/CSS/Symbol List Group.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/Symbol List Group.tmPreferences diff --git a/assets/syntaxes/Packages/CSS/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/CSS/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/CSS/css_completions.py b/crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/css_completions.py similarity index 100% rename from assets/syntaxes/Packages/CSS/css_completions.py rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/css_completions.py diff --git a/assets/syntaxes/Packages/CSS/syntax_test_css.css b/crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/syntax_test_css.css similarity index 100% rename from assets/syntaxes/Packages/CSS/syntax_test_css.css rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/CSS/syntax_test_css.css diff --git a/assets/syntaxes/Packages/Clojure/Clojure.sublime-settings b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/Clojure.sublime-settings similarity index 100% rename from assets/syntaxes/Packages/Clojure/Clojure.sublime-settings rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/Clojure.sublime-settings diff --git a/assets/syntaxes/Packages/Clojure/Clojure.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/Clojure.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Clojure/Clojure.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/Clojure.sublime-syntax diff --git a/assets/syntaxes/Packages/Clojure/ClojureSymbols.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/ClojureSymbols.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Clojure/ClojureSymbols.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/ClojureSymbols.tmPreferences diff --git a/assets/syntaxes/Packages/Clojure/Comment.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/Comment.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Clojure/Comment.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/Comment.tmPreferences diff --git a/assets/syntaxes/Packages/Clojure/Default.sublime-keymap b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/Default.sublime-keymap similarity index 100% rename from assets/syntaxes/Packages/Clojure/Default.sublime-keymap rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/Default.sublime-keymap diff --git a/assets/syntaxes/Packages/Clojure/tests/syntax_test_clojure.clj b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/tests/syntax_test_clojure.clj similarity index 100% rename from assets/syntaxes/Packages/Clojure/tests/syntax_test_clojure.clj rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/tests/syntax_test_clojure.clj diff --git a/assets/syntaxes/Packages/Clojure/tests/syntax_test_clojure_old.clj b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/tests/syntax_test_clojure_old.clj similarity index 100% rename from assets/syntaxes/Packages/Clojure/tests/syntax_test_clojure_old.clj rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Clojure/tests/syntax_test_clojure_old.clj diff --git a/assets/syntaxes/Packages/D/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/D/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/D/Completion Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Completion Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/D/Completion Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Completion Rules.tmPreferences diff --git a/assets/syntaxes/Packages/D/D dub.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/D dub.sublime-build similarity index 100% rename from assets/syntaxes/Packages/D/D dub.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/D dub.sublime-build diff --git a/assets/syntaxes/Packages/D/D.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/D.sublime-build similarity index 100% rename from assets/syntaxes/Packages/D/D.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/D.sublime-build diff --git a/assets/syntaxes/Packages/D/D.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/D.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/D/D.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/D.sublime-syntax diff --git a/assets/syntaxes/Packages/D/DMD Output.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/DMD Output.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/D/DMD Output.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/DMD Output.sublime-syntax diff --git a/assets/syntaxes/Packages/D/Indentation Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Indentation Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/D/Indentation Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Indentation Rules.tmPreferences diff --git a/assets/syntaxes/Packages/D/Snippets/class.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/class.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/class.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/class.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/constant.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/constant.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/constant.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/constant.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/critical.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/critical.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/critical.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/critical.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/debugm.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/debugm.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/debugm.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/debugm.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/enum.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/enum.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/enum.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/enum.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/error-format.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/error-format.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/error-format.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/error-format.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/error.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/error.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/error.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/error.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/fatal.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/fatal.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/fatal.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/fatal.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/foreach-reverse.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/foreach-reverse.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/foreach-reverse.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/foreach-reverse.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/foreach.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/foreach.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/foreach.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/foreach.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/if-else.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/if-else.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/if-else.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/if-else.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/if.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/import.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/import.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/import.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/import.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/info.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/info.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/info.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/info.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/log-format.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/log-format.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/log-format.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/log-format.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/log.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/log.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/log.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/log.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/main-with-args.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/main-with-args.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/main-with-args.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/main-with-args.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/main.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/main.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/main.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/main.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/method.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/method.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/method.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/method.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/return.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/return.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/return.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/return.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/struct.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/struct.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/struct.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/struct.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/trace.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/trace.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/trace.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/trace.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/try-catch-finally.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/try-catch-finally.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/try-catch-finally.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/try-catch-finally.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/try-catch.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/try-catch.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/try-catch.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/try-catch.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/try-finally.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/try-finally.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/try-finally.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/try-finally.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/unittest.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/unittest.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/unittest.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/unittest.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/version.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/version.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/version.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/version.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/warning.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/warning.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/warning.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/warning.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Snippets/while.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/while.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/D/Snippets/while.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Snippets/while.sublime-snippet diff --git a/assets/syntaxes/Packages/D/Symbol Index Hide Special Functions.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Symbol Index Hide Special Functions.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/D/Symbol Index Hide Special Functions.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Symbol Index Hide Special Functions.tmPreferences diff --git a/assets/syntaxes/Packages/D/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/D/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/D/tests/syntax_test_d.d b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/tests/syntax_test_d.d similarity index 100% rename from assets/syntaxes/Packages/D/tests/syntax_test_d.d rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/tests/syntax_test_d.d diff --git a/assets/syntaxes/Packages/D/tests/syntax_test_old.d b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/tests/syntax_test_old.d similarity index 100% rename from assets/syntaxes/Packages/D/tests/syntax_test_old.d rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/tests/syntax_test_old.d diff --git a/assets/syntaxes/Packages/D/tests/syntax_test_shebang.d b/crates/bin/docs_rs_web/assets/syntaxes/Packages/D/tests/syntax_test_shebang.d similarity index 100% rename from assets/syntaxes/Packages/D/tests/syntax_test_shebang.d rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/D/tests/syntax_test_shebang.d diff --git a/assets/syntaxes/Packages/Diff/Context.sublime-menu b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Diff/Context.sublime-menu similarity index 100% rename from assets/syntaxes/Packages/Diff/Context.sublime-menu rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Diff/Context.sublime-menu diff --git a/assets/syntaxes/Packages/Diff/Diff.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Diff/Diff.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Diff/Diff.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Diff/Diff.sublime-syntax diff --git a/assets/syntaxes/Packages/Diff/Side Bar.sublime-menu b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Diff/Side Bar.sublime-menu similarity index 100% rename from assets/syntaxes/Packages/Diff/Side Bar.sublime-menu rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Diff/Side Bar.sublime-menu diff --git a/assets/syntaxes/Packages/Diff/diff.py b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Diff/diff.py similarity index 100% rename from assets/syntaxes/Packages/Diff/diff.py rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Diff/diff.py diff --git a/assets/syntaxes/Packages/Diff/syntax_test_diff.diff b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Diff/syntax_test_diff.diff similarity index 100% rename from assets/syntaxes/Packages/Diff/syntax_test_diff.diff rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Diff/syntax_test_diff.diff diff --git a/assets/syntaxes/Packages/Erlang/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Erlang/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Erlang/Completion Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Completion Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Erlang/Completion Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Completion Rules.tmPreferences diff --git a/assets/syntaxes/Packages/Erlang/Erlang.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Erlang.sublime-build similarity index 100% rename from assets/syntaxes/Packages/Erlang/Erlang.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Erlang.sublime-build diff --git a/assets/syntaxes/Packages/Erlang/Erlang.sublime-settings b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Erlang.sublime-settings similarity index 100% rename from assets/syntaxes/Packages/Erlang/Erlang.sublime-settings rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Erlang.sublime-settings diff --git a/assets/syntaxes/Packages/Erlang/Erlang.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Erlang.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Erlang/Erlang.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Erlang.sublime-syntax diff --git a/assets/syntaxes/Packages/Erlang/HTML (Erlang).sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/HTML (Erlang).sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Erlang/HTML (Erlang).sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/HTML (Erlang).sublime-completions diff --git a/assets/syntaxes/Packages/Erlang/HTML (Erlang).sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/HTML (Erlang).sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Erlang/HTML (Erlang).sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/HTML (Erlang).sublime-syntax diff --git a/assets/syntaxes/Packages/Erlang/Indentation Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Indentation Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Erlang/Indentation Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Indentation Rules.tmPreferences diff --git a/assets/syntaxes/Packages/Erlang/Indexed Reference List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Indexed Reference List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Erlang/Indexed Reference List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Indexed Reference List.tmPreferences diff --git a/assets/syntaxes/Packages/Erlang/Indexed Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Indexed Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Erlang/Indexed Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Indexed Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Behaviour-Directive.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Behaviour-Directive.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Behaviour-Directive.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Behaviour-Directive.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Case-Expression.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Case-Expression.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Case-Expression.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Case-Expression.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Define-Directive.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Define-Directive.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Define-Directive.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Define-Directive.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Export-Directive.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Export-Directive.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Export-Directive.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Export-Directive.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Fun-Expression.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Fun-Expression.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Fun-Expression.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Fun-Expression.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/If-Expression.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/If-Expression.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/If-Expression.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/If-Expression.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Ifdef-Directive.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Ifdef-Directive.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Ifdef-Directive.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Ifdef-Directive.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Ifndef-Directive.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Ifndef-Directive.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Ifndef-Directive.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Ifndef-Directive.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Import-Directive.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Import-Directive.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Import-Directive.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Import-Directive.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Include-Directive.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Include-Directive.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Include-Directive.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Include-Directive.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Module-Directive.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Module-Directive.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Module-Directive.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Module-Directive.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Receive-Expression.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Receive-Expression.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Receive-Expression.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Receive-Expression.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Record-Directive.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Record-Directive.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Record-Directive.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Record-Directive.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Try-Expression.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Try-Expression.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Try-Expression.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Try-Expression.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Snippets/Undef-Directive.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Undef-Directive.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Erlang/Snippets/Undef-Directive.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Snippets/Undef-Directive.sublime-snippet diff --git a/assets/syntaxes/Packages/Erlang/Symbol List - Exports.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Exports.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Erlang/Symbol List - Exports.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Exports.tmPreferences diff --git a/assets/syntaxes/Packages/Erlang/Symbol List - Function Definition.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Function Definition.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Erlang/Symbol List - Function Definition.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Function Definition.tmPreferences diff --git a/assets/syntaxes/Packages/Erlang/Symbol List - Function Specification.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Function Specification.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Erlang/Symbol List - Function Specification.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Function Specification.tmPreferences diff --git a/assets/syntaxes/Packages/Erlang/Symbol List - Imports.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Imports.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Erlang/Symbol List - Imports.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Imports.tmPreferences diff --git a/assets/syntaxes/Packages/Erlang/Symbol List - Macro.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Macro.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Erlang/Symbol List - Macro.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Macro.tmPreferences diff --git a/assets/syntaxes/Packages/Erlang/Symbol List - Record.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Record.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Erlang/Symbol List - Record.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Record.tmPreferences diff --git a/assets/syntaxes/Packages/Erlang/Symbol List - Type.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Type.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Erlang/Symbol List - Type.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/Symbol List - Type.tmPreferences diff --git a/assets/syntaxes/Packages/Erlang/syntax_test_erlang.erl b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/syntax_test_erlang.erl similarity index 100% rename from assets/syntaxes/Packages/Erlang/syntax_test_erlang.erl rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/syntax_test_erlang.erl diff --git a/assets/syntaxes/Packages/Erlang/syntax_test_erlang.yaws b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/syntax_test_erlang.yaws similarity index 100% rename from assets/syntaxes/Packages/Erlang/syntax_test_erlang.yaws rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Erlang/syntax_test_erlang.yaws diff --git a/assets/syntaxes/Packages/Git Formats/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Attributes.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Attributes.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Attributes.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Attributes.sublime-completions diff --git a/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Diff.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Diff.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Diff.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Diff.sublime-completions diff --git a/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - EOL.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - EOL.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - EOL.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - EOL.sublime-completions diff --git a/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Encoding.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Encoding.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Encoding.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Encoding.sublime-completions diff --git a/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Filter.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Filter.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Filter.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Filter.sublime-completions diff --git a/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Merge.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Merge.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Merge.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Merge.sublime-completions diff --git a/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Text.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Text.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Text.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Text.sublime-completions diff --git a/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Whitespace.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Whitespace.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Whitespace.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Completions/Git Attributes - Whitespace.sublime-completions diff --git a/assets/syntaxes/Packages/Git Formats/Git Attributes.sublime-settings b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Attributes.sublime-settings similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Attributes.sublime-settings rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Attributes.sublime-settings diff --git a/assets/syntaxes/Packages/Git Formats/Git Attributes.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Attributes.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Attributes.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Attributes.sublime-syntax diff --git a/assets/syntaxes/Packages/Git Formats/Git Commit.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Commit.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Commit.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Commit.sublime-syntax diff --git a/assets/syntaxes/Packages/Git Formats/Git Common.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Common.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Common.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Common.sublime-syntax diff --git a/assets/syntaxes/Packages/Git Formats/Git Config - Indentation Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Config - Indentation Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Config - Indentation Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Config - Indentation Rules.tmPreferences diff --git a/assets/syntaxes/Packages/Git Formats/Git Config - Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Config - Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Config - Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Config - Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/Git Formats/Git Config.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Config.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Config.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Config.sublime-syntax diff --git a/assets/syntaxes/Packages/Git Formats/Git Ignore.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Ignore.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Ignore.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Ignore.sublime-syntax diff --git a/assets/syntaxes/Packages/Git Formats/Git Link.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Link.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Link.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Link.sublime-syntax diff --git a/assets/syntaxes/Packages/Git Formats/Git Log.sublime-settings b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Log.sublime-settings similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Log.sublime-settings rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Log.sublime-settings diff --git a/assets/syntaxes/Packages/Git Formats/Git Log.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Log.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Log.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Log.sublime-syntax diff --git a/assets/syntaxes/Packages/Git Formats/Git Mailmap - Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Mailmap - Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Mailmap - Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Mailmap - Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/Git Formats/Git Mailmap.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Mailmap.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Mailmap.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Mailmap.sublime-syntax diff --git a/assets/syntaxes/Packages/Git Formats/Git Rebase.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Rebase.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Git Rebase.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Git Rebase.sublime-syntax diff --git a/assets/syntaxes/Packages/Git Formats/Snippets/Git Config - Section.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Snippets/Git Config - Section.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Git Formats/Snippets/Git Config - Section.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/Snippets/Git Config - Section.sublime-snippet diff --git a/assets/syntaxes/Packages/Git Formats/syntax_test_git_attributes b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_attributes similarity index 100% rename from assets/syntaxes/Packages/Git Formats/syntax_test_git_attributes rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_attributes diff --git a/assets/syntaxes/Packages/Git Formats/syntax_test_git_commit b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_commit similarity index 100% rename from assets/syntaxes/Packages/Git Formats/syntax_test_git_commit rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_commit diff --git a/assets/syntaxes/Packages/Git Formats/syntax_test_git_config b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_config similarity index 100% rename from assets/syntaxes/Packages/Git Formats/syntax_test_git_config rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_config diff --git a/assets/syntaxes/Packages/Git Formats/syntax_test_git_ignore b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_ignore similarity index 100% rename from assets/syntaxes/Packages/Git Formats/syntax_test_git_ignore rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_ignore diff --git a/assets/syntaxes/Packages/Git Formats/syntax_test_git_link b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_link similarity index 100% rename from assets/syntaxes/Packages/Git Formats/syntax_test_git_link rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_link diff --git a/assets/syntaxes/Packages/Git Formats/syntax_test_git_log b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_log similarity index 100% rename from assets/syntaxes/Packages/Git Formats/syntax_test_git_log rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_log diff --git a/assets/syntaxes/Packages/Git Formats/syntax_test_git_mailmap b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_mailmap similarity index 100% rename from assets/syntaxes/Packages/Git Formats/syntax_test_git_mailmap rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_mailmap diff --git a/assets/syntaxes/Packages/Git Formats/syntax_test_git_merge b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_merge similarity index 100% rename from assets/syntaxes/Packages/Git Formats/syntax_test_git_merge rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_merge diff --git a/assets/syntaxes/Packages/Git Formats/syntax_test_git_rebase b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_rebase similarity index 100% rename from assets/syntaxes/Packages/Git Formats/syntax_test_git_rebase rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_rebase diff --git a/assets/syntaxes/Packages/Git Formats/syntax_test_git_tag b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_tag similarity index 100% rename from assets/syntaxes/Packages/Git Formats/syntax_test_git_tag rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Git Formats/syntax_test_git_tag diff --git a/assets/syntaxes/Packages/Go/Default.sublime-keymap b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Default.sublime-keymap similarity index 100% rename from assets/syntaxes/Packages/Go/Default.sublime-keymap rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Default.sublime-keymap diff --git a/assets/syntaxes/Packages/Go/Go.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Go.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Go/Go.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Go.sublime-completions diff --git a/assets/syntaxes/Packages/Go/Go.sublime-settings b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Go.sublime-settings similarity index 100% rename from assets/syntaxes/Packages/Go/Go.sublime-settings rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Go.sublime-settings diff --git a/assets/syntaxes/Packages/Go/Go.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Go.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Go/Go.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Go.sublime-syntax diff --git a/assets/syntaxes/Packages/Go/GoCommentRules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/GoCommentRules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Go/GoCommentRules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/GoCommentRules.tmPreferences diff --git a/assets/syntaxes/Packages/Go/Indents/GoCommentIndent.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Indents/GoCommentIndent.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Go/Indents/GoCommentIndent.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Indents/GoCommentIndent.tmPreferences diff --git a/assets/syntaxes/Packages/Go/Indents/GoIndent.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Indents/GoIndent.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Go/Indents/GoIndent.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Indents/GoIndent.tmPreferences diff --git a/assets/syntaxes/Packages/Go/Indents/GoStringIndent.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Indents/GoStringIndent.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Go/Indents/GoStringIndent.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Indents/GoStringIndent.tmPreferences diff --git a/assets/syntaxes/Packages/Go/Snippets/go-defun.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Snippets/go-defun.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Go/Snippets/go-defun.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Snippets/go-defun.sublime-snippet diff --git a/assets/syntaxes/Packages/Go/Snippets/go-fori.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Snippets/go-fori.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Go/Snippets/go-fori.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Snippets/go-fori.sublime-snippet diff --git a/assets/syntaxes/Packages/Go/Snippets/go-gofun.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Snippets/go-gofun.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Go/Snippets/go-gofun.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Snippets/go-gofun.sublime-snippet diff --git a/assets/syntaxes/Packages/Go/Snippets/go-iferr.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Snippets/go-iferr.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Go/Snippets/go-iferr.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Snippets/go-iferr.sublime-snippet diff --git a/assets/syntaxes/Packages/Go/Symbols/GoConstSymbols.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Symbols/GoConstSymbols.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Go/Symbols/GoConstSymbols.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Symbols/GoConstSymbols.tmPreferences diff --git a/assets/syntaxes/Packages/Go/Symbols/GoFuncSymbols.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Symbols/GoFuncSymbols.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Go/Symbols/GoFuncSymbols.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Symbols/GoFuncSymbols.tmPreferences diff --git a/assets/syntaxes/Packages/Go/Symbols/GoTypeSymbols.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Symbols/GoTypeSymbols.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Go/Symbols/GoTypeSymbols.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Symbols/GoTypeSymbols.tmPreferences diff --git a/assets/syntaxes/Packages/Go/Symbols/GoVarSymbols.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Symbols/GoVarSymbols.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Go/Symbols/GoVarSymbols.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/Symbols/GoVarSymbols.tmPreferences diff --git a/assets/syntaxes/Packages/Go/syntax_test_go.go b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/syntax_test_go.go similarity index 100% rename from assets/syntaxes/Packages/Go/syntax_test_go.go rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Go/syntax_test_go.go diff --git a/assets/syntaxes/Packages/Graphviz/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Graphviz/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Graphviz/Completions/Attribute Values.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Completions/Attribute Values.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Graphviz/Completions/Attribute Values.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Completions/Attribute Values.sublime-completions diff --git a/assets/syntaxes/Packages/Graphviz/Completions/Attributes.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Completions/Attributes.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Graphviz/Completions/Attributes.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Completions/Attributes.sublime-completions diff --git a/assets/syntaxes/Packages/Graphviz/Completions/Graphs.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Completions/Graphs.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Graphviz/Completions/Graphs.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Completions/Graphs.sublime-completions diff --git a/assets/syntaxes/Packages/Graphviz/Completions/Objects.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Completions/Objects.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Graphviz/Completions/Objects.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Completions/Objects.sublime-completions diff --git a/assets/syntaxes/Packages/Graphviz/DOT.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/DOT.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Graphviz/DOT.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/DOT.sublime-syntax diff --git a/assets/syntaxes/Packages/Graphviz/Graphviz.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Graphviz.sublime-build similarity index 100% rename from assets/syntaxes/Packages/Graphviz/Graphviz.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Graphviz.sublime-build diff --git a/assets/syntaxes/Packages/Graphviz/Indentation Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Indentation Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Graphviz/Indentation Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Indentation Rules.tmPreferences diff --git a/assets/syntaxes/Packages/Graphviz/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Graphviz/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/Graphviz/syntax_test_dot.dot b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/syntax_test_dot.dot similarity index 100% rename from assets/syntaxes/Packages/Graphviz/syntax_test_dot.dot rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Graphviz/syntax_test_dot.dot diff --git a/assets/syntaxes/Packages/Groovy/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Groovy/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Groovy/Groovy.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Groovy.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Groovy/Groovy.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Groovy.sublime-syntax diff --git a/assets/syntaxes/Packages/Groovy/Snippets/#!-usr-local-bin-groovy-w.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/#!-usr-local-bin-groovy-w.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/#!-usr-local-bin-groovy-w.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/#!-usr-local-bin-groovy-w.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/Ant-__-replace.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/Ant-__-replace.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/Ant-__-replace.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/Ant-__-replace.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/Block-Comment.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/Block-Comment.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/Block-Comment.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/Block-Comment.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/Constructor.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/Constructor.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/Constructor.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/Constructor.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/Hash-Pair.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/Hash-Pair.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/Hash-Pair.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/Hash-Pair.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/Thread_start-{-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/Thread_start-{-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/Thread_start-{-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/Thread_start-{-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/Thread_startDaemon-{-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/Thread_startDaemon-{-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/Thread_startDaemon-{-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/Thread_startDaemon-{-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/all{-e-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/all{-e-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/all{-e-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/all{-e-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/any{-e-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/any{-e-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/any{-e-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/any{-e-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/as-BigDecimal.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-BigDecimal.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/as-BigDecimal.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-BigDecimal.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/as-BigInteger.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-BigInteger.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/as-BigInteger.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-BigInteger.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/as-Double.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-Double.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/as-Double.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-Double.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/as-Float.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-Float.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/as-Float.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-Float.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/as-Immutable.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-Immutable.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/as-Immutable.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-Immutable.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/as-Set.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-Set.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/as-Set.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-Set.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/as-String.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-String.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/as-String.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-String.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/as-Synchronized.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-Synchronized.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/as-Synchronized.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-Synchronized.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/as-Writable.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-Writable.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/as-Writable.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/as-Writable.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/assert(__).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assert(__).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/assert(__).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assert(__).sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/assertEquals(__).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertEquals(__).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/assertEquals(__).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertEquals(__).sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/assertFalse.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertFalse.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/assertFalse.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertFalse.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/assertNotEquals(__).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertNotEquals(__).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/assertNotEquals(__).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertNotEquals(__).sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/assertNotNull(__).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertNotNull(__).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/assertNotNull(__).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertNotNull(__).sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/assertNull(__).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertNull(__).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/assertNull(__).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertNull(__).sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/assertSame.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertSame.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/assertSame.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertSame.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/assertTrue.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertTrue.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/assertTrue.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/assertTrue.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/case.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/case.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/case.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/case.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/class-__-singleton.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/class-__-singleton.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/class-__-singleton.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/class-__-singleton.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/class-__.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/class-__.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/class-__.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/class-__.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/class-___-TestCase.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/class-___-TestCase.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/class-___-TestCase.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/class-___-TestCase.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/collect-{-e-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/collect-{-e-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/collect-{-e-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/collect-{-e-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/copy__-file.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/copy__-file.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/copy__-file.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/copy__-file.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/copy__-fileset-include-exclude.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/copy__-fileset-include-exclude.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/copy__-fileset-include-exclude.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/copy__-fileset-include-exclude.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/copy__-fileset.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/copy__-fileset.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/copy__-fileset.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/copy__-fileset.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/def-__-closure-=-{__}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/def-__-closure-=-{__}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/def-__-closure-=-{__}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/def-__-closure-=-{__}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/def-__-method()-{__}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/def-__-method()-{__}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/def-__-method()-{__}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/def-__-method()-{__}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/downto(num)-{-n-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/downto(num)-{-n-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/downto(num)-{-n-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/downto(num)-{-n-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/each-{-e-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/each-{-e-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/each-{-e-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/each-{-e-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachByte-{-byte-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachByte-{-byte-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachByte-{-byte-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachByte-{-byte-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachDir-{-dir-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachDir-{-dir-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachDir-{-dir-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachDir-{-dir-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachDirMatch.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachDirMatch.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachDirMatch.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachDirMatch.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachDirRecurse.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachDirRecurse.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachDirRecurse.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachDirRecurse.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachFile-{-file-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachFile-{-file-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachFile-{-file-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachFile-{-file-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachFileMatch-{-file-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachFileMatch-{-file-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachFileMatch-{-file-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachFileMatch-{-file-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachFileRecurse-{-file-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachFileRecurse-{-file-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachFileRecurse-{-file-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachFileRecurse-{-file-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachKey-{-key-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachKey-{-key-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachKey-{-key-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachKey-{-key-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachLine-{-line-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachLine-{-line-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachLine-{-line-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachLine-{-line-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachMatch(regex)-{-match-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachMatch(regex)-{-match-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachMatch(regex)-{-match-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachMatch(regex)-{-match-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachObject-{-obj-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachObject-{-obj-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachObject-{-obj-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachObject-{-obj-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachValue-{-val-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachValue-{-val-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachValue-{-val-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachValue-{-val-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/eachWithIndex-{-e-i-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachWithIndex-{-e-i-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/eachWithIndex-{-e-i-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/eachWithIndex-{-e-i-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/else.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/else.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/else.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/else.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/elseif-___.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/elseif-___.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/elseif-___.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/elseif-___.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/every-{-e-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/every-{-e-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/every-{-e-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/every-{-e-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/final-method.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/final-method.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/final-method.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/final-method.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/final-var.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/final-var.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/final-var.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/final-var.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/find-{-e-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/find-{-e-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/find-{-e-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/find-{-e-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/findAll-{-e-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/findAll-{-e-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/findAll-{-e-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/findAll-{-e-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/for-in.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/for-in.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/for-in.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/for-in.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/grep(-pattern-)-{-match-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/grep(-pattern-)-{-match-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/grep(-pattern-)-{-match-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/grep(-pattern-)-{-match-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/if-else.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/if-else.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/if-else.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/if-else.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/if.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/import.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/import.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/import.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/import.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/mkdir.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/mkdir.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/mkdir.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/mkdir.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/new-File(__)_eachLine-{-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/new-File(__)_eachLine-{-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/new-File(__)_eachLine-{-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/new-File(__)_eachLine-{-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/package.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/package.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/package.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/package.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/print.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/print.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/print.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/print.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/println.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/println.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/println.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/println.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/private-final-method.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-final-method.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/private-final-method.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-final-method.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/private-final-var.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-final-var.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/private-final-var.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-final-var.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/private-method.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-method.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/private-method.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-method.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/private-static-final-String.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-static-final-String.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/private-static-final-String.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-static-final-String.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/private-static-final-method.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-static-final-method.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/private-static-final-method.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-static-final-method.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/private-static-method.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-static-method.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/private-static-method.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-static-method.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/private-static-var.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-static-var.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/private-static-var.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-static-var.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/private-var.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-var.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/private-var.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/private-var.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/replaceAll(regex)-{-match-__}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/replaceAll(regex)-{-match-__}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/replaceAll(regex)-{-match-__}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/replaceAll(regex)-{-match-__}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/reverseEach-{-e-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/reverseEach-{-e-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/reverseEach-{-e-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/reverseEach-{-e-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/run-after.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/run-after.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/run-after.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/run-after.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/setUp().sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/setUp().sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/setUp().sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/setUp().sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/shouldFail(__)-{-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/shouldFail(__)-{-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/shouldFail(__)-{-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/shouldFail(__)-{-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/sleep(secs)-{-__-on-interrupt-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/sleep(secs)-{-__-on-interrupt-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/sleep(secs)-{-__-on-interrupt-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/sleep(secs)-{-__-on-interrupt-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/sleep(secs).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/sleep(secs).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/sleep(secs).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/sleep(secs).sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/sort-{-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/sort-{-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/sort-{-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/sort-{-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/splitEachLine(separator)-{-line-__-}-copy.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/splitEachLine(separator)-{-line-__-}-copy.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/splitEachLine(separator)-{-line-__-}-copy.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/splitEachLine(separator)-{-line-__-}-copy.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/static-final-method.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/static-final-method.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/static-final-method.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/static-final-method.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/static-final-var.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/static-final-var.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/static-final-var.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/static-final-var.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/static-main-method.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/static-main-method.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/static-main-method.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/static-main-method.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/static-method.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/static-method.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/static-method.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/static-method.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/static-var.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/static-var.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/static-var.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/static-var.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/step(to-amount)-{-n-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/step(to-amount)-{-n-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/step(to-amount)-{-n-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/step(to-amount)-{-n-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/switch__case.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/switch__case.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/switch__case.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/switch__case.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/switch__case__default.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/switch__case__default.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/switch__case__default.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/switch__case__default.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/tearDown().sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/tearDown().sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/tearDown().sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/tearDown().sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/test-case.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/test-case.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/test-case.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/test-case.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/times-{-n-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/times-{-n-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/times-{-n-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/times-{-n-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/to-Array.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-Array.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/to-Array.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-Array.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/to-BigDecimal.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-BigDecimal.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/to-BigDecimal.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-BigDecimal.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/to-BigInteger.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-BigInteger.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/to-BigInteger.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-BigInteger.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/to-Boolean.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-Boolean.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/to-Boolean.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-Boolean.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/to-Character.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-Character.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/to-Character.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-Character.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/to-Double.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-Double.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/to-Double.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-Double.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/to-Float.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-Float.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/to-Float.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-Float.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/to-Integer.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-Integer.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/to-Integer.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-Integer.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/to-List.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-List.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/to-List.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-List.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/to-String.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-String.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/to-String.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-String.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/to-URI.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-URI.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/to-URI.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-URI.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/to-URL.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-URL.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/to-URL.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/to-URL.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/try-__-catch__-finally.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/try-__-catch__-finally.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/try-__-catch__-finally.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/try-__-catch__-finally.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/try-__-catch__.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/try-__-catch__.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/try-__-catch__.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/try-__-catch__.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/upto(num)-{-n-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/upto(num)-{-n-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/upto(num)-{-n-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/upto(num)-{-n-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/var.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/var.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/var.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/var.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/while-___-{___}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/while-___-{___}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/while-___-{___}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/while-___-{___}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/withInputStream-{-in-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withInputStream-{-in-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/withInputStream-{-in-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withInputStream-{-in-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/withOutputStream-{-out-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withOutputStream-{-out-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/withOutputStream-{-out-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withOutputStream-{-out-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/withPrintWriter-{-pw-__}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withPrintWriter-{-pw-__}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/withPrintWriter-{-pw-__}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withPrintWriter-{-pw-__}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/withReader-{-r-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withReader-{-r-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/withReader-{-r-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withReader-{-r-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/withStream-{-in-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withStream-{-in-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/withStream-{-in-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withStream-{-in-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/withStreams-{-Socket-s-__}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withStreams-{-Socket-s-__}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/withStreams-{-Socket-s-__}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withStreams-{-Socket-s-__}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/withWriter(charset)-{-w-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withWriter(charset)-{-w-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/withWriter(charset)-{-w-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withWriter(charset)-{-w-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/withWriter-{-w-__}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withWriter-{-w-__}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/withWriter-{-w-__}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withWriter-{-w-__}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Snippets/withWriterAppend(charset)-{-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withWriterAppend(charset)-{-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Groovy/Snippets/withWriterAppend(charset)-{-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Snippets/withWriterAppend(charset)-{-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Groovy/Symbol List%3A Class Variables.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Symbol List%3A Class Variables.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Groovy/Symbol List%3A Class Variables.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Symbol List%3A Class Variables.tmPreferences diff --git a/assets/syntaxes/Packages/Groovy/Symbol List%3A Classes.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Symbol List%3A Classes.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Groovy/Symbol List%3A Classes.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Symbol List%3A Classes.tmPreferences diff --git a/assets/syntaxes/Packages/Groovy/Symbol List%3A Methods.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Symbol List%3A Methods.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Groovy/Symbol List%3A Methods.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Symbol List%3A Methods.tmPreferences diff --git a/assets/syntaxes/Packages/Groovy/Symbol List%3A Variables.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Symbol List%3A Variables.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Groovy/Symbol List%3A Variables.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/Symbol List%3A Variables.tmPreferences diff --git a/assets/syntaxes/Packages/Groovy/syntax_test_groovy.groovy b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/syntax_test_groovy.groovy similarity index 100% rename from assets/syntaxes/Packages/Groovy/syntax_test_groovy.groovy rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/syntax_test_groovy.groovy diff --git a/assets/syntaxes/Packages/Groovy/tests/syntax_test_Strings.groovy b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/tests/syntax_test_Strings.groovy similarity index 100% rename from assets/syntaxes/Packages/Groovy/tests/syntax_test_Strings.groovy rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Groovy/tests/syntax_test_Strings.groovy diff --git a/assets/syntaxes/Packages/HTML/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/HTML/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/HTML/HTML.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/HTML.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/HTML/HTML.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/HTML.sublime-syntax diff --git a/assets/syntaxes/Packages/HTML/Indentation Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/Indentation Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/HTML/Indentation Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/Indentation Rules.tmPreferences diff --git a/assets/syntaxes/Packages/HTML/Snippets/html (begin tag).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/Snippets/html (begin tag).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/HTML/Snippets/html (begin tag).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/Snippets/html (begin tag).sublime-snippet diff --git a/assets/syntaxes/Packages/HTML/Snippets/html.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/Snippets/html.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/HTML/Snippets/html.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/Snippets/html.sublime-snippet diff --git a/assets/syntaxes/Packages/HTML/Symbol List - ID.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/Symbol List - ID.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/HTML/Symbol List - ID.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/Symbol List - ID.tmPreferences diff --git a/assets/syntaxes/Packages/HTML/encode_html_entities.py b/crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/encode_html_entities.py similarity index 100% rename from assets/syntaxes/Packages/HTML/encode_html_entities.py rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/encode_html_entities.py diff --git a/assets/syntaxes/Packages/HTML/html_completions.py b/crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/html_completions.py similarity index 100% rename from assets/syntaxes/Packages/HTML/html_completions.py rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/html_completions.py diff --git a/assets/syntaxes/Packages/HTML/syntax_test_html.html b/crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/syntax_test_html.html similarity index 100% rename from assets/syntaxes/Packages/HTML/syntax_test_html.html rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/HTML/syntax_test_html.html diff --git a/assets/syntaxes/Packages/Haskell/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Haskell/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Haskell/Haskell.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Haskell.sublime-build similarity index 100% rename from assets/syntaxes/Packages/Haskell/Haskell.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Haskell.sublime-build diff --git a/assets/syntaxes/Packages/Haskell/Haskell.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Haskell.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Haskell/Haskell.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Haskell.sublime-syntax diff --git a/assets/syntaxes/Packages/Haskell/Indent Patterns.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Indent Patterns.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Haskell/Indent Patterns.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Indent Patterns.tmPreferences diff --git a/assets/syntaxes/Packages/Haskell/Literate Haskell.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Literate Haskell.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Haskell/Literate Haskell.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Literate Haskell.sublime-syntax diff --git a/assets/syntaxes/Packages/Haskell/Snippets/Case.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Snippets/Case.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Haskell/Snippets/Case.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Snippets/Case.sublime-snippet diff --git a/assets/syntaxes/Packages/Haskell/Snippets/Instance.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Snippets/Instance.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Haskell/Snippets/Instance.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Snippets/Instance.sublime-snippet diff --git a/assets/syntaxes/Packages/Haskell/Snippets/Lambda.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Snippets/Lambda.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Haskell/Snippets/Lambda.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Snippets/Lambda.sublime-snippet diff --git a/assets/syntaxes/Packages/Haskell/Snippets/Main.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Snippets/Main.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Haskell/Snippets/Main.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Snippets/Main.sublime-snippet diff --git a/assets/syntaxes/Packages/Haskell/Snippets/module.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Snippets/module.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Haskell/Snippets/module.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Snippets/module.sublime-snippet diff --git a/assets/syntaxes/Packages/Haskell/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Haskell/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/Haskell/syntax_test_haskell.hs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/syntax_test_haskell.hs similarity index 100% rename from assets/syntaxes/Packages/Haskell/syntax_test_haskell.hs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Haskell/syntax_test_haskell.hs diff --git a/assets/syntaxes/Packages/JSON/JSON Indent.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JSON/JSON Indent.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/JSON/JSON Indent.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JSON/JSON Indent.tmPreferences diff --git a/assets/syntaxes/Packages/JSON/JSON.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JSON/JSON.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/JSON/JSON.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JSON/JSON.sublime-syntax diff --git a/assets/syntaxes/Packages/JSON/syntax_test_json.json b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JSON/syntax_test_json.json similarity index 100% rename from assets/syntaxes/Packages/JSON/syntax_test_json.json rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JSON/syntax_test_json.json diff --git a/assets/syntaxes/Packages/Java/Ant.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Ant.sublime-build similarity index 100% rename from assets/syntaxes/Packages/Java/Ant.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Ant.sublime-build diff --git a/assets/syntaxes/Packages/Java/Comments - Properties.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Comments - Properties.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Comments - Properties.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Comments - Properties.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Completion Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Completion Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Completion Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Completion Rules.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Indentation Rules Annex.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Indentation Rules Annex.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Indentation Rules Annex.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Indentation Rules Annex.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Indentation Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Indentation Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Indentation Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Indentation Rules.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Indexed Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Indexed Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Indexed Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Indexed Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Java Server Pages (JSP).sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Java Server Pages (JSP).sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Java/Java Server Pages (JSP).sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Java Server Pages (JSP).sublime-syntax diff --git a/assets/syntaxes/Packages/Java/Java.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Java.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/Java/Java.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Java.sublime-completions diff --git a/assets/syntaxes/Packages/Java/Java.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Java.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Java/Java.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Java.sublime-syntax diff --git a/assets/syntaxes/Packages/Java/JavaC.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/JavaC.sublime-build similarity index 100% rename from assets/syntaxes/Packages/Java/JavaC.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/JavaC.sublime-build diff --git a/assets/syntaxes/Packages/Java/JavaDoc.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/JavaDoc.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Java/JavaDoc.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/JavaDoc.sublime-syntax diff --git a/assets/syntaxes/Packages/Java/JavaProperties.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/JavaProperties.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Java/JavaProperties.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/JavaProperties.sublime-syntax diff --git a/assets/syntaxes/Packages/Java/Snippets/abstract.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/abstract.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/abstract.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/abstract.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/assert.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/assert.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/assert.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/assert.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/break.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/break.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/break.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/break.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/case.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/case.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/case.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/case.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/catch.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/catch.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/catch.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/catch.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/class.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/class.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/class.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/class.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/constant-string.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/constant-string.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/constant-string.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/constant-string.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/constant.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/constant.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/constant.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/constant.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/default.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/default.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/default.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/default.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/else-if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/else-if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/else-if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/else-if.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/else.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/else.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/else.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/else.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/final.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/final.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/final.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/final.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/for-(each).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/for-(each).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/for-(each).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/for-(each).sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/for.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/for.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/for.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/for.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/if.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/import-junit_framework_TestCase;.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/import-junit_framework_TestCase;.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/import-junit_framework_TestCase;.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/import-junit_framework_TestCase;.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/import.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/import.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/import.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/import.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/interface.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/interface.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/interface.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/interface.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/java_beans_.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/java_beans_.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/java_beans_.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/java_beans_.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/java_io.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/java_io.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/java_io.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/java_io.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/java_math.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/java_math.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/java_math.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/java_math.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/java_net_.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/java_net_.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/java_net_.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/java_net_.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/java_util_.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/java_util_.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/java_util_.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/java_util_.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/method-(main).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/method-(main).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/method-(main).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/method-(main).sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/method.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/method.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/method.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/method.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/package.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/package.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/package.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/package.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/print.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/print.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/print.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/print.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/println.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/println.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/println.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/println.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/private.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/private.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/private.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/private.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/protected.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/protected.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/protected.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/protected.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/public.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/public.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/public.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/public.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/return.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/return.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/return.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/return.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/static.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/static.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/static.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/static.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/switch.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/switch.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/switch.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/switch.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/synchronized.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/synchronized.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/synchronized.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/synchronized.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/test-case.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/test-case.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/test-case.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/test-case.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/test.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/test.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/test.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/test.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/throw.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/throw.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/throw.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/throw.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/variable.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/variable.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/variable.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/variable.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Snippets/while.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/while.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Java/Snippets/while.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Snippets/while.sublime-snippet diff --git a/assets/syntaxes/Packages/Java/Symbol List - Classes.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Classes.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Symbol List - Classes.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Classes.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Symbol List - Constants.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Constants.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Symbol List - Constants.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Constants.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Symbol List - Inner Class Methods.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Inner Class Methods.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Symbol List - Inner Class Methods.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Inner Class Methods.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Symbol List - Inner Classes.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Inner Classes.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Symbol List - Inner Classes.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Inner Classes.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Symbol List - Inner Inner Class Methods.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Inner Inner Class Methods.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Symbol List - Inner Inner Class Methods.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Inner Inner Class Methods.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Symbol List - Inner Inner Classes.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Inner Inner Classes.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Symbol List - Inner Inner Classes.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Inner Inner Classes.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Symbol List - Method.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Method.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Symbol List - Method.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Method.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Symbol List - Modules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Modules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Symbol List - Modules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Modules.tmPreferences diff --git a/assets/syntaxes/Packages/Java/Symbol List - Properties.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Properties.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Java/Symbol List - Properties.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/Symbol List - Properties.tmPreferences diff --git a/assets/syntaxes/Packages/Java/syntax_test_java.java b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/syntax_test_java.java similarity index 100% rename from assets/syntaxes/Packages/Java/syntax_test_java.java rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/syntax_test_java.java diff --git a/assets/syntaxes/Packages/Java/syntax_test_java_properties.properties b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/syntax_test_java_properties.properties similarity index 100% rename from assets/syntaxes/Packages/Java/syntax_test_java_properties.properties rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/syntax_test_java_properties.properties diff --git a/assets/syntaxes/Packages/Java/syntax_test_jsp.jsp b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/syntax_test_jsp.jsp similarity index 100% rename from assets/syntaxes/Packages/Java/syntax_test_jsp.jsp rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Java/syntax_test_jsp.jsp diff --git a/assets/syntaxes/Packages/JavaScript/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/JavaScript/Completion Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Completion Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Completion Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Completion Rules.tmPreferences diff --git a/assets/syntaxes/Packages/JavaScript/Default.sublime-keymap b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Default.sublime-keymap similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Default.sublime-keymap rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Default.sublime-keymap diff --git a/assets/syntaxes/Packages/JavaScript/Indexed Symbols.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Indexed Symbols.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Indexed Symbols.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Indexed Symbols.tmPreferences diff --git a/assets/syntaxes/Packages/JavaScript/JavaScript Indent.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/JavaScript Indent.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/JavaScript/JavaScript Indent.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/JavaScript Indent.tmPreferences diff --git a/assets/syntaxes/Packages/JavaScript/JavaScript.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/JavaScript.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/JavaScript/JavaScript.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/JavaScript.sublime-syntax diff --git a/assets/syntaxes/Packages/JavaScript/Regular Expressions (JavaScript).sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Regular Expressions (JavaScript).sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Regular Expressions (JavaScript).sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Regular Expressions (JavaScript).sublime-syntax diff --git a/assets/syntaxes/Packages/JavaScript/Snippets/Get-Elements.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/Get-Elements.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Snippets/Get-Elements.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/Get-Elements.sublime-snippet diff --git a/assets/syntaxes/Packages/JavaScript/Snippets/Object-Method.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/Object-Method.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Snippets/Object-Method.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/Object-Method.sublime-snippet diff --git a/assets/syntaxes/Packages/JavaScript/Snippets/Object-Value-JS.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/Object-Value-JS.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Snippets/Object-Value-JS.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/Object-Value-JS.sublime-snippet diff --git a/assets/syntaxes/Packages/JavaScript/Snippets/Object-key-key-value.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/Object-key-key-value.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Snippets/Object-key-key-value.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/Object-key-key-value.sublime-snippet diff --git a/assets/syntaxes/Packages/JavaScript/Snippets/Prototype-(proto).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/Prototype-(proto).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Snippets/Prototype-(proto).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/Prototype-(proto).sublime-snippet diff --git a/assets/syntaxes/Packages/JavaScript/Snippets/for-()-{}-(faster).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/for-()-{}-(faster).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Snippets/for-()-{}-(faster).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/for-()-{}-(faster).sublime-snippet diff --git a/assets/syntaxes/Packages/JavaScript/Snippets/for-()-{}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/for-()-{}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Snippets/for-()-{}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/for-()-{}.sublime-snippet diff --git a/assets/syntaxes/Packages/JavaScript/Snippets/function-(fun).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/function-(fun).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Snippets/function-(fun).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/function-(fun).sublime-snippet diff --git a/assets/syntaxes/Packages/JavaScript/Snippets/function.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/function.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Snippets/function.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/function.sublime-snippet diff --git a/assets/syntaxes/Packages/JavaScript/Snippets/if-___-else.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/if-___-else.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Snippets/if-___-else.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/if-___-else.sublime-snippet diff --git a/assets/syntaxes/Packages/JavaScript/Snippets/if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Snippets/if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/if.sublime-snippet diff --git a/assets/syntaxes/Packages/JavaScript/Snippets/setTimeout-function.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/setTimeout-function.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Snippets/setTimeout-function.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Snippets/setTimeout-function.sublime-snippet diff --git a/assets/syntaxes/Packages/JavaScript/Symbol List Banned.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Symbol List Banned.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Symbol List Banned.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Symbol List Banned.tmPreferences diff --git a/assets/syntaxes/Packages/JavaScript/Symbol List Function.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Symbol List Function.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/JavaScript/Symbol List Function.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/Symbol List Function.tmPreferences diff --git a/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js.js b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js.js similarity index 100% rename from assets/syntaxes/Packages/JavaScript/tests/syntax_test_js.js rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js.js diff --git a/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_bindings.js b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_bindings.js similarity index 100% rename from assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_bindings.js rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_bindings.js diff --git a/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_regexp.js b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_regexp.js similarity index 100% rename from assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_regexp.js rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_regexp.js diff --git a/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_builtin.js b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_builtin.js similarity index 100% rename from assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_builtin.js rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_builtin.js diff --git a/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_console.js b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_console.js similarity index 100% rename from assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_console.js rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_console.js diff --git a/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_dom.js b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_dom.js similarity index 100% rename from assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_dom.js rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_dom.js diff --git a/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_node.js b/crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_node.js similarity index 100% rename from assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_node.js rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/JavaScript/tests/syntax_test_js_support_node.js diff --git a/assets/syntaxes/Packages/LICENSE b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LICENSE similarity index 100% rename from assets/syntaxes/Packages/LICENSE rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LICENSE diff --git a/assets/syntaxes/Packages/LaTeX/Bibtex.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Bibtex.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Bibtex.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Bibtex.sublime-syntax diff --git a/assets/syntaxes/Packages/LaTeX/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/LaTeX/Indentation Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Indentation Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Indentation Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Indentation Rules.tmPreferences diff --git a/assets/syntaxes/Packages/LaTeX/LaTeX Log.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/LaTeX Log.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/LaTeX/LaTeX Log.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/LaTeX Log.sublime-syntax diff --git a/assets/syntaxes/Packages/LaTeX/LaTeX.sublime-settings b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/LaTeX.sublime-settings similarity index 100% rename from assets/syntaxes/Packages/LaTeX/LaTeX.sublime-settings rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/LaTeX.sublime-settings diff --git a/assets/syntaxes/Packages/LaTeX/LaTeX.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/LaTeX.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/LaTeX/LaTeX.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/LaTeX.sublime-syntax diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Cases.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Cases.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Cases.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Cases.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Chapter.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Chapter.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Chapter.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Chapter.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Description.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Description.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Description.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Description.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Displaymath-($$).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Displaymath-($$).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Displaymath-($$).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Displaymath-($$).sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Enumerate.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Enumerate.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Enumerate.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Enumerate.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Equation.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Equation.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Equation.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Equation.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Figure.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Figure.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Figure.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Figure.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Item[description].sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Item[description].sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Item[description].sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Item[description].sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Itemize.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Itemize.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Itemize.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Itemize.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Listing.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Listing.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Listing.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Listing.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Matrix.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Matrix.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Matrix.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Matrix.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Page.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Page.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Page.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Page.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Paragraph.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Paragraph.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Paragraph.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Paragraph.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Part.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Part.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Part.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Part.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Section.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Section.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Section.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Section.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Split.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Split.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Split.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Split.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Sub-Paragraph.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Sub-Paragraph.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Sub-Paragraph.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Sub-Paragraph.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Table.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Table.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Table.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Table.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/Tabular.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Tabular.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/Tabular.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/Tabular.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/begin{}-end{}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/begin{}-end{}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/begin{}-end{}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/begin{}-end{}.sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/section-..-(section).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/section-..-(section).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/section-..-(section).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/section-..-(section).sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/subsection-..-(sub).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/subsection-..-(sub).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/subsection-..-(sub).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/subsection-..-(sub).sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Snippets/subsubsection-..-(ssub).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/subsubsection-..-(ssub).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Snippets/subsubsection-..-(ssub).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Snippets/subsubsection-..-(ssub).sublime-snippet diff --git a/assets/syntaxes/Packages/LaTeX/Symbol List - Commands.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Symbol List - Commands.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Symbol List - Commands.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Symbol List - Commands.tmPreferences diff --git a/assets/syntaxes/Packages/LaTeX/Symbol List - Labels.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Symbol List - Labels.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Symbol List - Labels.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Symbol List - Labels.tmPreferences diff --git a/assets/syntaxes/Packages/LaTeX/Symbol List - Sections.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Symbol List - Sections.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/LaTeX/Symbol List - Sections.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/Symbol List - Sections.tmPreferences diff --git a/assets/syntaxes/Packages/LaTeX/TeX.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/TeX.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/LaTeX/TeX.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/TeX.sublime-syntax diff --git a/assets/syntaxes/Packages/LaTeX/syntax_test_latex.tex b/crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/syntax_test_latex.tex similarity index 100% rename from assets/syntaxes/Packages/LaTeX/syntax_test_latex.tex rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/LaTeX/syntax_test_latex.tex diff --git a/assets/syntaxes/Packages/Lisp/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Lisp/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Lisp/Lisp.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Lisp.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Lisp/Lisp.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Lisp.sublime-syntax diff --git a/assets/syntaxes/Packages/Lisp/Snippets/'(.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/'(.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lisp/Snippets/'(.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/'(.sublime-snippet diff --git a/assets/syntaxes/Packages/Lisp/Snippets/defconstant.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/defconstant.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lisp/Snippets/defconstant.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/defconstant.sublime-snippet diff --git a/assets/syntaxes/Packages/Lisp/Snippets/defmacro.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/defmacro.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lisp/Snippets/defmacro.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/defmacro.sublime-snippet diff --git a/assets/syntaxes/Packages/Lisp/Snippets/defparameter.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/defparameter.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lisp/Snippets/defparameter.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/defparameter.sublime-snippet diff --git a/assets/syntaxes/Packages/Lisp/Snippets/defun.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/defun.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lisp/Snippets/defun.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/defun.sublime-snippet diff --git a/assets/syntaxes/Packages/Lisp/Snippets/defvar.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/defvar.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lisp/Snippets/defvar.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/defvar.sublime-snippet diff --git a/assets/syntaxes/Packages/Lisp/Snippets/if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lisp/Snippets/if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/if.sublime-snippet diff --git a/assets/syntaxes/Packages/Lisp/Snippets/let.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/let.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lisp/Snippets/let.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/let.sublime-snippet diff --git a/assets/syntaxes/Packages/Lisp/Snippets/let1.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/let1.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lisp/Snippets/let1.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/let1.sublime-snippet diff --git a/assets/syntaxes/Packages/Lisp/Snippets/setf.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/setf.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lisp/Snippets/setf.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/Snippets/setf.sublime-snippet diff --git a/assets/syntaxes/Packages/Lisp/syntax_test_lisp.lisp b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/syntax_test_lisp.lisp similarity index 100% rename from assets/syntaxes/Packages/Lisp/syntax_test_lisp.lisp rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lisp/syntax_test_lisp.lisp diff --git a/assets/syntaxes/Packages/Lua/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Lua/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Lua/Completion Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Completion Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Lua/Completion Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Completion Rules.tmPreferences diff --git a/assets/syntaxes/Packages/Lua/Indent.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Indent.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Lua/Indent.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Indent.tmPreferences diff --git a/assets/syntaxes/Packages/Lua/Lua.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Lua.sublime-build similarity index 96% rename from assets/syntaxes/Packages/Lua/Lua.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Lua.sublime-build index 227422da9..51717eb03 100644 --- a/assets/syntaxes/Packages/Lua/Lua.sublime-build +++ b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Lua.sublime-build @@ -1,5 +1,5 @@ -{ - "cmd": ["lua", "$file"], - "file_regex": "^(?:lua:)?[\t ](...*?):([0-9]*):?([0-9]*)", - "selector": "source.lua" +{ + "cmd": ["lua", "$file"], + "file_regex": "^(?:lua:)?[\t ](...*?):([0-9]*):?([0-9]*)", + "selector": "source.lua" } \ No newline at end of file diff --git a/assets/syntaxes/Packages/Lua/Lua.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Lua.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Lua/Lua.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Lua.sublime-syntax diff --git a/assets/syntaxes/Packages/Lua/Snippets/for-i-v-in-ipairs().sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/for-i-v-in-ipairs().sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lua/Snippets/for-i-v-in-ipairs().sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/for-i-v-in-ipairs().sublime-snippet diff --git a/assets/syntaxes/Packages/Lua/Snippets/for-i=1-10.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/for-i=1-10.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lua/Snippets/for-i=1-10.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/for-i=1-10.sublime-snippet diff --git a/assets/syntaxes/Packages/Lua/Snippets/for-k-v-in-pairs().sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/for-k-v-in-pairs().sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lua/Snippets/for-k-v-in-pairs().sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/for-k-v-in-pairs().sublime-snippet diff --git a/assets/syntaxes/Packages/Lua/Snippets/function-(fun).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/function-(fun).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lua/Snippets/function-(fun).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/function-(fun).sublime-snippet diff --git a/assets/syntaxes/Packages/Lua/Snippets/function-(function).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/function-(function).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lua/Snippets/function-(function).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/function-(function).sublime-snippet diff --git a/assets/syntaxes/Packages/Lua/Snippets/local-x-=-1.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/local-x-=-1.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lua/Snippets/local-x-=-1.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/local-x-=-1.sublime-snippet diff --git a/assets/syntaxes/Packages/Lua/Snippets/table.concat.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/table.concat.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lua/Snippets/table.concat.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/table.concat.sublime-snippet diff --git a/assets/syntaxes/Packages/Lua/Snippets/table.sort.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/table.sort.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Lua/Snippets/table.sort.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Snippets/table.sort.sublime-snippet diff --git a/assets/syntaxes/Packages/Lua/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Lua/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/Lua/tests/syntax_test_lua.lua b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/tests/syntax_test_lua.lua similarity index 100% rename from assets/syntaxes/Packages/Lua/tests/syntax_test_lua.lua rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/tests/syntax_test_lua.lua diff --git a/assets/syntaxes/Packages/Lua/tests/syntax_test_lua_support.lua b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/tests/syntax_test_lua_support.lua similarity index 100% rename from assets/syntaxes/Packages/Lua/tests/syntax_test_lua_support.lua rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Lua/tests/syntax_test_lua_support.lua diff --git a/assets/syntaxes/Packages/Makefile/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Makefile/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Makefile/Make Output.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/Make Output.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Makefile/Make Output.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/Make Output.sublime-syntax diff --git a/assets/syntaxes/Packages/Makefile/Make.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/Make.sublime-build similarity index 100% rename from assets/syntaxes/Packages/Makefile/Make.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/Make.sublime-build diff --git a/assets/syntaxes/Packages/Makefile/Makefile.sublime-settings b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/Makefile.sublime-settings similarity index 100% rename from assets/syntaxes/Packages/Makefile/Makefile.sublime-settings rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/Makefile.sublime-settings diff --git a/assets/syntaxes/Packages/Makefile/Makefile.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/Makefile.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Makefile/Makefile.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/Makefile.sublime-syntax diff --git a/assets/syntaxes/Packages/Makefile/Miscellaneous.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/Miscellaneous.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Makefile/Miscellaneous.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/Miscellaneous.tmPreferences diff --git a/assets/syntaxes/Packages/Makefile/syntax_test_makefile.mak b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/syntax_test_makefile.mak similarity index 100% rename from assets/syntaxes/Packages/Makefile/syntax_test_makefile.mak rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Makefile/syntax_test_makefile.mak diff --git a/assets/syntaxes/Packages/Markdown/Indent%3A Raw.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/Indent%3A Raw.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Markdown/Indent%3A Raw.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/Indent%3A Raw.tmPreferences diff --git a/assets/syntaxes/Packages/Markdown/Markdown.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/Markdown.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Markdown/Markdown.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/Markdown.sublime-syntax diff --git a/assets/syntaxes/Packages/Markdown/MultiMarkdown.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/MultiMarkdown.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Markdown/MultiMarkdown.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/MultiMarkdown.sublime-syntax diff --git a/assets/syntaxes/Packages/Markdown/Symbol List - Heading.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/Symbol List - Heading.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Markdown/Symbol List - Heading.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/Symbol List - Heading.tmPreferences diff --git a/assets/syntaxes/Packages/Markdown/Symbol List - Reference Link.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/Symbol List - Reference Link.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Markdown/Symbol List - Reference Link.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/Symbol List - Reference Link.tmPreferences diff --git a/assets/syntaxes/Packages/Markdown/syntax_test_markdown.md b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/syntax_test_markdown.md similarity index 100% rename from assets/syntaxes/Packages/Markdown/syntax_test_markdown.md rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/syntax_test_markdown.md diff --git a/assets/syntaxes/Packages/Markdown/syntax_test_multimarkdown.md b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/syntax_test_multimarkdown.md similarity index 100% rename from assets/syntaxes/Packages/Markdown/syntax_test_multimarkdown.md rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Markdown/syntax_test_multimarkdown.md diff --git a/assets/syntaxes/Packages/Matlab/Indent.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Indent.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Matlab/Indent.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Indent.tmPreferences diff --git a/assets/syntaxes/Packages/Matlab/Matlab.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Matlab.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Matlab/Matlab.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Matlab.sublime-syntax diff --git a/assets/syntaxes/Packages/Matlab/Miscellaneous.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Miscellaneous.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Matlab/Miscellaneous.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Miscellaneous.tmPreferences diff --git a/assets/syntaxes/Packages/Matlab/Snippets/Octave-function.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/Octave-function.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/Octave-function.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/Octave-function.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/^.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/^.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/^.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/^.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/case.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/case.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/case.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/case.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/clear.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/clear.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/clear.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/clear.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/disp-sprintf.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/disp-sprintf.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/disp-sprintf.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/disp-sprintf.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/disp.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/disp.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/disp.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/disp.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/dlmwrite.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/dlmwrite.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/dlmwrite.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/dlmwrite.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/else.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/else.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/else.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/else.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/elseif.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/elseif.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/elseif.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/elseif.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/error.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/error.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/error.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/error.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/exp.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/exp.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/exp.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/exp.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/fprintf.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/fprintf.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/fprintf.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/fprintf.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/get.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/get.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/get.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/get.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/griddata.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/griddata.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/griddata.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/griddata.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/if-elseif.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/if-elseif.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/if-elseif.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/if-elseif.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/line.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/line.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/line.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/line.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/set.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/set.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/set.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/set.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/small-function.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/small-function.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/small-function.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/small-function.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/sprintf.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/sprintf.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/sprintf.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/sprintf.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/switch___case___otherwise___end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/switch___case___otherwise___end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/switch___case___otherwise___end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/switch___case___otherwise___end.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/title.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/title.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/title.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/title.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/unix.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/unix.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/unix.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/unix.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/unwind_protect-cleanup-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/unwind_protect-cleanup-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/unwind_protect-cleanup-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/unwind_protect-cleanup-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/warning.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/warning.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/warning.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/warning.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/while.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/while.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/while.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/while.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/xlabel.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/xlabel.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/xlabel.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/xlabel.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/xtick.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/xtick.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/xtick.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/xtick.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/ylabel.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/ylabel.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/ylabel.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/ylabel.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/ytick.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/ytick.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/ytick.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/ytick.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Snippets/zlabel.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/zlabel.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Matlab/Snippets/zlabel.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Snippets/zlabel.sublime-snippet diff --git a/assets/syntaxes/Packages/Matlab/Symbols.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Symbols.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Matlab/Symbols.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/Symbols.tmPreferences diff --git a/assets/syntaxes/Packages/Matlab/syntax_test_matlab.m b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/syntax_test_matlab.m similarity index 100% rename from assets/syntaxes/Packages/Matlab/syntax_test_matlab.m rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Matlab/syntax_test_matlab.m diff --git a/assets/syntaxes/Packages/OCaml/Indent rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Indent rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Indent rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Indent rules.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Miscellaneous.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Miscellaneous.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Miscellaneous.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Miscellaneous.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/OCaml.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/OCaml.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/OCaml/OCaml.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/OCaml.sublime-syntax diff --git a/assets/syntaxes/Packages/OCaml/OCamllex.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/OCamllex.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/OCaml/OCamllex.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/OCamllex.sublime-syntax diff --git a/assets/syntaxes/Packages/OCaml/OCamlyacc.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/OCamlyacc.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/OCaml/OCamlyacc.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/OCamlyacc.sublime-syntax diff --git a/assets/syntaxes/Packages/OCaml/Snippets/Document.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/Document.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/Document.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/Document.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/For-Loop.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/For-Loop.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/For-Loop.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/For-Loop.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/While-Loop.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/While-Loop.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/While-Loop.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/While-Loop.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/begin.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/begin.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/begin.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/begin.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/class.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/class.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/class.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/class.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/fun.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/fun.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/fun.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/fun.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/func.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/func.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/func.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/func.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/function-label.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/function-label.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/function-label.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/function-label.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/let-in.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/let-in.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/let-in.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/let-in.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/let.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/let.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/let.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/let.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/match-pattern.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/match-pattern.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/match-pattern.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/match-pattern.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/match.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/match.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/match.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/match.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/method-(method).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/method-(method).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/method-(method).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/method-(method).sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/module-signature.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/module-signature.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/module-signature.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/module-signature.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/module-type.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/module-type.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/module-type.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/module-type.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/module.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/module.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/module.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/module.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/try.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/try.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/try.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/try.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/type-(type).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/type-(type).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/type-(type).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/type-(type).sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Snippets/untitled.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/untitled.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/OCaml/Snippets/untitled.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Snippets/untitled.sublime-snippet diff --git a/assets/syntaxes/Packages/OCaml/Symbol List%3A Classes.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Classes.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List%3A Classes.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Classes.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List%3A Exceptions.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Exceptions.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List%3A Exceptions.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Exceptions.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamllex pattern definition.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamllex pattern definition.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamllex pattern definition.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamllex pattern definition.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamllex pattern references.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamllex pattern references.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamllex pattern references.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamllex pattern references.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamllex rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamllex rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamllex rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamllex rules.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc non-terminal definition.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc non-terminal definition.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc non-terminal definition.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc non-terminal definition.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc non-terminal reference.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc non-terminal reference.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc non-terminal reference.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc non-terminal reference.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc token definition.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc token definition.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc token definition.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc token definition.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc token reference.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc token reference.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc token reference.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Ocamlyacc token reference.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List%3A Types.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Types.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List%3A Types.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Types.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List%3A Variants.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Variants.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List%3A Variants.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List%3A Variants.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List_ Classes.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Classes.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List_ Classes.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Classes.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List_ Exceptions.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Exceptions.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List_ Exceptions.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Exceptions.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamllex pattern definition.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamllex pattern definition.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List_ Ocamllex pattern definition.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamllex pattern definition.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamllex pattern references.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamllex pattern references.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List_ Ocamllex pattern references.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamllex pattern references.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamllex rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamllex rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List_ Ocamllex rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamllex rules.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc non-terminal definition.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc non-terminal definition.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc non-terminal definition.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc non-terminal definition.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc non-terminal reference.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc non-terminal reference.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc non-terminal reference.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc non-terminal reference.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc token definition.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc token definition.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc token definition.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc token definition.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc token reference.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc token reference.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc token reference.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Ocamlyacc token reference.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List_ Types.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Types.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List_ Types.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Types.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/Symbol List_ Variants.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Variants.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/OCaml/Symbol List_ Variants.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/Symbol List_ Variants.tmPreferences diff --git a/assets/syntaxes/Packages/OCaml/camlp4.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/camlp4.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/OCaml/camlp4.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/camlp4.sublime-syntax diff --git a/assets/syntaxes/Packages/OCaml/syntax_test_ml.ml b/crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/syntax_test_ml.ml similarity index 100% rename from assets/syntaxes/Packages/OCaml/syntax_test_ml.ml rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/OCaml/syntax_test_ml.ml diff --git a/assets/syntaxes/Packages/Objective-C/Default.sublime-keymap b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/Default.sublime-keymap similarity index 100% rename from assets/syntaxes/Packages/Objective-C/Default.sublime-keymap rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/Default.sublime-keymap diff --git a/assets/syntaxes/Packages/Objective-C/Objective-C++.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/Objective-C++.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Objective-C/Objective-C++.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/Objective-C++.sublime-syntax diff --git a/assets/syntaxes/Packages/Objective-C/Objective-C.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/Objective-C.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Objective-C/Objective-C.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/Objective-C.sublime-syntax diff --git a/assets/syntaxes/Packages/Objective-C/Symbol Index Include Constants.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/Symbol Index Include Constants.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Objective-C/Symbol Index Include Constants.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/Symbol Index Include Constants.tmPreferences diff --git a/assets/syntaxes/Packages/Objective-C/Symbol Index.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/Symbol Index.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Objective-C/Symbol Index.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/Symbol Index.tmPreferences diff --git a/assets/syntaxes/Packages/Objective-C/syntax_test_accessor.m b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/syntax_test_accessor.m similarity index 100% rename from assets/syntaxes/Packages/Objective-C/syntax_test_accessor.m rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/syntax_test_accessor.m diff --git a/assets/syntaxes/Packages/Objective-C/syntax_test_accessor.mm b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/syntax_test_accessor.mm similarity index 100% rename from assets/syntaxes/Packages/Objective-C/syntax_test_accessor.mm rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/syntax_test_accessor.mm diff --git a/assets/syntaxes/Packages/Objective-C/syntax_test_objc++.mm b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/syntax_test_objc++.mm similarity index 100% rename from assets/syntaxes/Packages/Objective-C/syntax_test_objc++.mm rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/syntax_test_objc++.mm diff --git a/assets/syntaxes/Packages/Objective-C/syntax_test_objc.m b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/syntax_test_objc.m similarity index 100% rename from assets/syntaxes/Packages/Objective-C/syntax_test_objc.m rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Objective-C/syntax_test_objc.m diff --git a/assets/syntaxes/Packages/PHP/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/PHP/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/PHP/Completion Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Completion Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/PHP/Completion Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Completion Rules.tmPreferences diff --git a/assets/syntaxes/Packages/PHP/Indentation Rules - heredoc end.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Indentation Rules - heredoc end.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/PHP/Indentation Rules - heredoc end.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Indentation Rules - heredoc end.tmPreferences diff --git a/assets/syntaxes/Packages/PHP/Indentation Rules Annex.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Indentation Rules Annex.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/PHP/Indentation Rules Annex.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Indentation Rules Annex.tmPreferences diff --git a/assets/syntaxes/Packages/PHP/Indentation Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Indentation Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/PHP/Indentation Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Indentation Rules.tmPreferences diff --git a/assets/syntaxes/Packages/PHP/PHP Source.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/PHP Source.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/PHP/PHP Source.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/PHP Source.sublime-syntax diff --git a/assets/syntaxes/Packages/PHP/PHP.sublime-completions b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/PHP.sublime-completions similarity index 100% rename from assets/syntaxes/Packages/PHP/PHP.sublime-completions rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/PHP.sublime-completions diff --git a/assets/syntaxes/Packages/PHP/PHP.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/PHP.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/PHP/PHP.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/PHP.sublime-syntax diff --git a/assets/syntaxes/Packages/PHP/Regular Expressions (PHP).sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Regular Expressions (PHP).sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/PHP/Regular Expressions (PHP).sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Regular Expressions (PHP).sublime-syntax diff --git a/assets/syntaxes/Packages/PHP/Snippets/$GLOBALS[''].sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$GLOBALS[''].sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/$GLOBALS[''].sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$GLOBALS[''].sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/$_COOKIE[''].sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_COOKIE[''].sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/$_COOKIE[''].sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_COOKIE[''].sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/$_ENV[''].sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_ENV[''].sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/$_ENV[''].sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_ENV[''].sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/$_FILES[''].sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_FILES[''].sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/$_FILES[''].sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_FILES[''].sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/$_GET[''].sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_GET[''].sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/$_GET[''].sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_GET[''].sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/$_POST[''].sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_POST[''].sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/$_POST[''].sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_POST[''].sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/$_REQUEST[''].sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_REQUEST[''].sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/$_REQUEST[''].sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_REQUEST[''].sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/$_SERVER[''].sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_SERVER[''].sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/$_SERVER[''].sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_SERVER[''].sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/$_SESSION[''].sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_SESSION[''].sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/$_SESSION[''].sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/$_SESSION[''].sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/Constructor.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/Constructor.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/Constructor.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/Constructor.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-class-var.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-class-var.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/PHPDoc-class-var.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-class-var.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-class.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-class.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/PHPDoc-class.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-class.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-constant-definition.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-constant-definition.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/PHPDoc-constant-definition.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-constant-definition.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-function-signature.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-function-signature.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/PHPDoc-function-signature.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-function-signature.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-function.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-function.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/PHPDoc-function.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-function.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-interface.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-interface.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/PHPDoc-interface.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/PHPDoc-interface.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/Start-Docblock.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/Start-Docblock.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/Start-Docblock.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/Start-Docblock.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/class-{-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/class-{-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/class-{-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/class-{-}.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/define(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/define(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/define(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/define(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/defined(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/defined(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/defined(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/defined(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/do-while(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/do-while(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/do-while(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/do-while(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/echo-___.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/echo-___.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/echo-___.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/echo-___.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/elseif(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/elseif(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/elseif(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/elseif(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/for(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/for(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/for(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/for(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/foreach(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/foreach(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/foreach(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/foreach(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/function-xx(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/function-xx(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/function-xx(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/function-xx(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/if(-)-else(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/if(-)-else(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/if(-)-else(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/if(-)-else(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/if(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/if(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/if(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/if(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/if-a-b;.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/if-a-b;.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/if-a-b;.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/if-a-b;.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/include(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/include(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/include(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/include(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/include_once(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/include_once(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/include_once(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/include_once(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/new-array(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/new-array(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/new-array(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/new-array(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/php-$this.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-$this.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/php-$this.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-$this.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/php-echo-$this.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-echo-$this.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/php-echo-$this.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-echo-$this.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/php-echo-___.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-echo-___.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/php-echo-___.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-echo-___.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/php-echo-htmlentities(___).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-echo-htmlentities(___).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/php-echo-htmlentities(___).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-echo-htmlentities(___).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/php-else.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-else.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/php-else.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-else.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/php-foreach-(___)-___-php-endforeach.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-foreach-(___)-___-php-endforeach.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/php-foreach-(___)-___-php-endforeach.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-foreach-(___)-___-php-endforeach.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/php-if-(___)-___-php-else-___-php-endif.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-if-(___)-___-php-else-___-php-endif.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/php-if-(___)-___-php-else-___-php-endif.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-if-(___)-___-php-else-___-php-endif.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/php-if-(___)-___-php-endif.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-if-(___)-___-php-endif.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/php-if-(___)-___-php-endif.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php-if-(___)-___-php-endif.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/php.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/php.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/php.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/require(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/require(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/require(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/require(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/require_once(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/require_once(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/require_once(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/require_once(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/return-$retVal;.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/return-$retVal;.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/return-$retVal;.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/return-$retVal;.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/return-FALSE;.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/return-FALSE;.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/return-FALSE;.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/return-FALSE;.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/return-TRUE;.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/return-TRUE;.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/return-TRUE;.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/return-TRUE;.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/switch(-)-case.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/switch(-)-case.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/switch(-)-case.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/switch(-)-case.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/switch(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/switch(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/switch(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/switch(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/throw.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/throw.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/throw.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/throw.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/try-{-___-}-catch-(___)-{-___-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/try-{-___-}-catch-(___)-{-___-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/try-{-___-}-catch-(___)-{-___-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/try-{-___-}-catch-(___)-{-___-}.sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Snippets/while(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/while(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/PHP/Snippets/while(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Snippets/while(-).sublime-snippet diff --git a/assets/syntaxes/Packages/PHP/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/PHP/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/PHP/syntax_test_php.php b/crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/syntax_test_php.php similarity index 100% rename from assets/syntaxes/Packages/PHP/syntax_test_php.php rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/PHP/syntax_test_php.php diff --git a/assets/syntaxes/Packages/Pascal/Miscellaneous.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Pascal/Miscellaneous.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Pascal/Miscellaneous.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Pascal/Miscellaneous.tmPreferences diff --git a/assets/syntaxes/Packages/Pascal/Pascal.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Pascal/Pascal.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Pascal/Pascal.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Pascal/Pascal.sublime-syntax diff --git a/assets/syntaxes/Packages/Pascal/syntax_test.pas b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Pascal/syntax_test.pas similarity index 100% rename from assets/syntaxes/Packages/Pascal/syntax_test.pas rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Pascal/syntax_test.pas diff --git a/assets/syntaxes/Packages/Perl/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Perl/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Perl/Perl.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Perl.sublime-build similarity index 100% rename from assets/syntaxes/Packages/Perl/Perl.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Perl.sublime-build diff --git a/assets/syntaxes/Packages/Perl/Perl.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Perl.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Perl/Perl.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Perl.sublime-syntax diff --git a/assets/syntaxes/Packages/Perl/Snippets/Conditional-if-(if).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-if-(if).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Conditional-if-(if).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-if-(if).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Conditional-if..else-(ife).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-if..else-(ife).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Conditional-if..else-(ife).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-if..else-(ife).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Conditional-if..elsif..else-(ifee).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-if..elsif..else-(ifee).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Conditional-if..elsif..else-(ifee).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-if..elsif..else-(ifee).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Conditional-one-line-(xif).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-one-line-(xif).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Conditional-one-line-(xif).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-one-line-(xif).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Conditional-one-line-(xunless).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-one-line-(xunless).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Conditional-one-line-(xunless).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-one-line-(xunless).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Conditional-one-line-(xwhen).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-one-line-(xwhen).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Conditional-one-line-(xwhen).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-one-line-(xwhen).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Conditional-unless-(unless).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-unless-(unless).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Conditional-unless-(unless).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-unless-(unless).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Conditional-unless..else-(unlesse).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-unless..else-(unlesse).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Conditional-unless..else-(unlesse).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-unless..else-(unlesse).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Conditional-unless..elsif..else-(unlessee).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-unless..elsif..else-(unlessee).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Conditional-unless..elsif..else-(unlessee).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-unless..elsif..else-(unlessee).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Conditional-when-(when).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-when-(when).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Conditional-when-(when).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Conditional-when-(when).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Function-(sub).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Function-(sub).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Function-(sub).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Function-(sub).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Loop-for-(for).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-for-(for).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Loop-for-(for).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-for-(for).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Loop-foreach-(fore).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-foreach-(fore).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Loop-foreach-(fore).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-foreach-(fore).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xfor).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xfor).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xfor).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xfor).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xfore).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xfore).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xfore).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xfore).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xuntil).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xuntil).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xuntil).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xuntil).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xwhile).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xwhile).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xwhile).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-one-line-(xwhile).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Loop-while-(while).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-while-(while).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Loop-while-(while).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Loop-while-(while).sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/Test.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Test.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/Test.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/Test.sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/class.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/class.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/class.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/class.sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/eval.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/eval.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/eval.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/eval.sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/Snippets/slurp.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/slurp.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Perl/Snippets/slurp.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/Snippets/slurp.sublime-snippet diff --git a/assets/syntaxes/Packages/Perl/syntax_test_perl.pl b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/syntax_test_perl.pl similarity index 100% rename from assets/syntaxes/Packages/Perl/syntax_test_perl.pl rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Perl/syntax_test_perl.pl diff --git a/assets/syntaxes/Packages/Python/Completion Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Completion Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Python/Completion Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Completion Rules.tmPreferences diff --git a/assets/syntaxes/Packages/Python/Default.sublime-keymap b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Default.sublime-keymap similarity index 100% rename from assets/syntaxes/Packages/Python/Default.sublime-keymap rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Default.sublime-keymap diff --git a/assets/syntaxes/Packages/Python/Miscellaneous.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Miscellaneous.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Python/Miscellaneous.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Miscellaneous.tmPreferences diff --git a/assets/syntaxes/Packages/Python/Python.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Python.sublime-build similarity index 100% rename from assets/syntaxes/Packages/Python/Python.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Python.sublime-build diff --git a/assets/syntaxes/Packages/Python/Python.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Python.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Python/Python.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Python.sublime-syntax diff --git a/assets/syntaxes/Packages/Python/Regular Expressions (Python).sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Regular Expressions (Python).sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Python/Regular Expressions (Python).sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Regular Expressions (Python).sublime-syntax diff --git a/assets/syntaxes/Packages/Python/Snippets/New-Class.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/New-Class.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/New-Class.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/New-Class.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Snippets/New-Property.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/New-Property.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/New-Property.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/New-Property.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Snippets/Try-Except-Else-Finally.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/Try-Except-Else-Finally.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/Try-Except-Else-Finally.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/Try-Except-Else-Finally.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Snippets/Try-Except-Else.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/Try-Except-Else.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/Try-Except-Else.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/Try-Except-Else.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Snippets/Try-Except-Finally.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/Try-Except-Finally.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/Try-Except-Finally.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/Try-Except-Finally.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Snippets/Try-Except.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/Try-Except.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/Try-Except.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/Try-Except.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Snippets/__magic__.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/__magic__.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/__magic__.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/__magic__.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Snippets/for.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/for.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/for.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/for.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Snippets/function.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/function.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/function.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/function.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Snippets/if-__name__-==-'__main__'.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/if-__name__-==-'__main__'.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/if-__name__-==-'__main__'.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/if-__name__-==-'__main__'.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Snippets/if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/if.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Snippets/method.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/method.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/method.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/method.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Snippets/while.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/while.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Python/Snippets/while.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Snippets/while.sublime-snippet diff --git a/assets/syntaxes/Packages/Python/Symbol Index.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Symbol Index.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Python/Symbol Index.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Symbol Index.tmPreferences diff --git a/assets/syntaxes/Packages/Python/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Python/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/Python/syntax_test_python.py b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/syntax_test_python.py similarity index 100% rename from assets/syntaxes/Packages/Python/syntax_test_python.py rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/syntax_test_python.py diff --git a/assets/syntaxes/Packages/Python/syntax_test_python_strings.py b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/syntax_test_python_strings.py similarity index 100% rename from assets/syntaxes/Packages/Python/syntax_test_python_strings.py rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Python/syntax_test_python_strings.py diff --git a/assets/syntaxes/Packages/R/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/R/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/R/R Console.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/R Console.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/R/R Console.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/R Console.sublime-syntax diff --git a/assets/syntaxes/Packages/R/R.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/R.sublime-build similarity index 100% rename from assets/syntaxes/Packages/R/R.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/R.sublime-build diff --git a/assets/syntaxes/Packages/R/R.sublime-settings b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/R.sublime-settings similarity index 100% rename from assets/syntaxes/Packages/R/R.sublime-settings rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/R.sublime-settings diff --git a/assets/syntaxes/Packages/R/R.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/R.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/R/R.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/R.sublime-syntax diff --git a/assets/syntaxes/Packages/R/Rd (R Documentation).sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Rd (R Documentation).sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/R/Rd (R Documentation).sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Rd (R Documentation).sublime-syntax diff --git a/assets/syntaxes/Packages/R/Snippets/Add-Tick-Marks.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Add-Tick-Marks.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Add-Tick-Marks.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Add-Tick-Marks.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Attach.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Attach.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Attach.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Attach.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Cummulative.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Cummulative.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Cummulative.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Cummulative.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Density.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Density.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Density.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Density.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Detach.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Detach.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Detach.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Detach.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Divide-Into-Intervals.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Divide-Into-Intervals.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Divide-Into-Intervals.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Divide-Into-Intervals.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Factor.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Factor.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Factor.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Factor.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/For-Loop.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/For-Loop.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/For-Loop.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/For-Loop.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Function.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Function.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Function.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Function.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Ifelse.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Ifelse.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Ifelse.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Ifelse.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Length.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Length.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Length.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Length.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Load-Dataset.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Load-Dataset.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Load-Dataset.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Load-Dataset.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Polygonal-Line.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Polygonal-Line.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Polygonal-Line.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Polygonal-Line.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Read-From-File.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Read-From-File.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Read-From-File.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Read-From-File.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Sequence-(from-to-by).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Sequence-(from-to-by).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Sequence-(from-to-by).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Sequence-(from-to-by).sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Sort.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Sort.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Sort.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Sort.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/Source.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Source.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/Source.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/Source.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Snippets/na_omit.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/na_omit.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/R/Snippets/na_omit.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Snippets/na_omit.sublime-snippet diff --git a/assets/syntaxes/Packages/R/Symbol List - Methods.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Symbol List - Methods.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/R/Symbol List - Methods.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Symbol List - Methods.tmPreferences diff --git a/assets/syntaxes/Packages/R/Symbol List - Sections (Rd Documentation).tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Symbol List - Sections (Rd Documentation).tmPreferences similarity index 100% rename from assets/syntaxes/Packages/R/Symbol List - Sections (Rd Documentation).tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Symbol List - Sections (Rd Documentation).tmPreferences diff --git a/assets/syntaxes/Packages/R/Symbol List - Sections.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Symbol List - Sections.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/R/Symbol List - Sections.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/Symbol List - Sections.tmPreferences diff --git a/assets/syntaxes/Packages/R/syntax_test_r.R b/crates/bin/docs_rs_web/assets/syntaxes/Packages/R/syntax_test_r.R similarity index 100% rename from assets/syntaxes/Packages/R/syntax_test_r.R rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/R/syntax_test_r.R diff --git a/assets/syntaxes/Packages/README.md b/crates/bin/docs_rs_web/assets/syntaxes/Packages/README.md similarity index 100% rename from assets/syntaxes/Packages/README.md rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/README.md diff --git a/assets/syntaxes/Packages/Rails/HTML (Rails).sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/HTML (Rails).sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Rails/HTML (Rails).sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/HTML (Rails).sublime-syntax diff --git a/assets/syntaxes/Packages/Rails/JavaScript (Rails).sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/JavaScript (Rails).sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Rails/JavaScript (Rails).sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/JavaScript (Rails).sublime-syntax diff --git a/assets/syntaxes/Packages/Rails/Ruby Haml Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Ruby Haml Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Rails/Ruby Haml Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Ruby Haml Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Rails/Ruby Haml.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Ruby Haml.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Rails/Ruby Haml.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Ruby Haml.sublime-syntax diff --git a/assets/syntaxes/Packages/Rails/Ruby on Rails.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Ruby on Rails.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Rails/Ruby on Rails.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Ruby on Rails.sublime-syntax diff --git a/assets/syntaxes/Packages/Rails/SQL (Rails).sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/SQL (Rails).sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Rails/SQL (Rails).sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/SQL (Rails).sublime-syntax diff --git a/assets/syntaxes/Packages/Rails/Snippets/$LABEL.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/$LABEL.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/$LABEL.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/$LABEL.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/%3C%=-Fixtures_identify(%3Asymbol)-%%3E.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/%3C%=-Fixtures_identify(%3Asymbol)-%%3E.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/%3C%=-Fixtures_identify(%3Asymbol)-%%3E.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/%3C%=-Fixtures_identify(%3Asymbol)-%%3E.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/180-rails-form_tag.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/180-rails-form_tag.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/180-rails-form_tag.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/180-rails-form_tag.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-binary-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-binary-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-binary-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-binary-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-boolean-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-boolean-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-boolean-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-boolean-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-controller-class.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-controller-class.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-controller-class.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-controller-class.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-date-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-date-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-date-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-date-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-datetime-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-datetime-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-datetime-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-datetime-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-decimal-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-decimal-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-decimal-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-decimal-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-float-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-float-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-float-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-float-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-functional-test-class.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-functional-test-class.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-functional-test-class.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-functional-test-class.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-integer-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-integer-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-integer-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-integer-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-lock_version-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-lock_version-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-lock_version-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-lock_version-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-references-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-references-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-references-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-references-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-string-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-string-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-string-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-string-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-text-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-text-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-text-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-text-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-time-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-time-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-time-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-time-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-timestamp-column.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-timestamp-column.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-timestamp-column.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-timestamp-column.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Create-timestamps-columns.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-timestamps-columns.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Create-timestamps-columns.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Create-timestamps-columns.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Migration-Create-Column-(mcc).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Migration-Create-Column-(mcc).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Migration-Create-Column-(mcc).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Migration-Create-Column-(mcc).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Migration-Create-Column-Continue-(mccc).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Migration-Create-Column-Continue-(mccc).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Migration-Create-Column-Continue-(mccc).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Migration-Create-Column-Continue-(mccc).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Migration-Drop-Create-Table-(mdct).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Migration-Drop-Create-Table-(mdct).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Migration-Drop-Create-Table-(mdct).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Migration-Drop-Create-Table-(mdct).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Migration-Remove-and-Add-Column-(mrac).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Migration-Remove-and-Add-Column-(mrac).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Migration-Remove-and-Add-Column-(mrac).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Migration-Remove-and-Add-Column-(mrac).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/RAILS_DEFAULT_LOGGER.debug-(rdb).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/RAILS_DEFAULT_LOGGER.debug-(rdb).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/RAILS_DEFAULT_LOGGER.debug-(rdb).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/RAILS_DEFAULT_LOGGER.debug-(rdb).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Table-column(s)-rename.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Table-column(s)-rename.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Table-column(s)-rename.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Table-column(s)-rename.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Test-Assert-Redirected-To-(art).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Test-Assert-Redirected-To-(art).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Test-Assert-Redirected-To-(art).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Test-Assert-Redirected-To-(art).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/Test-Assert-Response-(are).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Test-Assert-Response-(are).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/Test-Assert-Response-(are).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/Test-Assert-Response-(are).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/after_create.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_create.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/after_create.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_create.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/after_destroy.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_destroy.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/after_destroy.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_destroy.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/after_save.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_save.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/after_save.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_save.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/after_update.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_update.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/after_update.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_update.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/after_validation.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_validation.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/after_validation.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_validation.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/after_validation_on_create.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_validation_on_create.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/after_validation_on_create.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_validation_on_create.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/after_validation_on_update.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_validation_on_update.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/after_validation_on_update.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/after_validation_on_update.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/assert(var-=-assigns(%3Avar)).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert(var-=-assigns(%3Avar)).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/assert(var-=-assigns(%3Avar)).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert(var-=-assigns(%3Avar)).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/assert_difference.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_difference.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/assert_difference.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_difference.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/assert_no_difference.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_no_difference.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/assert_no_difference.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_no_difference.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(nested-path).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(nested-path).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(nested-path).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(nested-path).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(nested-path-plural).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(nested-path-plural).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(nested-path-plural).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(nested-path-plural).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(path).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(path).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(path).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(path).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(path-plural).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(path-plural).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(path-plural).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_redirected_to-(path-plural).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/assert_select.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_select.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/assert_select.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/assert_select.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/before_create.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_create.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/before_create.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_create.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/before_destroy.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_destroy.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/before_destroy.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_destroy.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/before_save.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_save.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/before_save.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_save.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/before_update.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_update.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/before_update.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_update.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/before_validation.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_validation.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/before_validation.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_validation.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/before_validation_on_create.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_validation_on_create.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/before_validation_on_create.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_validation_on_create.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/before_validation_on_update.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_validation_on_update.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/before_validation_on_update.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/before_validation_on_update.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/belongs_to-(bt).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/belongs_to-(bt).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/belongs_to-(bt).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/belongs_to-(bt).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/cattr_accessor.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/cattr_accessor.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/cattr_accessor.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/cattr_accessor.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/def-create-resource.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/def-create-resource.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/def-create-resource.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/def-create-resource.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/def-get-request.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/def-get-request.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/def-get-request.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/def-get-request.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/def-post-request.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/def-post-request.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/def-post-request.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/def-post-request.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/end.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/find(id).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/find(id).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/find(id).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/find(id).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/for-loop-erb.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/for-loop-erb.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/for-loop-erb.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/for-loop-erb.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-check_box.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-check_box.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-check_box.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-check_box.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-checkbox.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-checkbox.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-checkbox.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-checkbox.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-file_field-2.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-file_field-2.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-file_field-2.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-file_field-2.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-file_field.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-file_field.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-file_field.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-file_field.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-hidden_field-2.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-hidden_field-2.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-hidden_field-2.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-hidden_field-2.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-hidden_field.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-hidden_field.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-hidden_field.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-hidden_field.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-label-2.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-label-2.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-label-2.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-label-2.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-label.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-label.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-label.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-label.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-password_field-2.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-password_field-2.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-password_field-2.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-password_field-2.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-password_field.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-password_field.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-password_field.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-password_field.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-radio_box-2.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-radio_box-2.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-radio_box-2.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-radio_box-2.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-radio_box.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-radio_box.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-radio_box.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-radio_box.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-submit-2.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-submit-2.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-submit-2.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-submit-2.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-submit.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-submit.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-submit.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-submit.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-text_area-2.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-text_area-2.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-text_area-2.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-text_area-2.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-text_area.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-text_area.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-text_area.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-text_area.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-text_field-2.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-text_field-2.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-text_field-2.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-text_field-2.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-text_field.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-text_field.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-text_field.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-text_field.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for-with-errors.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-with-errors.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for-with-errors.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for-with-errors.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/form_for.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/form_for.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/form_for.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/has_and_belongs_to_many-(habtm).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/has_and_belongs_to_many-(habtm).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/has_and_belongs_to_many-(habtm).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/has_and_belongs_to_many-(habtm).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/has_many-(hm).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/has_many-(hm).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/has_many-(hm).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/has_many-(hm).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/has_many-(through).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/has_many-(through).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/has_many-(through).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/has_many-(through).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/has_many-dependent-=-destroy.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/has_many-dependent-=-destroy.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/has_many-dependent-=-destroy.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/has_many-dependent-=-destroy.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/has_one-(ho).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/has_one-(ho).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/has_one-(ho).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/has_one-(ho).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/image_submit_tag.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/image_submit_tag.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/image_submit_tag.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/image_submit_tag.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/javascript_include_tag.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/javascript_include_tag.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/javascript_include_tag.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/javascript_include_tag.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/lia.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/lia.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/lia.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/lia.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/liai.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/liai.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/liai.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/liai.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/lic.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/lic.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/lic.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/lic.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/lica.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/lica.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/lica.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/lica.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/licai.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/licai.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/licai.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/licai.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/link_to-(nested-path).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/link_to-(nested-path).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/link_to-(nested-path).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/link_to-(nested-path).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/link_to-(nested-path-plural).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/link_to-(nested-path-plural).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/link_to-(nested-path-plural).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/link_to-(nested-path-plural).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/link_to-(path).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/link_to-(path).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/link_to-(path).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/link_to-(path).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/link_to-(path-plural).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/link_to-(path-plural).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/link_to-(path-plural).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/link_to-(path-plural).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/link_to-model.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/link_to-model.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/link_to-model.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/link_to-model.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/logger_debug.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/logger_debug.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/logger_debug.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/logger_debug.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/logger_error.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/logger_error.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/logger_error.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/logger_error.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/logger_fatal.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/logger_fatal.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/logger_fatal.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/logger_fatal.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/logger_info.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/logger_info.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/logger_info.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/logger_info.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/logger_warn.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/logger_warn.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/logger_warn.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/logger_warn.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/map(-%3Asym_proc).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/map(-%3Asym_proc).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/map(-%3Asym_proc).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/map(-%3Asym_proc).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/map_catch_all.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/map_catch_all.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/map_catch_all.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/map_catch_all.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/map_named_route.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/map_named_route.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/map_named_route.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/map_named_route.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/map_resource.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/map_resource.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/map_resource.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/map_resource.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/map_resources.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/map_resources.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/map_resources.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/map_resources.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/map_with_options.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/map_with_options.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/map_with_options.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/map_with_options.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/mattr_accessor.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/mattr_accessor.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/mattr_accessor.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/mattr_accessor.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/named_scope-lambda.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/named_scope-lambda.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/named_scope-lambda.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/named_scope-lambda.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/named_scope.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/named_scope.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/named_scope.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/named_scope.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/rails-flash.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/rails-flash.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/rails-flash.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/rails-flash.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/rea.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/rea.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/rea.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/rea.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/reai.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/reai.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/reai.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/reai.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/rec.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/rec.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/rec.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/rec.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/reca.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/reca.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/reca.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/reca.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/recai.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/recai.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/recai.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/recai.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/redirect_to-(nested-path).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/redirect_to-(nested-path).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/redirect_to-(nested-path).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/redirect_to-(nested-path).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/redirect_to-(nested-path-plural).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/redirect_to-(nested-path-plural).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/redirect_to-(nested-path-plural).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/redirect_to-(nested-path-plural).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/redirect_to-(path).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/redirect_to-(path).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/redirect_to-(path).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/redirect_to-(path).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/redirect_to-(path-plural).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/redirect_to-(path-plural).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/redirect_to-(path-plural).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/redirect_to-(path-plural).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(action)...-(ra).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(action)...-(ra).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(action)...-(ra).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(action)...-(ra).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(action-layout)-(ral).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(action-layout)-(ral).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(action-layout)-(ral).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(action-layout)-(ral).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(file)-(rf).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(file)-(rf).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(file)-(rf).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(file)-(rf).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(file-use_full_path)-(rfu).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(file-use_full_path)-(rfu).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(file-use_full_path)-(rfu).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(file-use_full_path)-(rfu).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(inline)-(ri).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(inline)-(ri).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(inline)-(ri).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(inline)-(ri).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(inline-locals)-(ril).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(inline-locals)-(ril).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(inline-locals)-(ril).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(inline-locals)-(ril).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(inline-type)-(rit).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(inline-type)-(rit).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(inline-type)-(rit).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(inline-type)-(rit).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(layout)-(rl).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(layout)-(rl).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(layout)-(rl).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(layout)-(rl).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(nothing)-(rn).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(nothing)-(rn).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(nothing)-(rn).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(nothing)-(rn).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(nothing-status)-(rns).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(nothing-status)-(rns).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(nothing-status)-(rns).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(nothing-status)-(rns).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(partial)-(rp).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(partial)-(rp).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(partial)-(rp).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(partial)-(rp).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(partial-collection)-(rpc).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(partial-collection)-(rpc).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(partial-collection)-(rpc).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(partial-collection)-(rpc).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(partial-locals)-(rpl).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(partial-locals)-(rpl).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(partial-locals)-(rpl).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(partial-locals)-(rpl).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(partial-object)-(rpo).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(partial-object)-(rpo).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(partial-object)-(rpo).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(partial-object)-(rpo).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(partial-status)-(rps).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(partial-status)-(rps).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(partial-status)-(rps).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(partial-status)-(rps).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(text)-(rt).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(text)-(rt).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(text)-(rt).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(text)-(rt).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(text-layout)-(rtl).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(text-layout)-(rtl).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(text-layout)-(rtl).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(text-layout)-(rtl).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(text-layout=%3Etrue)-(rtlt).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(text-layout=%3Etrue)-(rtlt).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(text-layout=%3Etrue)-(rtlt).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(text-layout=%3Etrue)-(rtlt).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(text-status)-(rts).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(text-status)-(rts).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(text-status)-(rts).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(text-status)-(rts).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/render-(update).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(update).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/render-(update).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/render-(update).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/respond_to.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/respond_to.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/respond_to.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/respond_to.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/returning-do-%7Cvariable%7C-%E2%80%A6-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/returning-do-%7Cvariable%7C-%E2%80%A6-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/returning-do-%7Cvariable%7C-%E2%80%A6-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/returning-do-%7Cvariable%7C-%E2%80%A6-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/stylesheet_link_tag.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/stylesheet_link_tag.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/stylesheet_link_tag.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/stylesheet_link_tag.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/submit_tag.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/submit_tag.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/submit_tag.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/submit_tag.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_binary-(tcbi).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_binary-(tcbi).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_binary-(tcbi).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_binary-(tcbi).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_boolean-(tcb).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_boolean-(tcb).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_boolean-(tcb).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_boolean-(tcb).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_date-(tcda).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_date-(tcda).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_date-(tcda).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_date-(tcda).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_datetime-(tcdt).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_datetime-(tcdt).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_datetime-(tcdt).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_datetime-(tcdt).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_decimal-(tcd).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_decimal-(tcd).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_decimal-(tcd).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_decimal-(tcd).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_float-(tcf).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_float-(tcf).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_float-(tcf).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_float-(tcf).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_integer-(tci).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_integer-(tci).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_integer-(tci).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_integer-(tci).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_lock_version-(tcl).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_lock_version-(tcl).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_lock_version-(tcl).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_lock_version-(tcl).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_references-(tcr).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_references-(tcr).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_references-(tcr).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_references-(tcr).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_rename-(tre).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_rename-(tre).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_rename-(tre).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_rename-(tre).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_string-(tcs).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_string-(tcs).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_string-(tcs).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_string-(tcs).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_text-(tct).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_text-(tct).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_text-(tct).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_text-(tct).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_time-(tcti).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_time-(tcti).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_time-(tcti).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_time-(tcti).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_timestamp-(tcts).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_timestamp-(tcts).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_timestamp-(tcts).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_timestamp-(tcts).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/t_timestamps-(tctss).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_timestamps-(tctss).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/t_timestamps-(tctss).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/t_timestamps-(tctss).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_acceptance_of-if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_acceptance_of-if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_acceptance_of-if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_acceptance_of-if.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_acceptance_of.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_acceptance_of.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_acceptance_of.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_acceptance_of.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_associated-(va).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_associated-(va).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_associated-(va).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_associated-(va).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_associated-if-(vaif).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_associated-if-(vaif).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_associated-if-(vaif).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_associated-if-(vaif).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_confirmation_of-(vc).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_confirmation_of-(vc).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_confirmation_of-(vc).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_confirmation_of-(vc).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_confirmation_of-if-(vcif).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_confirmation_of-if-(vcif).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_confirmation_of-if-(vcif).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_confirmation_of-if-(vcif).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_exclusion_of-(ve).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_exclusion_of-(ve).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_exclusion_of-(ve).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_exclusion_of-(ve).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_exclusion_of-if-(veif).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_exclusion_of-if-(veif).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_exclusion_of-if-(veif).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_exclusion_of-if-(veif).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_format_of-if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_format_of-if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_format_of-if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_format_of-if.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_format_of.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_format_of.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_format_of.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_format_of.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_inclusion_of-if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_inclusion_of-if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_inclusion_of-if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_inclusion_of-if.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_inclusion_of.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_inclusion_of.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_inclusion_of.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_inclusion_of.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_length_of-(vl).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_length_of-(vl).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_length_of-(vl).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_length_of-(vl).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_length_of-if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_length_of-if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_length_of-if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_length_of-if.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_numericality_of-if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_numericality_of-if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_numericality_of-if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_numericality_of-if.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_numericality_of.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_numericality_of.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_numericality_of.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_numericality_of.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_presence_of-(vp).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_presence_of-(vp).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_presence_of-(vp).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_presence_of-(vp).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_presence_of-if-(vpif)-2.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_presence_of-if-(vpif)-2.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_presence_of-if-(vpif)-2.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_presence_of-if-(vpif)-2.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_uniqueness_of-(vu).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_uniqueness_of-(vu).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_uniqueness_of-(vu).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_uniqueness_of-(vu).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/validates_uniqueness_of-if-(vuif).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_uniqueness_of-if-(vuif).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/validates_uniqueness_of-if-(vuif).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/validates_uniqueness_of-if-(vuif).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/verify-(verify).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/verify-(verify).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/verify-(verify).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/verify-(verify).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/verify-redirect-(verify).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/verify-redirect-(verify).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/verify-redirect-(verify).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/verify-redirect-(verify).sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/wants_format.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/wants_format.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/wants_format.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/wants_format.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/xhr-delete.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/xhr-delete.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/xhr-delete.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/xhr-delete.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/xhr-get.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/xhr-get.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/xhr-get.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/xhr-get.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/xhr-post.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/xhr-post.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/xhr-post.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/xhr-post.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Snippets/xhr-put.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/xhr-put.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rails/Snippets/xhr-put.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Snippets/xhr-put.sublime-snippet diff --git a/assets/syntaxes/Packages/Rails/Template (ERB).tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Template (ERB).tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Rails/Template (ERB).tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Template (ERB).tmPreferences diff --git a/assets/syntaxes/Packages/Rails/Template (Haml).tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Template (Haml).tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Rails/Template (Haml).tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/Template (Haml).tmPreferences diff --git a/assets/syntaxes/Packages/Rails/syntax_test_html_rails.html.erb b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/syntax_test_html_rails.html.erb similarity index 100% rename from assets/syntaxes/Packages/Rails/syntax_test_html_rails.html.erb rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/syntax_test_html_rails.html.erb diff --git a/assets/syntaxes/Packages/Rails/syntax_test_rails.rb b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/syntax_test_rails.rb similarity index 100% rename from assets/syntaxes/Packages/Rails/syntax_test_rails.rb rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rails/syntax_test_rails.rb diff --git a/assets/syntaxes/Packages/Regular Expressions/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Regular Expressions/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Regular Expressions/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Regular Expressions/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Regular Expressions/RegExp.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Regular Expressions/RegExp.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Regular Expressions/RegExp.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Regular Expressions/RegExp.sublime-syntax diff --git a/assets/syntaxes/Packages/Regular Expressions/syntax_test_regexp.re b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Regular Expressions/syntax_test_regexp.re similarity index 100% rename from assets/syntaxes/Packages/Regular Expressions/syntax_test_regexp.re rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Regular Expressions/syntax_test_regexp.re diff --git a/assets/syntaxes/Packages/RestructuredText/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/RestructuredText/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/RestructuredText/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/RestructuredText/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/RestructuredText/reStructuredText.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/RestructuredText/reStructuredText.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/RestructuredText/reStructuredText.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/RestructuredText/reStructuredText.sublime-syntax diff --git a/assets/syntaxes/Packages/RestructuredText/syntax_test_restructuredtext.rst b/crates/bin/docs_rs_web/assets/syntaxes/Packages/RestructuredText/syntax_test_restructuredtext.rst similarity index 100% rename from assets/syntaxes/Packages/RestructuredText/syntax_test_restructuredtext.rst rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/RestructuredText/syntax_test_restructuredtext.rst diff --git a/assets/syntaxes/Packages/Ruby/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Ruby/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Ruby/Completion Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Completion Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Ruby/Completion Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Completion Rules.tmPreferences diff --git a/assets/syntaxes/Packages/Ruby/Default.sublime-keymap b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Default.sublime-keymap similarity index 100% rename from assets/syntaxes/Packages/Ruby/Default.sublime-keymap rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Default.sublime-keymap diff --git a/assets/syntaxes/Packages/Ruby/Miscellaneous.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Miscellaneous.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Ruby/Miscellaneous.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Miscellaneous.tmPreferences diff --git a/assets/syntaxes/Packages/Ruby/Ruby.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Ruby.sublime-build similarity index 100% rename from assets/syntaxes/Packages/Ruby/Ruby.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Ruby.sublime-build diff --git a/assets/syntaxes/Packages/Ruby/Ruby.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Ruby.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Ruby/Ruby.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Ruby.sublime-syntax diff --git a/assets/syntaxes/Packages/Ruby/Snippets/#!;usr;local;bin;ruby-w.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/#!;usr;local;bin;ruby-w.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/#!;usr;local;bin;ruby-w.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/#!;usr;local;bin;ruby-w.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/060-ruby-if-else.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/060-ruby-if-else.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/060-ruby-if-else.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/060-ruby-if-else.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/070-ruby-if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/070-ruby-if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/070-ruby-if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/070-ruby-if.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/080-ruby-case.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/080-ruby-case.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/080-ruby-case.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/080-ruby-case.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/Add-'#-=-'-Marker.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Add-'#-=-'-Marker.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/Add-'#-=-'-Marker.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Add-'#-=-'-Marker.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/Array.new(10)-{-i-..-}-(Arr).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Array.new(10)-{-i-..-}-(Arr).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/Array.new(10)-{-i-..-}-(Arr).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Array.new(10)-{-i-..-}-(Arr).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/Benchmark_bmbm(__)-do-__-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Benchmark_bmbm(__)-do-__-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/Benchmark_bmbm(__)-do-__-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Benchmark_bmbm(__)-do-__-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/Dir.glob(-..-)-do-file-..-end-(Dir).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Dir.glob(-..-)-do-file-..-end-(Dir).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/Dir.glob(-..-)-do-file-..-end-(Dir).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Dir.glob(-..-)-do-file-..-end-(Dir).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/Dir[-__-].sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Dir[-__-].sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/Dir[-__-].sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Dir[-__-].sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/File.foreach-(-..-)-do-line-..-end-(File).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/File.foreach-(-..-)-do-line-..-end-(File).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/File.foreach-(-..-)-do-line-..-end-(File).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/File.foreach-(-..-)-do-line-..-end-(File).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/File_open(-__-)-{-file-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/File_open(-__-)-{-file-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/File_open(-__-)-{-file-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/File_open(-__-)-{-file-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/File_read(-__-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/File_read(-__-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/File_read(-__-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/File_read(-__-).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/Hash.new-{-hash-key-hash[key]-=-..-}-(Has).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Hash.new-{-hash-key-hash[key]-=-..-}-(Has).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/Hash.new-{-hash-key-hash[key]-=-..-}-(Has).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Hash.new-{-hash-key-hash[key]-=-..-}-(Has).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/Marshal.dump(obj-file)-(Md).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Marshal.dump(obj-file)-(Md).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/Marshal.dump(obj-file)-(Md).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Marshal.dump(obj-file)-(Md).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/Marshal.load(obj)-(Ml).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Marshal.load(obj)-(Ml).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/Marshal.load(obj)-(Ml).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Marshal.load(obj)-(Ml).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/PStore_new(-__-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/PStore_new(-__-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/PStore_new(-__-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/PStore_new(-__-).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/RDoc-documentation-block.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/RDoc-documentation-block.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/RDoc-documentation-block.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/RDoc-documentation-block.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/Wrap-in-Begin-Rescue-End.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Wrap-in-Begin-Rescue-End.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/Wrap-in-Begin-Rescue-End.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/Wrap-in-Begin-Rescue-End.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/YAML.dump(..-file)-(Yd-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/YAML.dump(..-file)-(Yd-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/YAML.dump(..-file)-(Yd-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/YAML.dump(..-file)-(Yd-).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/YAML.load(file)-(Yl-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/YAML.load(file)-(Yl-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/YAML.load(file)-(Yl-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/YAML.load(file)-(Yl-).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/alias_method-..-(am).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/alias_method-..-(am).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/alias_method-..-(am).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/alias_method-..-(am).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/all-{-e-..-}-(all).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/all-{-e-..-}-(all).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/all-{-e-..-}-(all).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/all-{-e-..-}-(all).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/any-{-e-..-}-(any).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/any-{-e-..-}-(any).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/any-{-e-..-}-(any).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/any-{-e-..-}-(any).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/application_code-..-(app).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/application_code-..-(app).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/application_code-..-(app).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/application_code-..-(app).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert(..)-(as).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert(..)-(as).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert(..)-(as).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert(..)-(as).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_equal.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_equal.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_equal.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_equal.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_in_delta(..)-(asid).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_in_delta(..)-(asid).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_in_delta(..)-(asid).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_in_delta(..)-(asid).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_instance_of(..)-(asio).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_instance_of(..)-(asio).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_instance_of(..)-(asio).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_instance_of(..)-(asio).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_kind_of(..)-(asko).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_kind_of(..)-(asko).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_kind_of(..)-(asko).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_kind_of(..)-(asko).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_match(..)-(asm).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_match(..)-(asm).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_match(..)-(asm).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_match(..)-(asm).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_nil(..)-(asn).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_nil(..)-(asn).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_nil(..)-(asn).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_nil(..)-(asn).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_no_match(..)-(asnm).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_no_match(..)-(asnm).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_no_match(..)-(asnm).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_no_match(..)-(asnm).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_not_equal(..)-(asne).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_not_equal(..)-(asne).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_not_equal(..)-(asne).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_not_equal(..)-(asne).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_not_nil(..)-(asnn).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_not_nil(..)-(asnn).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_not_nil(..)-(asnn).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_not_nil(..)-(asnn).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_not_same(..)-(asns).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_not_same(..)-(asns).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_not_same(..)-(asns).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_not_same(..)-(asns).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_nothing_raised(..)-{-..-}-(asnr).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_nothing_raised(..)-{-..-}-(asnr).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_nothing_raised(..)-{-..-}-(asnr).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_nothing_raised(..)-{-..-}-(asnr).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_nothing_thrown-{-..-}-(asnt).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_nothing_thrown-{-..-}-(asnt).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_nothing_thrown-{-..-}-(asnt).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_nothing_thrown-{-..-}-(asnt).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_operator(..)-(aso).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_operator(..)-(aso).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_operator(..)-(aso).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_operator(..)-(aso).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_raise(..)-{-..-}-(asr).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_raise(..)-{-..-}-(asr).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_raise(..)-{-..-}-(asr).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_raise(..)-{-..-}-(asr).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_respond_to(..)-(asrt).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_respond_to(..)-(asrt).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_respond_to(..)-(asrt).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_respond_to(..)-(asrt).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_same(..)-(ass).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_same(..)-(ass).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_same(..)-(ass).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_same(..)-(ass).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_send(..)-(ass).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_send(..)-(ass).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_send(..)-(ass).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_send(..)-(ass).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/assert_throws(..)-{-..-}-(ast).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_throws(..)-{-..-}-(ast).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/assert_throws(..)-{-..-}-(ast).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/assert_throws(..)-{-..-}-(ast).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/attr_accessor-..-(rw).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/attr_accessor-..-(rw).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/attr_accessor-..-(rw).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/attr_accessor-..-(rw).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/attr_reader-..-(r).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/attr_reader-..-(r).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/attr_reader-..-(r).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/attr_reader-..-(r).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/attr_writer-..-(w).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/attr_writer-..-(w).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/attr_writer-..-(w).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/attr_writer-..-(w).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/class-..-DelegateClass-..-initialize-..-end-(class).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-DelegateClass-..-initialize-..-end-(class).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/class-..-DelegateClass-..-initialize-..-end-(class).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-DelegateClass-..-initialize-..-end-(class).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/class-..-ParentClass-..-initialize-..-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-ParentClass-..-initialize-..-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/class-..-ParentClass-..-initialize-..-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-ParentClass-..-initialize-..-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/class-..-Struct-..-initialize-..-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-Struct-..-initialize-..-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/class-..-Struct-..-initialize-..-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-Struct-..-initialize-..-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/class-..-Test;;Unit;;TestCase-..-end-(tc).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-Test;;Unit;;TestCase-..-end-(tc).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/class-..-Test;;Unit;;TestCase-..-end-(tc).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-Test;;Unit;;TestCase-..-end-(tc).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/class-..-end-(cla).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-end-(cla).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/class-..-end-(cla).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-end-(cla).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/class-..-initialize-..-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-initialize-..-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/class-..-initialize-..-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-initialize-..-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/class-..-instance_methods-..-undef-..-initialize-..-end-(class).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-instance_methods-..-undef-..-initialize-..-end-(class).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/class-..-instance_methods-..-undef-..-initialize-..-end-(class).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-..-instance_methods-..-undef-..-initialize-..-end-(class).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/class-self-__-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-self-__-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/class-self-__-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class-self-__-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/class_from_name()-(clafn).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class_from_name()-(clafn).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/class_from_name()-(clafn).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/class_from_name()-(clafn).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/classify-{-e-..-}-(clas).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/classify-{-e-..-}-(clas).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/classify-{-e-..-}-(clas).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/classify-{-e-..-}-(clas).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/collect-{-e-..-}-(col).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/collect-{-e-..-}-(col).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/collect-{-e-..-}-(col).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/collect-{-e-..-}-(col).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/deep_copy(..)-(dee).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/deep_copy(..)-(dee).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/deep_copy(..)-(dee).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/deep_copy(..)-(dee).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/def-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/def-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/def-method_missing-..-end-(mm).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def-method_missing-..-end-(mm).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/def-method_missing-..-end-(mm).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def-method_missing-..-end-(mm).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/def-self-..-end-(defs).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def-self-..-end-(defs).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/def-self-..-end-(defs).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def-self-..-end-(defs).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/def-test_-..-end-(t).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def-test_-..-end-(t).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/def-test_-..-end-(t).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def-test_-..-end-(t).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/def_delegator-..-(defd).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def_delegator-..-(defd).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/def_delegator-..-(defd).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def_delegator-..-(defd).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/def_delegators-..-(defds).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def_delegators-..-(defds).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/def_delegators-..-(defds).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def_delegators-..-(defds).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/def_initialize.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def_initialize.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/def_initialize.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/def_initialize.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/delete_if-{-e-..-}-(deli).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/delete_if-{-e-..-}-(deli).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/delete_if-{-e-..-}-(deli).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/delete_if-{-e-..-}-(deli).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/detect-{-e-..-}-(det).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/detect-{-e-..-}-(det).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/detect-{-e-..-}-(det).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/detect-{-e-..-}-(det).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/directory().sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/directory().sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/directory().sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/directory().sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/do-obj-..-end-(doo).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/do-obj-..-end-(doo).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/do-obj-..-end-(doo).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/do-obj-..-end-(doo).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/downto(0)-{-n-..-}-(dow).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/downto(0)-{-n-..-}-(dow).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/downto(0)-{-n-..-}-(dow).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/downto(0)-{-n-..-}-(dow).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/each-{-e-..-}-(ea).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each-{-e-..-}-(ea).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/each-{-e-..-}-(ea).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each-{-e-..-}-(ea).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/each_byte-{-byte-..-}-(eab).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_byte-{-byte-..-}-(eab).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/each_byte-{-byte-..-}-(eab).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_byte-{-byte-..-}-(eab).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/each_char-{-chr-..-}-(eac-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_char-{-chr-..-}-(eac-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/each_char-{-chr-..-}-(eac-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_char-{-chr-..-}-(eac-).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/each_cons(..)-{-group-..-}-(eac-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_cons(..)-{-group-..-}-(eac-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/each_cons(..)-{-group-..-}-(eac-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_cons(..)-{-group-..-}-(eac-).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/each_index-{-i-..-}-(eai).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_index-{-i-..-}-(eai).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/each_index-{-i-..-}-(eai).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_index-{-i-..-}-(eai).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/each_key-{-key-..-}-(eak).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_key-{-key-..-}-(eak).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/each_key-{-key-..-}-(eak).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_key-{-key-..-}-(eak).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/each_line-{-line-..-}-(eal).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_line-{-line-..-}-(eal).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/each_line-{-line-..-}-(eal).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_line-{-line-..-}-(eal).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/each_pair-{-name-val-..-}-(eap).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_pair-{-name-val-..-}-(eap).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/each_pair-{-name-val-..-}-(eap).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_pair-{-name-val-..-}-(eap).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/each_slice-{-group-..-}-(eas).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_slice-{-group-..-}-(eas).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/each_slice-{-group-..-}-(eas).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_slice-{-group-..-}-(eas).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/each_value-{-val-..-}-(eav).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_value-{-val-..-}-(eav).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/each_value-{-val-..-}-(eav).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_value-{-val-..-}-(eav).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/each_with_index-{-e-i-..-}-(eawi).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_with_index-{-e-i-..-}-(eawi).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/each_with_index-{-e-i-..-}-(eawi).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/each_with_index-{-e-i-..-}-(eawi).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/elsif-___.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/elsif-___.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/elsif-___.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/elsif-___.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/extend-Forwardable-(Forw).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/extend-Forwardable-(Forw).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/extend-Forwardable-(Forw).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/extend-Forwardable-(Forw).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/fetch(name)-{-key-..-}-(fet).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/fetch(name)-{-key-..-}-(fet).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/fetch(name)-{-key-..-}-(fet).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/fetch(name)-{-key-..-}-(fet).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/fill(range)-{-i-..-}-(fil).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/fill(range)-{-i-..-}-(fil).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/fill(range)-{-i-..-}-(fil).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/fill(range)-{-i-..-}-(fil).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/find-{-e-..-}-(fin).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/find-{-e-..-}-(fin).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/find-{-e-..-}-(fin).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/find-{-e-..-}-(fin).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/find_all-{-e-..-}-(fina).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/find_all-{-e-..-}-(fina).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/find_all-{-e-..-}-(fina).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/find_all-{-e-..-}-(fina).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/flatten_once-(fla).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/flatten_once-(fla).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/flatten_once-(fla).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/flatten_once-(fla).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/flunk(..)-(fl).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/flunk(..)-(fl).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/flunk(..)-(fl).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/flunk(..)-(fl).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/grep(;pattern;)-{-match-..-}-(gre).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/grep(;pattern;)-{-match-..-}-(gre).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/grep(;pattern;)-{-match-..-}-(gre).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/grep(;pattern;)-{-match-..-}-(gre).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/gsub(;..;)-{-match-..-}-(gsu).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/gsub(;..;)-{-match-..-}-(gsu).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/gsub(;..;)-{-match-..-}-(gsu).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/gsub(;..;)-{-match-..-}-(gsu).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/hash-pair-(-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/hash-pair-(-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/hash-pair-(-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/hash-pair-(-).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/include-Comparable-..-(Comp).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/include-Comparable-..-(Comp).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/include-Comparable-..-(Comp).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/include-Comparable-..-(Comp).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/include-Enumerable-..-(Enum).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/include-Enumerable-..-(Enum).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/include-Enumerable-..-(Enum).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/include-Enumerable-..-(Enum).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/inject(init)-{-mem-var-..-}-(inj).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/inject(init)-{-mem-var-..-}-(inj).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/inject(init)-{-mem-var-..-}-(inj).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/inject(init)-{-mem-var-..-}-(inj).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/lambda-{-args-..-}-(lam).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/lambda-{-args-..-}-(lam).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/lambda-{-args-..-}-(lam).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/lambda-{-args-..-}-(lam).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/loop-{-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/loop-{-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/loop-{-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/loop-{-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/map-{-e-..-}-(map).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/map-{-e-..-}-(map).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/map-{-e-..-}-(map).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/map-{-e-..-}-(map).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/map_with_index-{-e-i-..-}-(mapwi).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/map_with_index-{-e-i-..-}-(mapwi).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/map_with_index-{-e-i-..-}-(mapwi).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/map_with_index-{-e-i-..-}-(mapwi).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/max-{-a-b-..-}-(max).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/max-{-a-b-..-}-(max).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/max-{-a-b-..-}-(max).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/max-{-a-b-..-}-(max).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/min-{-a-b-..-}-(min).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/min-{-a-b-..-}-(min).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/min-{-a-b-..-}-(min).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/min-{-a-b-..-}-(min).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/module-..-ClassMethods-..-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/module-..-ClassMethods-..-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/module-..-ClassMethods-..-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/module-..-ClassMethods-..-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/module-..-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/module-..-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/module-..-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/module-..-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/module-..-module_function-..-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/module-..-module_function-..-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/module-..-module_function-..-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/module-..-module_function-..-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/namespace-__-do-__-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/namespace-__-do-__-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/namespace-__-do-__-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/namespace-__-do-__-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/open(-path;or;url-w-)-do-doc-..-end-(ope).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/open(-path;or;url-w-)-do-doc-..-end-(ope).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/open(-path;or;url-w-)-do-doc-..-end-(ope).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/open(-path;or;url-w-)-do-doc-..-end-(ope).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/open-yield-block-({).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/open-yield-block-({).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/open-yield-block-({).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/open-yield-block-({).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/option_parse-{-..-}-(optp).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/option_parse-{-..-}-(optp).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/option_parse-{-..-}-(optp).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/option_parse-{-..-}-(optp).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/partition-{-e-..-}-(par).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/partition-{-e-..-}-(par).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/partition-{-e-..-}-(par).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/partition-{-e-..-}-(par).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/path_from_here(-__-).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/path_from_here(-__-).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/path_from_here(-__-).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/path_from_here(-__-).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/randomize-(ran).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/randomize-(ran).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/randomize-(ran).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/randomize-(ran).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/reject-{-e-..-}-(rej).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/reject-{-e-..-}-(rej).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/reject-{-e-..-}-(rej).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/reject-{-e-..-}-(rej).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/require-..-(req).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/require-..-(req).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/require-..-(req).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/require-..-(req).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/require-tc_..-..-(ts).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/require-tc_..-..-(ts).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/require-tc_..-..-(ts).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/require-tc_..-..-(ts).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/require_gem-__.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/require_gem-__.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/require_gem-__.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/require_gem-__.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/results_report(__)-{-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/results_report(__)-{-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/results_report(__)-{-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/results_report(__)-{-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/reverse_each-{-e-..-}-(rea).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/reverse_each-{-e-..-}-(rea).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/reverse_each-{-e-..-}-(rea).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/reverse_each-{-e-..-}-(rea).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/scan(;..;)-{-match-..-}-(sca).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/scan(;..;)-{-match-..-}-(sca).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/scan(;..;)-{-match-..-}-(sca).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/scan(;..;)-{-match-..-}-(sca).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/select-{-e-..-}-(sel).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/select-{-e-..-}-(sel).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/select-{-e-..-}-(sel).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/select-{-e-..-}-(sel).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/service_object.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/service_object.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/service_object.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/service_object.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/singleton_class().sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/singleton_class().sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/singleton_class().sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/singleton_class().sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/sort-{-a-b-..-}-(sor).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/sort-{-a-b-..-}-(sor).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/sort-{-a-b-..-}-(sor).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/sort-{-a-b-..-}-(sor).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/sort_by-{-e-..-}-(sorb).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/sort_by-{-e-..-}-(sorb).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/sort_by-{-e-..-}-(sorb).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/sort_by-{-e-..-}-(sorb).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/step(2)-{-e-..-}-(ste).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/step(2)-{-e-..-}-(ste).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/step(2)-{-e-..-}-(ste).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/step(2)-{-e-..-}-(ste).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/sub(;..;)-{-match-..-}-(sub).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/sub(;..;)-{-match-..-}-(sub).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/sub(;..;)-{-match-..-}-(sub).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/sub(;..;)-{-match-..-}-(sub).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/task-task_name-=-[-dependent-tasks]-do-__-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/task-task_name-=-[-dependent-tasks]-do-__-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/task-task_name-=-[-dependent-tasks]-do-__-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/task-task_name-=-[-dependent-tasks]-do-__-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/times-{-n-..-}-(tim).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/times-{-n-..-}-(tim).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/times-{-n-..-}-(tim).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/times-{-n-..-}-(tim).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/transaction(-__-)-do-__-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/transaction(-__-)-do-__-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/transaction(-__-)-do-__-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/transaction(-__-)-do-__-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/unix_filter-..-(uni).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/unix_filter-..-(uni).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/unix_filter-..-(uni).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/unix_filter-..-(uni).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/unless-(unless).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/unless-(unless).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/unless-(unless).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/unless-(unless).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/until-___-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/until-___-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/until-___-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/until-___-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/untitled.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/untitled.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/untitled.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/untitled.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/upto(1.0;0.0)-{-n-..-}-(upt).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/upto(1.0;0.0)-{-n-..-}-(upt).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/upto(1.0;0.0)-{-n-..-}-(upt).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/upto(1.0;0.0)-{-n-..-}-(upt).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/usage_if()-(usai).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/usage_if()-(usai).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/usage_if()-(usai).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/usage_if()-(usai).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/usage_unless()-(usau).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/usage_unless()-(usau).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/usage_unless()-(usau).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/usage_unless()-(usau).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/when.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/when.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/when.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/when.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/while-___-end.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/while-___-end.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/while-___-end.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/while-___-end.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/xmlread(__).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/xmlread(__).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/xmlread(__).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/xmlread(__).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/xpath(__)-{-__-}.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/xpath(__)-{-__-}.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/xpath(__)-{-__-}.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/xpath(__)-{-__-}.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/yields-RDoc-comment.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/yields-RDoc-comment.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/yields-RDoc-comment.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/yields-RDoc-comment.sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Snippets/zip(enums)-{-row-..-}-(zip).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/zip(enums)-{-row-..-}-(zip).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Ruby/Snippets/zip(enums)-{-row-..-}-(zip).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Snippets/zip(enums)-{-row-..-}-(zip).sublime-snippet diff --git a/assets/syntaxes/Packages/Ruby/Symbols - Classes - Modules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Symbols - Classes - Modules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Ruby/Symbols - Classes - Modules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Symbols - Classes - Modules.tmPreferences diff --git a/assets/syntaxes/Packages/Ruby/Symbols - Methods.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Symbols - Methods.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Ruby/Symbols - Methods.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/Symbols - Methods.tmPreferences diff --git a/assets/syntaxes/Packages/Ruby/syntax_test_ruby.rb b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/syntax_test_ruby.rb similarity index 100% rename from assets/syntaxes/Packages/Ruby/syntax_test_ruby.rb rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Ruby/syntax_test_ruby.rb diff --git a/assets/syntaxes/Packages/Rust/Cargo.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Cargo.sublime-build similarity index 100% rename from assets/syntaxes/Packages/Rust/Cargo.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Cargo.sublime-build diff --git a/assets/syntaxes/Packages/Rust/Cargo.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Cargo.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Rust/Cargo.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Cargo.sublime-syntax diff --git a/assets/syntaxes/Packages/Rust/Default.sublime-keymap b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Default.sublime-keymap similarity index 100% rename from assets/syntaxes/Packages/Rust/Default.sublime-keymap rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Default.sublime-keymap diff --git a/assets/syntaxes/Packages/Rust/LICENSE.txt b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/LICENSE.txt similarity index 100% rename from assets/syntaxes/Packages/Rust/LICENSE.txt rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/LICENSE.txt diff --git a/assets/syntaxes/Packages/Rust/Rust.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Rust.sublime-build similarity index 100% rename from assets/syntaxes/Packages/Rust/Rust.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Rust.sublime-build diff --git a/assets/syntaxes/Packages/Rust/Rust.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Rust.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Rust/Rust.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Rust.sublime-syntax diff --git a/assets/syntaxes/Packages/Rust/RustComment.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/RustComment.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Rust/RustComment.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/RustComment.tmPreferences diff --git a/assets/syntaxes/Packages/Rust/RustIndent.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/RustIndent.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Rust/RustIndent.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/RustIndent.tmPreferences diff --git a/assets/syntaxes/Packages/Rust/RustSymbols.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/RustSymbols.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Rust/RustSymbols.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/RustSymbols.tmPreferences diff --git a/assets/syntaxes/Packages/Rust/Snippets/Err.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/Err.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/Err.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/Err.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/Ok.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/Ok.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/Ok.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/Ok.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/Some.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/Some.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/Some.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/Some.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/assert.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/assert.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/assert.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/assert.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/assert_eq.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/assert_eq.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/assert_eq.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/assert_eq.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/bench.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/bench.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/bench.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/bench.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/const.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/const.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/const.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/const.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/else.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/else.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/else.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/else.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/enum.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/enum.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/enum.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/enum.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/extern-crate.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/extern-crate.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/extern-crate.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/extern-crate.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/extern-fn.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/extern-fn.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/extern-fn.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/extern-fn.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/extern-mod.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/extern-mod.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/extern-mod.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/extern-mod.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/fmt.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/fmt.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/fmt.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/fmt.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/fn.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/fn.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/fn.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/fn.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/for.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/for.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/for.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/for.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/if-let.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/if-let.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/if-let.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/if-let.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/if.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/if.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/if.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/if.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/impl-trait.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/impl-trait.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/impl-trait.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/impl-trait.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/impl.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/impl.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/impl.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/impl.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/let.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/let.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/let.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/let.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/loop.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/loop.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/loop.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/loop.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/macro_rules.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/macro_rules.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/macro_rules.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/macro_rules.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/main.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/main.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/main.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/main.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/match.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/match.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/match.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/match.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/mod.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/mod.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/mod.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/mod.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/panic.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/panic.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/panic.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/panic.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/print.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/print.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/print.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/print.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/println.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/println.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/println.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/println.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/static.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/static.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/static.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/static.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/struct-tuple.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/struct-tuple.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/struct-tuple.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/struct-tuple.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/struct-unit.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/struct-unit.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/struct-unit.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/struct-unit.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/struct.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/struct.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/struct.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/struct.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/test.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/test.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/test.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/test.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/trait.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/trait.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/trait.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/trait.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/type.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/type.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/type.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/type.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/while-let.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/while-let.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/while-let.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/while-let.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/Snippets/while.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/while.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Rust/Snippets/while.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Snippets/while.sublime-snippet diff --git a/assets/syntaxes/Packages/Rust/syntax_test_rust.rs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/syntax_test_rust.rs similarity index 100% rename from assets/syntaxes/Packages/Rust/syntax_test_rust.rs rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/syntax_test_rust.rs diff --git a/assets/syntaxes/Packages/SQL/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/SQL/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/SQL/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/SQL/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/SQL/Miscellaneous.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/SQL/Miscellaneous.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/SQL/Miscellaneous.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/SQL/Miscellaneous.tmPreferences diff --git a/assets/syntaxes/Packages/SQL/SQL.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/SQL/SQL.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/SQL/SQL.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/SQL/SQL.sublime-syntax diff --git a/assets/syntaxes/Packages/SQL/syntax_test_sql.sql b/crates/bin/docs_rs_web/assets/syntaxes/Packages/SQL/syntax_test_sql.sql similarity index 100% rename from assets/syntaxes/Packages/SQL/syntax_test_sql.sql rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/SQL/syntax_test_sql.sql diff --git a/assets/syntaxes/Packages/Scala/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Scala/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/Scala/Dedent-case.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Dedent-case.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Scala/Dedent-case.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Dedent-case.tmPreferences diff --git a/assets/syntaxes/Packages/Scala/Indent-case.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Indent-case.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Scala/Indent-case.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Indent-case.tmPreferences diff --git a/assets/syntaxes/Packages/Scala/Indent.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Indent.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Scala/Indent.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Indent.tmPreferences diff --git a/assets/syntaxes/Packages/Scala/Scala.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Scala.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Scala/Scala.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Scala.sublime-syntax diff --git a/assets/syntaxes/Packages/Scala/Snippets/adt.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/adt.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Scala/Snippets/adt.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/adt.sublime-snippet diff --git a/assets/syntaxes/Packages/Scala/Snippets/app.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/app.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Scala/Snippets/app.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/app.sublime-snippet diff --git a/assets/syntaxes/Packages/Scala/Snippets/case.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/case.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Scala/Snippets/case.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/case.sublime-snippet diff --git a/assets/syntaxes/Packages/Scala/Snippets/cc.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/cc.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Scala/Snippets/cc.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/cc.sublime-snippet diff --git a/assets/syntaxes/Packages/Scala/Snippets/co.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/co.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Scala/Snippets/co.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/co.sublime-snippet diff --git a/assets/syntaxes/Packages/Scala/Snippets/def.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/def.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Scala/Snippets/def.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/def.sublime-snippet diff --git a/assets/syntaxes/Packages/Scala/Snippets/match.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/match.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Scala/Snippets/match.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/match.sublime-snippet diff --git a/assets/syntaxes/Packages/Scala/Snippets/p.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/p.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Scala/Snippets/p.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/p.sublime-snippet diff --git a/assets/syntaxes/Packages/Scala/Snippets/try.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/try.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Scala/Snippets/try.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/try.sublime-snippet diff --git a/assets/syntaxes/Packages/Scala/Snippets/tryf.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/tryf.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Scala/Snippets/tryf.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/tryf.sublime-snippet diff --git a/assets/syntaxes/Packages/Scala/Snippets/val.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/val.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Scala/Snippets/val.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/val.sublime-snippet diff --git a/assets/syntaxes/Packages/Scala/Snippets/var.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/var.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Scala/Snippets/var.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Snippets/var.sublime-snippet diff --git a/assets/syntaxes/Packages/Scala/Symbols-class.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols-class.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Scala/Symbols-class.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols-class.tmPreferences diff --git a/assets/syntaxes/Packages/Scala/Symbols-def.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols-def.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Scala/Symbols-def.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols-def.tmPreferences diff --git a/assets/syntaxes/Packages/Scala/Symbols-namespace.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols-namespace.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Scala/Symbols-namespace.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols-namespace.tmPreferences diff --git a/assets/syntaxes/Packages/Scala/Symbols-type.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols-type.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Scala/Symbols-type.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols-type.tmPreferences diff --git a/assets/syntaxes/Packages/Scala/Symbols-val.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols-val.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Scala/Symbols-val.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols-val.tmPreferences diff --git a/assets/syntaxes/Packages/Scala/Symbols-var.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols-var.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Scala/Symbols-var.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols-var.tmPreferences diff --git a/assets/syntaxes/Packages/Scala/Symbols.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/Scala/Symbols.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/Symbols.tmPreferences diff --git a/assets/syntaxes/Packages/Scala/info.plist b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/info.plist similarity index 100% rename from assets/syntaxes/Packages/Scala/info.plist rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/info.plist diff --git a/assets/syntaxes/Packages/Scala/syntax_test_scala.scala b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/syntax_test_scala.scala similarity index 100% rename from assets/syntaxes/Packages/Scala/syntax_test_scala.scala rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Scala/syntax_test_scala.scala diff --git a/assets/syntaxes/Packages/ShellScript/Bash.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Bash.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Bash.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Bash.sublime-syntax diff --git a/assets/syntaxes/Packages/ShellScript/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/ShellScript/Completion Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Completion Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Completion Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Completion Rules.tmPreferences diff --git a/assets/syntaxes/Packages/ShellScript/Indentation.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Indentation.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Indentation.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Indentation.tmPreferences diff --git a/assets/syntaxes/Packages/ShellScript/Makefile b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Makefile similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Makefile rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Makefile diff --git a/assets/syntaxes/Packages/ShellScript/Shell-Unix-Generic.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Shell-Unix-Generic.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Shell-Unix-Generic.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Shell-Unix-Generic.sublime-syntax diff --git a/assets/syntaxes/Packages/ShellScript/ShellScript.py b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/ShellScript.py similarity index 100% rename from assets/syntaxes/Packages/ShellScript/ShellScript.py rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/ShellScript.py diff --git a/assets/syntaxes/Packages/ShellScript/ShellScript.sublime-build b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/ShellScript.sublime-build similarity index 100% rename from assets/syntaxes/Packages/ShellScript/ShellScript.sublime-build rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/ShellScript.sublime-build diff --git a/assets/syntaxes/Packages/ShellScript/Snippets/#!-usr-bin-env-(!env).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/#!-usr-bin-env-(!env).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Snippets/#!-usr-bin-env-(!env).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/#!-usr-bin-env-(!env).sublime-snippet diff --git a/assets/syntaxes/Packages/ShellScript/Snippets/case-..-esac-(case).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/case-..-esac-(case).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Snippets/case-..-esac-(case).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/case-..-esac-(case).sublime-snippet diff --git a/assets/syntaxes/Packages/ShellScript/Snippets/elif-..-(elif).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/elif-..-(elif).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Snippets/elif-..-(elif).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/elif-..-(elif).sublime-snippet diff --git a/assets/syntaxes/Packages/ShellScript/Snippets/for-...-done-(for).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/for-...-done-(for).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Snippets/for-...-done-(for).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/for-...-done-(for).sublime-snippet diff --git a/assets/syntaxes/Packages/ShellScript/Snippets/for-in-done-(forin).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/for-in-done-(forin).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Snippets/for-in-done-(forin).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/for-in-done-(forin).sublime-snippet diff --git a/assets/syntaxes/Packages/ShellScript/Snippets/if-...-then-(if).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/if-...-then-(if).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Snippets/if-...-then-(if).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/if-...-then-(if).sublime-snippet diff --git a/assets/syntaxes/Packages/ShellScript/Snippets/until-(done).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/until-(done).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Snippets/until-(done).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/until-(done).sublime-snippet diff --git a/assets/syntaxes/Packages/ShellScript/Snippets/while-(done).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/while-(done).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Snippets/while-(done).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Snippets/while-(done).sublime-snippet diff --git a/assets/syntaxes/Packages/ShellScript/Symbol List - Aliases.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Symbol List - Aliases.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Symbol List - Aliases.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Symbol List - Aliases.tmPreferences diff --git a/assets/syntaxes/Packages/ShellScript/Symbol List - Expansions.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Symbol List - Expansions.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Symbol List - Expansions.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Symbol List - Expansions.tmPreferences diff --git a/assets/syntaxes/Packages/ShellScript/Symbol List - Functions.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Symbol List - Functions.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Symbol List - Functions.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Symbol List - Functions.tmPreferences diff --git a/assets/syntaxes/Packages/ShellScript/Symbol List - Variables.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Symbol List - Variables.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/ShellScript/Symbol List - Variables.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/Symbol List - Variables.tmPreferences diff --git a/assets/syntaxes/Packages/ShellScript/commands-builtin-shell-bash.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/commands-builtin-shell-bash.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/ShellScript/commands-builtin-shell-bash.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/commands-builtin-shell-bash.sublime-syntax diff --git a/assets/syntaxes/Packages/ShellScript/commands-builtin-shell-bash.yml b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/commands-builtin-shell-bash.yml similarity index 100% rename from assets/syntaxes/Packages/ShellScript/commands-builtin-shell-bash.yml rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/commands-builtin-shell-bash.yml diff --git a/assets/syntaxes/Packages/ShellScript/test/syntax_test_bash.sh b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/test/syntax_test_bash.sh similarity index 100% rename from assets/syntaxes/Packages/ShellScript/test/syntax_test_bash.sh rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/test/syntax_test_bash.sh diff --git a/assets/syntaxes/Packages/ShellScript/test/syntax_test_shell_unix_generic.sh b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/test/syntax_test_shell_unix_generic.sh similarity index 100% rename from assets/syntaxes/Packages/ShellScript/test/syntax_test_shell_unix_generic.sh rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/test/syntax_test_shell_unix_generic.sh diff --git a/assets/syntaxes/Packages/ShellScript/tools/update-commands.py b/crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/tools/update-commands.py similarity index 100% rename from assets/syntaxes/Packages/ShellScript/tools/update-commands.py rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/ShellScript/tools/update-commands.py diff --git a/assets/syntaxes/Packages/TCL/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/TCL/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/TCL/HTML (Tcl).sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/HTML (Tcl).sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/TCL/HTML (Tcl).sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/HTML (Tcl).sublime-syntax diff --git a/assets/syntaxes/Packages/TCL/Snippets/for...-(for).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Snippets/for...-(for).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/TCL/Snippets/for...-(for).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Snippets/for...-(for).sublime-snippet diff --git a/assets/syntaxes/Packages/TCL/Snippets/foreach...-(foreach).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Snippets/foreach...-(foreach).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/TCL/Snippets/foreach...-(foreach).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Snippets/foreach...-(foreach).sublime-snippet diff --git a/assets/syntaxes/Packages/TCL/Snippets/if...-(if).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Snippets/if...-(if).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/TCL/Snippets/if...-(if).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Snippets/if...-(if).sublime-snippet diff --git a/assets/syntaxes/Packages/TCL/Snippets/proc...-(proc).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Snippets/proc...-(proc).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/TCL/Snippets/proc...-(proc).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Snippets/proc...-(proc).sublime-snippet diff --git a/assets/syntaxes/Packages/TCL/Snippets/switch...-(switch).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Snippets/switch...-(switch).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/TCL/Snippets/switch...-(switch).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Snippets/switch...-(switch).sublime-snippet diff --git a/assets/syntaxes/Packages/TCL/Snippets/while...-(while).sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Snippets/while...-(while).sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/TCL/Snippets/while...-(while).sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Snippets/while...-(while).sublime-snippet diff --git a/assets/syntaxes/Packages/TCL/Symbol List Indent NS Proc.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Symbol List Indent NS Proc.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/TCL/Symbol List Indent NS Proc.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Symbol List Indent NS Proc.tmPreferences diff --git a/assets/syntaxes/Packages/TCL/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/TCL/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/TCL/Tcl.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Tcl.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/TCL/Tcl.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/Tcl.sublime-syntax diff --git a/assets/syntaxes/Packages/TCL/syntax_test_tcl.tcl b/crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/syntax_test_tcl.tcl similarity index 100% rename from assets/syntaxes/Packages/TCL/syntax_test_tcl.tcl rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/TCL/syntax_test_tcl.tcl diff --git a/assets/syntaxes/Packages/Text/Plain text.tmLanguage b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Text/Plain text.tmLanguage similarity index 100% rename from assets/syntaxes/Packages/Text/Plain text.tmLanguage rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Text/Plain text.tmLanguage diff --git a/assets/syntaxes/Packages/Text/Snippets/lorem.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Text/Snippets/lorem.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Text/Snippets/lorem.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Text/Snippets/lorem.sublime-snippet diff --git a/assets/syntaxes/Packages/Textile/Snippets/Acronym.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Acronym.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Textile/Snippets/Acronym.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Acronym.sublime-snippet diff --git a/assets/syntaxes/Packages/Textile/Snippets/Block-Quotes.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Block-Quotes.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Textile/Snippets/Block-Quotes.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Block-Quotes.sublime-snippet diff --git a/assets/syntaxes/Packages/Textile/Snippets/Heading-1.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Heading-1.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Textile/Snippets/Heading-1.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Heading-1.sublime-snippet diff --git a/assets/syntaxes/Packages/Textile/Snippets/Heading-2.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Heading-2.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Textile/Snippets/Heading-2.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Heading-2.sublime-snippet diff --git a/assets/syntaxes/Packages/Textile/Snippets/Heading-3.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Heading-3.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Textile/Snippets/Heading-3.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Heading-3.sublime-snippet diff --git a/assets/syntaxes/Packages/Textile/Snippets/Heading-4.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Heading-4.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Textile/Snippets/Heading-4.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Heading-4.sublime-snippet diff --git a/assets/syntaxes/Packages/Textile/Snippets/Heading-5.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Heading-5.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Textile/Snippets/Heading-5.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Heading-5.sublime-snippet diff --git a/assets/syntaxes/Packages/Textile/Snippets/Heading-6.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Heading-6.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Textile/Snippets/Heading-6.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Heading-6.sublime-snippet diff --git a/assets/syntaxes/Packages/Textile/Snippets/Image.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Image.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Textile/Snippets/Image.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Image.sublime-snippet diff --git a/assets/syntaxes/Packages/Textile/Snippets/Linked-Image.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Linked-Image.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/Textile/Snippets/Linked-Image.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Snippets/Linked-Image.sublime-snippet diff --git a/assets/syntaxes/Packages/Textile/Textile.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Textile.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/Textile/Textile.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/Textile.sublime-syntax diff --git a/assets/syntaxes/Packages/Textile/syntax_test_textile.textile b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/syntax_test_textile.textile similarity index 100% rename from assets/syntaxes/Packages/Textile/syntax_test_textile.textile rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/Textile/syntax_test_textile.textile diff --git a/assets/syntaxes/Packages/XML/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/XML/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/XML/Miscellaneous.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Miscellaneous.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/XML/Miscellaneous.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Miscellaneous.tmPreferences diff --git a/assets/syntaxes/Packages/XML/Snippets/xml-cdata.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Snippets/xml-cdata.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/XML/Snippets/xml-cdata.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Snippets/xml-cdata.sublime-snippet diff --git a/assets/syntaxes/Packages/XML/Snippets/xml-declaration.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Snippets/xml-declaration.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/XML/Snippets/xml-declaration.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Snippets/xml-declaration.sublime-snippet diff --git a/assets/syntaxes/Packages/XML/Snippets/xml-long-tag.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Snippets/xml-long-tag.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/XML/Snippets/xml-long-tag.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Snippets/xml-long-tag.sublime-snippet diff --git a/assets/syntaxes/Packages/XML/Snippets/xml-model.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Snippets/xml-model.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/XML/Snippets/xml-model.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Snippets/xml-model.sublime-snippet diff --git a/assets/syntaxes/Packages/XML/Snippets/xml-short-tag.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Snippets/xml-short-tag.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/XML/Snippets/xml-short-tag.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Snippets/xml-short-tag.sublime-snippet diff --git a/assets/syntaxes/Packages/XML/Snippets/xml-stylesheet.sublime-snippet b/crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Snippets/xml-stylesheet.sublime-snippet similarity index 100% rename from assets/syntaxes/Packages/XML/Snippets/xml-stylesheet.sublime-snippet rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/Snippets/xml-stylesheet.sublime-snippet diff --git a/assets/syntaxes/Packages/XML/XML.sublime-settings b/crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/XML.sublime-settings similarity index 100% rename from assets/syntaxes/Packages/XML/XML.sublime-settings rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/XML.sublime-settings diff --git a/assets/syntaxes/Packages/XML/XML.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/XML.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/XML/XML.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/XML.sublime-syntax diff --git a/assets/syntaxes/Packages/XML/syntax_test_xml.xml b/crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/syntax_test_xml.xml similarity index 100% rename from assets/syntaxes/Packages/XML/syntax_test_xml.xml rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/XML/syntax_test_xml.xml diff --git a/assets/syntaxes/Packages/YAML/Comments.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/Comments.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/YAML/Comments.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/Comments.tmPreferences diff --git a/assets/syntaxes/Packages/YAML/Indentation Rules.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/Indentation Rules.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/YAML/Indentation Rules.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/Indentation Rules.tmPreferences diff --git a/assets/syntaxes/Packages/YAML/Symbol List.tmPreferences b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/Symbol List.tmPreferences similarity index 100% rename from assets/syntaxes/Packages/YAML/Symbol List.tmPreferences rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/Symbol List.tmPreferences diff --git a/assets/syntaxes/Packages/YAML/YAML.sublime-settings b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/YAML.sublime-settings similarity index 100% rename from assets/syntaxes/Packages/YAML/YAML.sublime-settings rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/YAML.sublime-settings diff --git a/assets/syntaxes/Packages/YAML/YAML.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/YAML.sublime-syntax similarity index 100% rename from assets/syntaxes/Packages/YAML/YAML.sublime-syntax rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/YAML.sublime-syntax diff --git a/assets/syntaxes/Packages/YAML/preview.yaml b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/preview.yaml similarity index 100% rename from assets/syntaxes/Packages/YAML/preview.yaml rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/preview.yaml diff --git a/assets/syntaxes/Packages/YAML/tests/syntax_test_block.yaml b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_block.yaml similarity index 100% rename from assets/syntaxes/Packages/YAML/tests/syntax_test_block.yaml rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_block.yaml diff --git a/assets/syntaxes/Packages/YAML/tests/syntax_test_directives.yaml b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_directives.yaml similarity index 100% rename from assets/syntaxes/Packages/YAML/tests/syntax_test_directives.yaml rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_directives.yaml diff --git a/assets/syntaxes/Packages/YAML/tests/syntax_test_flow-plain.yaml b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_flow-plain.yaml similarity index 100% rename from assets/syntaxes/Packages/YAML/tests/syntax_test_flow-plain.yaml rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_flow-plain.yaml diff --git a/assets/syntaxes/Packages/YAML/tests/syntax_test_flow.yaml b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_flow.yaml similarity index 100% rename from assets/syntaxes/Packages/YAML/tests/syntax_test_flow.yaml rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_flow.yaml diff --git a/assets/syntaxes/Packages/YAML/tests/syntax_test_general.yaml b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_general.yaml similarity index 100% rename from assets/syntaxes/Packages/YAML/tests/syntax_test_general.yaml rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_general.yaml diff --git a/assets/syntaxes/Packages/YAML/tests/syntax_test_properties.yaml b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_properties.yaml similarity index 100% rename from assets/syntaxes/Packages/YAML/tests/syntax_test_properties.yaml rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_properties.yaml diff --git a/assets/syntaxes/Packages/YAML/tests/syntax_test_types.yaml b/crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_types.yaml similarity index 100% rename from assets/syntaxes/Packages/YAML/tests/syntax_test_types.yaml rename to crates/bin/docs_rs_web/assets/syntaxes/Packages/YAML/tests/syntax_test_types.yaml diff --git a/build.rs b/crates/bin/docs_rs_web/build.rs similarity index 100% rename from build.rs rename to crates/bin/docs_rs_web/build.rs diff --git a/src/web/cache.rs b/crates/bin/docs_rs_web/src/cache.rs similarity index 95% rename from src/web/cache.rs rename to crates/bin/docs_rs_web/src/cache.rs index 374173b2d..2ee857840 100644 --- a/src/web/cache.rs +++ b/crates/bin/docs_rs_web/src/cache.rs @@ -250,8 +250,8 @@ pub(crate) async fn cache_middleware( #[cfg(test)] mod tests { use super::*; - use crate::test::{ - AxumResponseTestExt as _, TestEnvironment, assert_cache_headers_eq, + use crate::testing::{ + AxumResponseTestExt as _, assert_cache_headers_eq, headers::{test_typed_decode, test_typed_encode}, }; use anyhow::{Context as _, Result}; @@ -293,10 +293,11 @@ mod tests { cache_invalidatable_responses: bool, stale_while_revalidate: Option, ) -> Result<()> { - let config = TestEnvironment::base_config() + let config = Config::builder() + .test_config()? .cache_invalidatable_responses(cache_invalidatable_responses) - .cache_control_stale_while_revalidate(stale_while_revalidate) - .build()?; + .maybe_cache_control_stale_while_revalidate(stale_while_revalidate) + .build(); fn validate_headers(headers: &ResponseCacheHeaders) -> Result<()> { if let Some(ref cache_control) = headers.cache_control { @@ -349,7 +350,7 @@ mod tests { surrogate_control: Option<&str>, needs_global_surrogate_key: bool, ) -> Result<()> { - let config = TestEnvironment::base_config().build()?; + let config = Config::test_config()?; let headers = cache.render(&config)?; assert_eq!( @@ -373,7 +374,7 @@ mod tests { #[test] fn render_fastly_forever_in_cdn() -> Result<()> { - let config = TestEnvironment::base_config().build()?; + let config = Config::test_config()?; // this surrogate key is user-defined, identifies the crate. let key = SurrogateKey::from_static("something"); let headers = CachePolicy::ForeverInCdn(key.clone().into()).render(&config)?; @@ -403,7 +404,7 @@ mod tests { #[test] fn render_fastly_forever_in_cdn_stale_in_browser() -> Result<()> { - let config = TestEnvironment::base_config().build()?; + let config = Config::test_config()?; let key = SurrogateKey::from_static("something"); let headers = CachePolicy::ForeverInCdnAndStaleInBrowser(key.clone().into()).render(&config)?; @@ -427,9 +428,10 @@ mod tests { #[test] fn render_stale_without_config_fastly() -> Result<()> { - let config = TestEnvironment::base_config() - .cache_control_stale_while_revalidate(None) - .build()?; + let config = Config::builder() + .test_config()? + .maybe_cache_control_stale_while_revalidate(None) + .build(); let key = SurrogateKey::from_static("something"); let mut headers = @@ -445,9 +447,10 @@ mod tests { #[test] fn render_stale_with_config_fastly() -> Result<()> { - let config = TestEnvironment::base_config() - .cache_control_stale_while_revalidate(Some(666)) - .build()?; + let config = Config::builder() + .test_config()? + .cache_control_stale_while_revalidate(666) + .build(); let key = SurrogateKey::from_static("something"); let headers = @@ -467,9 +470,10 @@ mod tests { #[test] fn render_forever_in_cdn_disabled_fastly() -> Result<()> { - let config = TestEnvironment::base_config() + let config = Config::builder() + .test_config()? .cache_invalidatable_responses(false) - .build()?; + .build(); let key = SurrogateKey::from_static("something"); let headers = CachePolicy::ForeverInCdn(key.into()).render(&config)?; @@ -482,9 +486,10 @@ mod tests { #[test] fn render_forever_in_cdn_or_stale_disabled_fastly() -> Result<()> { - let config = TestEnvironment::base_config() + let config = Config::builder() + .test_config()? .cache_invalidatable_responses(false) - .build()?; + .build(); let key = SurrogateKey::from_static("something"); let headers = CachePolicy::ForeverInCdnAndStaleInBrowser(key.into()).render(&config)?; @@ -497,9 +502,10 @@ mod tests { #[tokio::test] async fn test_middleware_reacts_to_fastly_header_in_crate_route() -> Result<()> { let config = Arc::new( - TestEnvironment::base_config() + Config::builder() + .test_config()? .cache_invalidatable_responses(true) - .build()?, + .build(), ); let key = SurrogateKey::from_static("krate"); @@ -537,7 +543,7 @@ mod tests { #[tokio::test] async fn test_middleware_reacts_to_fastly_header_in_other_route() -> Result<()> { - let config = Arc::new(TestEnvironment::base_config().build()?); + let config = Arc::new(Config::test_config()?); let app = Router::new() .route( diff --git a/crates/bin/docs_rs_web/src/config.rs b/crates/bin/docs_rs_web/src/config.rs new file mode 100644 index 000000000..9ce19d1e3 --- /dev/null +++ b/crates/bin/docs_rs_web/src/config.rs @@ -0,0 +1,94 @@ +use anyhow::Result; +use docs_rs_env_vars::maybe_env; +use std::time::Duration; + +#[derive(Debug, bon::Builder)] +#[builder(on(_, overwritable))] +pub struct Config { + // Access token for APIs for crates.io + // (careful: use constant_time_eq for comparisons!) + pub(crate) cratesio_token: Option, + + // request timeout in seconds + #[builder(with = |secs: u64| Duration::from_secs(secs))] + pub(crate) request_timeout: Option, + #[builder(default)] + pub(crate) report_request_timeouts: bool, + + // The most memory that can be used to parse an HTML file + // LOL HTML only uses as much memory as the size of the start tag! + // https://github.com/rust-lang/docs.rs/pull/930#issuecomment-667729380 + #[builder(default = 5 * 1024 * 1024usize)] + pub(crate) max_parse_memory: usize, + + /// amount of threads for CPU intensive rendering + #[builder(default = num_cpus::get())] + pub(crate) render_threads: usize, + + // random crate search generates a number of random IDs to + // efficiently find a random crate with > 100 GH stars. + // The amount depends on the ratio of crates with >100 stars + // to the count of all crates. + // At the time of creating this setting, it is set to + // `500` for a ratio of 7249 over 54k crates. + // For unit-tests the number has to be higher. + #[builder(default = 500u32)] + pub(crate) random_crate_search_view_size: u32, + + // Content Security Policy + #[builder(default)] + pub(crate) csp_report_only: bool, + + // Cache-Control header, for versioned URLs. + // If both are absent, don't generate the header. If only one is present, + // generate just that directive. Values are in seconds. + pub(crate) cache_control_stale_while_revalidate: Option, + + // Activate full page caching. + // When disabled, we still cache static assets. + // This only affects pages that depend on invalidations to work. + #[builder(default = true)] + pub(crate) cache_invalidatable_responses: bool, +} + +use config_builder::State; + +impl ConfigBuilder { + pub(crate) fn load_environment(self) -> Result> { + Ok(self + .maybe_cratesio_token(maybe_env("DOCSRS_CRATESIO_TOKEN")?) + .maybe_max_parse_memory(maybe_env("DOCSRS_MAX_PARSE_MEMORY")?) + .maybe_render_threads(maybe_env("DOCSRS_RENDER_THREADS")?) + .maybe_request_timeout(maybe_env("DOCSRS_REQUEST_TIMEOUT")?) + .maybe_report_request_timeouts(maybe_env("DOCSRS_REPORT_REQUEST_TIMEOUTS")?) + .maybe_random_crate_search_view_size(maybe_env("DOCSRS_RANDOM_CRATE_SEARCH_VIEW_SIZE")?) + .maybe_csp_report_only(maybe_env("DOCSRS_CSP_REPORT_ONLY")?) + .maybe_cache_control_stale_while_revalidate(maybe_env( + "CACHE_CONTROL_STALE_WHILE_REVALIDATE", + )?) + .maybe_cache_invalidatable_responses(maybe_env( + "DOCSRS_CACHE_INVALIDATEABLE_RESPONSES", + )?)) + } + + #[cfg(test)] + #[allow(clippy::type_complexity)] + pub(crate) fn test_config(self) -> Result> { + Ok(self + .load_environment()? + // set stale content serving so Cache::ForeverInCdn and Cache::ForeverInCdnAndStaleInBrowser + // are actually different. + .cache_control_stale_while_revalidate(86400)) + } +} + +impl Config { + pub fn from_environment() -> Result { + Ok(Self::builder().load_environment()?.build()) + } + + #[cfg(test)] + pub fn test_config() -> Result { + Ok(Self::builder().test_config()?.build()) + } +} diff --git a/src/web/error.rs b/crates/bin/docs_rs_web/src/error.rs similarity index 93% rename from src/web/error.rs rename to crates/bin/docs_rs_web/src/error.rs index 94f25a9d7..eed4df308 100644 --- a/src/web/error.rs +++ b/crates/bin/docs_rs_web/src/error.rs @@ -1,5 +1,11 @@ -use crate::web::{AxumErrorPage, cache::CachePolicy, releases::Search}; +use crate::{ + cache::CachePolicy, + handlers::releases::Search, + impl_axum_webpage, + page::templates::{RenderBrands, RenderSolid}, +}; use anyhow::{Result, anyhow}; +use askama::Template; use axum::{ Json, http::StatusCode, @@ -9,6 +15,24 @@ use docs_rs_database::PoolError; use docs_rs_storage::PathNotFoundError; use docs_rs_uri::EscapedURI; use std::borrow::Cow; +use tracing::error; + +#[derive(Template)] +#[template(path = "error.html")] +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct AxumErrorPage { + /// The title of the page + pub title: &'static str, + /// The error message, displayed as a description + pub message: Cow<'static, str>, + pub status: StatusCode, +} + +impl_axum_webpage! { + AxumErrorPage, + status = |err| err.status, + +} #[derive(Debug, thiserror::Error)] pub enum AxumNope { @@ -103,7 +127,7 @@ impl AxumNope { status: StatusCode::UNAUTHORIZED, }, AxumNope::InternalError(source) => { - crate::utils::report_error(&source); + error!(?source, "internal server error"); ErrorInfo { title: "Internal Server Error", message: Cow::Owned(source.to_string()), @@ -125,7 +149,7 @@ struct ErrorInfo { } fn redirect_with_policy(target: EscapedURI, cache_policy: CachePolicy) -> AxumResponse { - match super::axum_cached_redirect(target, cache_policy) { + match crate::handlers::axum_cached_redirect(target, cache_policy) { Ok(response) => response.into_response(), Err(err) => AxumNope::InternalError(err).into_response(), } @@ -222,8 +246,8 @@ pub(crate) type JsonAxumResult = Result; #[cfg(test)] mod tests { use super::{AxumNope, EscapedURI, IntoResponse}; - use crate::test::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}; - use crate::web::cache::CachePolicy; + use crate::cache::CachePolicy; + use crate::testing::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}; use kuchikiki::traits::TendrilSink; #[test] diff --git a/src/web/extractors/context.rs b/crates/bin/docs_rs_web/src/extractors/context.rs similarity index 97% rename from src/web/extractors/context.rs rename to crates/bin/docs_rs_web/src/extractors/context.rs index 3e7675646..313ced245 100644 --- a/src/web/extractors/context.rs +++ b/crates/bin/docs_rs_web/src/extractors/context.rs @@ -1,6 +1,6 @@ //! a collection of custom extractors related to our app-context (context::Context) -use crate::web::error::AxumNope; +use crate::error::AxumNope; use anyhow::Context as _; use axum::{ RequestPartsExt, diff --git a/src/web/extractors/mod.rs b/crates/bin/docs_rs_web/src/extractors/mod.rs similarity index 100% rename from src/web/extractors/mod.rs rename to crates/bin/docs_rs_web/src/extractors/mod.rs diff --git a/src/web/extractors/path.rs b/crates/bin/docs_rs_web/src/extractors/path.rs similarity index 98% rename from src/web/extractors/path.rs rename to crates/bin/docs_rs_web/src/extractors/path.rs index 42d0bd4f1..3ade8f39e 100644 --- a/src/web/extractors/path.rs +++ b/crates/bin/docs_rs_web/src/extractors/path.rs @@ -1,5 +1,5 @@ //! custom axum extractors for path parameters -use crate::web::error::AxumNope; +use crate::error::AxumNope; use anyhow::anyhow; use axum::{ RequestPartsExt, @@ -153,7 +153,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::test::{AxumResponseTestExt, AxumRouterTestExt}; + use crate::testing::{AxumResponseTestExt, AxumRouterTestExt}; use axum::{Router, routing::get}; use http::StatusCode; diff --git a/src/web/extractors/rustdoc.rs b/crates/bin/docs_rs_web/src/extractors/rustdoc.rs similarity index 99% rename from src/web/extractors/rustdoc.rs rename to crates/bin/docs_rs_web/src/extractors/rustdoc.rs index a8da3e05e..4b53ddc83 100644 --- a/src/web/extractors/rustdoc.rs +++ b/crates/bin/docs_rs_web/src/extractors/rustdoc.rs @@ -1,6 +1,6 @@ //! special rustdoc extractors -use crate::web::{MatchedRelease, MetaData, error::AxumNope, extractors::Path}; +use crate::{error::AxumNope, extractors::Path, match_release::MatchedRelease, metadata::MetaData}; use anyhow::Result; use axum::{ RequestPartsExt, @@ -900,9 +900,9 @@ fn find_static_route_suffix<'a, 'b>(route: &'a str, path: &'b str) -> Option Result { + pub(super) async fn from_path(storage: &AsyncStorage, path: &str) -> Result { Ok(File( storage - .get(path, config.storage.max_file_size_for(path)) + .get(path, storage.config().max_file_size_for(path)) .await?, )) } @@ -130,7 +126,7 @@ impl StreamingFile { #[cfg(test)] mod tests { use super::*; - use crate::{test::TestEnvironment, web::cache::STATIC_ASSET_CACHE_POLICY}; + use crate::{cache::STATIC_ASSET_CACHE_POLICY, testing::TestEnvironment}; use axum_extra::headers::{ETag, HeaderMapExt as _}; use chrono::Utc; use docs_rs_headers::compute_etag; @@ -222,9 +218,8 @@ mod tests { env.fake_release().await.create().await?; let mut file = File::from_path( - env.async_storage(), + env.storage()?, "rustdoc/fake-package/1.0.0/fake-package/index.html", - env.config(), ) .await?; @@ -252,20 +247,16 @@ mod tests { const MAX_HTML_SIZE: usize = 128; let env = Rc::new( - TestEnvironment::with_config( - TestEnvironment::base_config() - .storage( - docs_rs_storage::Config::test_config(StorageKind::Memory)? - .set(|mut cfg| { - cfg.max_file_size = MAX_SIZE; - cfg.max_file_size_html = MAX_HTML_SIZE; - cfg - }) - .into(), - ) - .build()?, - ) - .await?, + TestEnvironment::builder() + .storage_config( + docs_rs_storage::Config::test_config(StorageKind::Memory)?.set(|mut cfg| { + cfg.max_file_size = MAX_SIZE; + cfg.max_file_size_html = MAX_HTML_SIZE; + cfg + }), + ) + .build() + .await?, ); env.fake_release() @@ -283,14 +274,7 @@ mod tests { let file = |path| { let env = env.clone(); - async move { - File::from_path( - env.async_storage(), - &format!("rustdoc/dummy/0.1.0/{path}"), - env.config(), - ) - .await - } + async move { File::from_path(env.storage()?, &format!("rustdoc/dummy/0.1.0/{path}")).await } }; let assert_len = |len, path| async move { assert_eq!(len, file(path).await.unwrap().0.content.len()); diff --git a/src/web/build_details.rs b/crates/bin/docs_rs_web/src/handlers/build_details.rs similarity index 94% rename from src/web/build_details.rs rename to crates/bin/docs_rs_web/src/handlers/build_details.rs index 0369c2316..17fc4907b 100644 --- a/src/web/build_details.rs +++ b/crates/bin/docs_rs_web/src/handlers/build_details.rs @@ -1,14 +1,12 @@ use crate::{ - Config, impl_axum_webpage, - web::{ - MetaData, - cache::CachePolicy, - error::{AxumNope, AxumResult}, - extractors::{DbConnection, Path, rustdoc::RustdocParams}, - file::File, - filters, match_version, - page::templates::{RenderBrands, RenderRegular, RenderSolid}, - }, + cache::CachePolicy, + error::{AxumNope, AxumResult}, + extractors::{DbConnection, Path, rustdoc::RustdocParams}, + file::File, + impl_axum_webpage, + match_release::match_version, + metadata::MetaData, + page::templates::{RenderBrands, RenderRegular, RenderSolid, filters}, }; use anyhow::Context as _; use askama::Template; @@ -61,7 +59,6 @@ pub(crate) async fn build_details_handler( params: RustdocParams, Path(build_params): Path, mut conn: DbConnection, - Extension(config): Extension>, Extension(storage): Extension>, ) -> AxumResult { let id = build_params @@ -147,7 +144,7 @@ pub(crate) async fn build_details_handler( }; let file_content = if let Some(ref filename) = current_filename { - let file = File::from_path(&storage, &format!("{prefix}{filename}"), &config).await?; + let file = File::from_path(&storage, &format!("{prefix}{filename}")).await?; String::from_utf8(file.0.content).context("non utf8")? } else { "".to_string() @@ -185,11 +182,9 @@ pub(crate) async fn build_details_handler( #[cfg(test)] mod tests { - use crate::test::{ - AxumResponseTestExt, AxumRouterTestExt, FakeBuild, TestEnvironment, V0_1, async_wrapper, - fake_release_that_failed_before_build, - }; - use docs_rs_types::{BuildId, ReleaseId}; + use crate::testing::{AxumResponseTestExt, AxumRouterTestExt, TestEnvironment, async_wrapper}; + use docs_rs_test_fakes::{FakeBuild, fake_release_that_failed_before_build}; + use docs_rs_types::{BuildId, ReleaseId, testing::V0_1}; use kuchikiki::traits::TendrilSink; use test_case::test_case; @@ -225,7 +220,7 @@ mod tests { #[test] fn test_partial_build_result() { async_wrapper(|env| async move { - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; let (_, build_id) = fake_release_that_failed_before_build( &mut conn, "foo", @@ -256,7 +251,7 @@ mod tests { #[test] fn test_partial_build_result_plus_default_target_from_previous_build() { async_wrapper(|env| async move { - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; let (release_id, build_id) = fake_release_that_failed_before_build( &mut conn, "foo", @@ -468,8 +463,12 @@ mod tests { let web = env.web_app().await; - let page = kuchikiki::parse_html() - .one(web.get("/crate/foo/0.1.0/builds").await?.text().await?); + let page = kuchikiki::parse_html().one( + web.assert_success("/crate/foo/0.1.0/builds") + .await? + .text() + .await?, + ); let node = page.select("ul > li a.release").unwrap().next().unwrap(); let url = { @@ -522,7 +521,7 @@ mod tests { .create() .await?; - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; let build_id = { let ids = build_ids_for_release(&mut conn, rid).await; assert_eq!(ids.len(), 1); diff --git a/src/web/builds.rs b/crates/bin/docs_rs_web/src/handlers/builds.rs similarity index 92% rename from src/web/builds.rs rename to crates/bin/docs_rs_web/src/handlers/builds.rs index b47ffae49..6b96de34a 100644 --- a/src/web/builds.rs +++ b/crates/bin/docs_rs_web/src/handlers/builds.rs @@ -1,13 +1,12 @@ use crate::{ - Config, impl_axum_webpage, - web::{ - MetaData, - cache::CachePolicy, - error::{AxumNope, AxumResult, JsonAxumNope, JsonAxumResult}, - extractors::{DbConnection, Path, rustdoc::RustdocParams}, - filters, match_version, - page::templates::{RenderBrands, RenderRegular, RenderSolid}, - }, + Config, + cache::CachePolicy, + error::{AxumNope, AxumResult, JsonAxumNope, JsonAxumResult}, + extractors::{DbConnection, Path, rustdoc::RustdocParams}, + impl_axum_webpage, + match_release::match_version, + metadata::MetaData, + page::templates::{RenderBrands, RenderRegular, RenderSolid, filters}, }; use anyhow::{Result, anyhow}; use askama::Template; @@ -20,6 +19,7 @@ use chrono::{DateTime, Utc}; use constant_time_eq::constant_time_eq; use docs_rs_build_limits::Limits; use docs_rs_build_queue::{AsyncBuildQueue, PRIORITY_MANUAL_FROM_CRATES_IO}; +use docs_rs_context::Context; use docs_rs_headers::CanonicalUrl; use docs_rs_types::{BuildId, BuildStatus, KrateName, ReqVersion, Version}; use http::StatusCode; @@ -57,7 +57,7 @@ impl BuildsPage { pub(crate) async fn build_list_handler( params: RustdocParams, mut conn: DbConnection, - Extension(config): Extension>, + Extension(context): Extension>, ) -> AxumResult { let version = match_version(&mut conn, params.name(), params.req_version()) .await? @@ -86,7 +86,8 @@ pub(crate) async fn build_list_handler( Ok(BuildsPage { metadata, builds: get_builds(&mut conn, params.name(), &version).await?, - limits: Limits::for_crate(&config.build_limits, &mut conn, params.name()).await?, + limits: Limits::for_crate(context.config().build_limits()?, &mut conn, params.name()) + .await?, canonical_url: CanonicalUrl::from_uri( params .clone() @@ -212,16 +213,18 @@ async fn get_builds( #[cfg(test)] mod tests { use crate::{ - test::{ - AxumResponseTestExt, AxumRouterTestExt, FakeBuild, TestEnvironment, V1, V2, - async_wrapper, fake_release_that_failed_before_build, - }, - web::cache::CachePolicy, + Config, + cache::CachePolicy, + testing::{AxumResponseTestExt, AxumRouterTestExt, TestEnvironment, async_wrapper}, }; use anyhow::Result; use axum::{body::Body, http::Request}; use docs_rs_build_limits::Overrides; - use docs_rs_types::{BuildStatus, testing::FOO}; + use docs_rs_test_fakes::{FakeBuild, fake_release_that_failed_before_build}; + use docs_rs_types::{ + BuildStatus, + testing::{FOO, V1, V2}, + }; use kuchikiki::traits::TendrilSink; use reqwest::StatusCode; use tower::ServiceExt; @@ -229,7 +232,7 @@ mod tests { #[test] fn build_list_empty_build() { async_wrapper(|env| async move { - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; fake_release_that_failed_before_build(&mut conn, "foo", "0.1.0", "some errors").await?; let response = env @@ -304,12 +307,15 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn build_trigger_rebuild_missing_config() -> Result<()> { - let env = TestEnvironment::with_config( - TestEnvironment::base_config() - .cratesio_token(None) - .build()?, - ) - .await?; + let env = TestEnvironment::builder() + .web_config( + Config::builder() + .test_config()? + .maybe_cratesio_token(None) + .build(), + ) + .build() + .await?; env.fake_release() .await @@ -351,12 +357,15 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn build_trigger_rebuild_with_config() -> Result<()> { let correct_token = "foo137"; - let env = TestEnvironment::with_config( - TestEnvironment::base_config() - .cratesio_token(Some(correct_token.into())) - .build()?, - ) - .await?; + let env = TestEnvironment::builder() + .web_config( + Config::builder() + .test_config()? + .cratesio_token(correct_token.into()) + .build(), + ) + .build() + .await?; env.fake_release() .await @@ -405,7 +414,7 @@ mod tests { ); } - let build_queue = env.async_build_queue(); + let build_queue = env.build_queue()?; assert_eq!(build_queue.pending_count().await?, 0); assert!(!build_queue.has_build_queued(&FOO, &V1).await?); @@ -510,7 +519,7 @@ mod tests { .create() .await?; - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; let limits = Overrides { memory: Some(6 * 1024 * 1024 * 1024), targets: Some(1), diff --git a/src/web/crate_details.rs b/crates/bin/docs_rs_web/src/handlers/crate_details.rs similarity index 97% rename from src/web/crate_details.rs rename to crates/bin/docs_rs_web/src/handlers/crate_details.rs index ace902aeb..288d46775 100644 --- a/src/web/crate_details.rs +++ b/crates/bin/docs_rs_web/src/handlers/crate_details.rs @@ -1,16 +1,15 @@ use crate::{ - impl_axum_webpage, - web::{ - MatchedRelease, MetaData, - cache::CachePolicy, - error::{AxumNope, AxumResult}, - extractors::{ - DbConnection, - rustdoc::{PageKind, RustdocParams}, - }, - get_correct_docsrs_style_file, match_version, - page::templates::{RenderBrands, RenderRegular, RenderSolid, filters}, + cache::CachePolicy, + error::{AxumNope, AxumResult}, + extractors::{ + DbConnection, + rustdoc::{PageKind, RustdocParams}, }, + impl_axum_webpage, + match_release::{MatchedRelease, match_version}, + metadata::MetaData, + page::templates::{RenderBrands, RenderRegular, RenderSolid, filters}, + utils::{get_correct_docsrs_style_file, licenses}, }; use anyhow::{Context, Result, anyhow}; use askama::Template; @@ -56,7 +55,7 @@ pub(crate) struct CrateDetails { pub(crate) metadata: MetaData, is_library: Option, pub(crate) license: Option, - pub(crate) parsed_license: Option>, + pub(crate) parsed_license: Option>, pub(crate) documentation_url: Option, pub(crate) total_items: Option, pub(crate) documented_items: Option, @@ -202,7 +201,7 @@ impl CrateDetails { None => None, }; - let parsed_license = krate.license.as_deref().map(super::licenses::parse_license); + let parsed_license = krate.license.as_deref().map(licenses::parse_license); let dependencies: Vec = krate .dependencies @@ -280,7 +279,6 @@ impl CrateDetails { Ok(Some(crate_details)) } - #[fn_error_context::context("fetching readme for {} {}", self.name, self.version)] async fn fetch_readme(&self, storage: &AsyncStorage) -> anyhow::Result> { let manifest = match storage .fetch_source_file( @@ -636,15 +634,13 @@ pub(crate) async fn get_all_platforms( #[cfg(test)] mod tests { use super::*; - use crate::test::{ - AxumResponseTestExt, AxumRouterTestExt, FakeBuild, TestEnvironment, async_wrapper, - fake_release_that_failed_before_build, - }; + use crate::testing::{AxumResponseTestExt, AxumRouterTestExt, TestEnvironment, async_wrapper}; use anyhow::Error; use docs_rs_database::{ crate_details::releases_for_crate, releases::update_build_status, testing::TestDatabase, }; use docs_rs_registry_api::CrateOwner; + use docs_rs_test_fakes::{FakeBuild, fake_release_that_failed_before_build}; use docs_rs_types::KrateName; use http::StatusCode; use kuchikiki::traits::TendrilSink; @@ -712,9 +708,6 @@ mod tests { .unwrap() } - #[fn_error_context::context( - "assert_last_successful_build_equals({package}, {version}, {expected_last_successful_build:?})" - )] async fn assert_last_successful_build_equals( db: &TestDatabase, package: &str, @@ -737,7 +730,7 @@ mod tests { #[test] fn test_crate_details_documentation_url_is_none_when_url_is_docs_rs() { async_wrapper(|env| async move { - let db = env.async_db(); + let db = &env.db; let mut conn = db.async_conn().await?; env.fake_release() @@ -780,7 +773,7 @@ mod tests { #[test] fn test_last_successful_build_when_last_releases_failed_or_yanked() { async_wrapper(|env| async move { - let db = env.async_db(); + let db = &env.db; env.fake_release() .await @@ -831,7 +824,7 @@ mod tests { #[test] fn test_last_successful_build_when_all_releases_failed_or_yanked() { async_wrapper(|env| async move { - let db = env.async_db(); + let db = &env.db; env.fake_release() .await @@ -865,7 +858,7 @@ mod tests { #[test] fn test_last_successful_build_with_intermittent_releases_failed_or_yanked() { async_wrapper(|env| async move { - let db = env.async_db(); + let db = &env.db; env.fake_release() .await @@ -906,7 +899,7 @@ mod tests { #[test] fn test_releases_should_be_sorted() { async_wrapper(|env| async move { - let db = env.async_db(); + let db = &env.db; // Add new releases of 'foo' out-of-order since CrateDetails should sort them descending env.fake_release() @@ -1115,7 +1108,7 @@ mod tests { #[test] fn test_latest_version() { async_wrapper(|env| async move { - let db = env.async_db(); + let db = &env.db; env.fake_release() .await @@ -1152,7 +1145,7 @@ mod tests { #[test] fn test_latest_version_ignores_prerelease() { async_wrapper(|env| async move { - let db = env.async_db(); + let db = &env.db; env.fake_release() .await @@ -1189,7 +1182,7 @@ mod tests { #[test] fn test_latest_version_ignores_yanked() { async_wrapper(|env| async move { - let db = env.async_db(); + let db = &env.db; env.fake_release() .await @@ -1227,7 +1220,7 @@ mod tests { #[test] fn test_latest_version_only_yanked() { async_wrapper(|env| async move { - let db = env.async_db(); + let db = &env.db; env.fake_release() .await @@ -1267,7 +1260,7 @@ mod tests { #[test] fn test_latest_version_in_progress() { async_wrapper(|env| async move { - let db = env.async_db(); + let db = &env.db; env.fake_release() .await @@ -1374,7 +1367,7 @@ mod tests { #[test] fn test_updating_owners() { async_wrapper(|env| async move { - let db = env.async_db(); + let db = &env.db; env.fake_release() .await @@ -1660,7 +1653,7 @@ mod tests { .create() .await?; - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; sqlx::query!("UPDATE releases SET features = NULL WHERE id = $1", id.0) .execute(&mut *conn) .await?; @@ -1681,7 +1674,7 @@ mod tests { #[test] fn test_minimal_failed_release_doesnt_error_features() { async_wrapper(|env| async move { - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; fake_release_that_failed_before_build(&mut conn, "foo", "0.1.0", "some errors").await?; let text_content = env @@ -1705,7 +1698,7 @@ mod tests { #[test] fn test_minimal_failed_release_doesnt_error() { async_wrapper(|env| async move { - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; fake_release_that_failed_before_build(&mut conn, "foo", "0.1.0", "some errors").await?; let text_content = env @@ -2089,10 +2082,10 @@ mod tests { check_readme("/crate/dummy/0.3.0".into(), "storage readme".into()).await; check_readme("/crate/dummy/0.4.0".into(), "storage meread".into()).await; - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; let details = crate_details(&mut conn, "dummy", "0.5.0", None).await; assert!(matches!( - details.fetch_readme(env.async_storage()).await, + details.fetch_readme(env.storage()?).await, Ok(None) )); Ok(()) @@ -2193,7 +2186,7 @@ path = "src/lib.rs" .create() .await?; - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; sqlx::query!("DELETE FROM builds") .execute(&mut *conn) .await?; @@ -2224,7 +2217,7 @@ path = "src/lib.rs" .create() .await?; - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; assert_eq!( release_build_status(&mut conn, "dummy", "0.1.0").await, @@ -2249,7 +2242,7 @@ path = "src/lib.rs" .create() .await?; - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; assert_eq!( release_build_status(&mut conn, "dummy", "0.1.0").await, @@ -2273,7 +2266,7 @@ path = "src/lib.rs" .create() .await?; - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; assert_eq!( release_build_status(&mut conn, "dummy", "0.1.0").await, diff --git a/src/web/features.rs b/crates/bin/docs_rs_web/src/handlers/features.rs similarity index 97% rename from src/web/features.rs rename to crates/bin/docs_rs_web/src/handlers/features.rs index 7f6252081..ebf753f5e 100644 --- a/src/web/features.rs +++ b/crates/bin/docs_rs_web/src/handlers/features.rs @@ -1,16 +1,14 @@ use crate::{ - impl_axum_webpage, - web::{ - MetaData, - cache::CachePolicy, - error::{AxumNope, AxumResult}, - extractors::{ - DbConnection, - rustdoc::{PageKind, RustdocParams}, - }, - filters, match_version, - page::templates::{RenderBrands, RenderRegular, RenderSolid}, + cache::CachePolicy, + error::{AxumNope, AxumResult}, + extractors::{ + DbConnection, + rustdoc::{PageKind, RustdocParams}, }, + impl_axum_webpage, + match_release::match_version, + metadata::MetaData, + page::templates::{RenderBrands, RenderRegular, RenderSolid, filters}, }; use anyhow::anyhow; use askama::Template; @@ -276,7 +274,7 @@ fn get_sorted_features(raw_features: Vec) -> (Vec, HashSet AxumResponse { + let uri = req.uri().clone(); + + let response = next.run(req).await; + + if response.status() == StatusCode::REQUEST_TIMEOUT { + tracing::error!(?uri, "request timeout"); + } + + response +} + +async fn set_sentry_transaction_name_from_axum_route( + request: AxumRequest, + next: Next, +) -> AxumResponse { + let route_name = if let Some(path) = request.extensions().get::() { + path.as_str() + } else { + request.uri().path() + }; + + sentry::configure_scope(|scope| { + scope.set_transaction(Some(route_name)); + }); + + next.run(request).await +} + +async fn apply_middleware( + router: AxumRouter, + config: Arc, + context: Arc, + template_data: Option>, +) -> Result { + let has_templates = template_data.is_some(); + + let web_metrics = Arc::new(WebMetrics::new(&context.meter_provider)); + + Ok(router.layer( + ServiceBuilder::new() + .layer(TraceLayer::new_for_http()) + .layer(sentry_tower::NewSentryLayer::new_from_top()) + .layer(sentry_tower::SentryHttpLayer::new().enable_transaction()) + .layer(middleware::from_fn( + set_sentry_transaction_name_from_axum_route, + )) + .layer(CatchPanicLayer::new()) + .layer(middleware::from_fn(security::security_middleware)) + .layer(option_layer( + config + .report_request_timeouts + .then_some(middleware::from_fn(log_timeouts_to_sentry)), + )) + .layer(option_layer(config.request_timeout.map(|to| { + TimeoutLayer::with_status_code(StatusCode::REQUEST_TIMEOUT, to) + }))) + .layer(Extension(context.clone())) + .layer(Extension(context.pool()?.clone())) + .layer(Extension(context.build_queue()?.clone())) + .layer(Extension(web_metrics)) + .layer(Extension(config.clone())) + .layer(Extension(context.registry_api()?.clone())) + .layer(Extension(context.storage()?.clone())) + .layer(option_layer(template_data.map(Extension))) + .layer(middleware::from_fn(csp::csp_middleware)) + .layer(option_layer(has_templates.then_some(middleware::from_fn( + page::web_page::render_templates_middleware, + )))) + .layer(middleware::from_fn(crate::cache::cache_middleware)), + )) +} + +pub(crate) async fn build_axum_app( + config: Arc, + context: Arc, + template_data: Arc, +) -> Result { + apply_middleware( + routes::build_axum_routes(), + config, + context, + Some(template_data), + ) + .await +} + +#[instrument(skip_all)] +pub async fn run_web_server( + addr: Option, + config: Arc, + context: Arc, +) -> Result<(), Error> { + let template_data = Arc::new(TemplateData::new(config.render_threads)?); + + let axum_addr = addr.unwrap_or(DEFAULT_BIND); + + tracing::info!( + "Starting web server on `{}:{}`", + axum_addr.ip(), + axum_addr.port() + ); + + let app = build_axum_app(config, context, template_data) + .await? + .into_make_service(); + let listener = tokio::net::TcpListener::bind(axum_addr) + .await + .context("error binding socket for web server")?; + + axum::serve(listener, app) + .with_graceful_shutdown(shutdown_signal()) + .await?; + + Ok(()) +} + +async fn shutdown_signal() { + let ctrl_c = async { + tokio::signal::ctrl_c() + .await + .expect("failed to install Ctrl+C handler"); + }; + + #[cfg(unix)] + let terminate = async { + tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()) + .expect("failed to install signal handler") + .recv() + .await; + }; + + #[cfg(not(unix))] + let terminate = std::future::pending::<()>(); + + tokio::select! { + _ = ctrl_c => {}, + _ = terminate => {}, + } + + info!("signal received, starting graceful shutdown"); +} + +#[instrument] +pub(crate) fn axum_redirect(uri: U) -> Result +where + U: TryInto + std::fmt::Debug, + >::Error: std::fmt::Debug, +{ + let uri: http::Uri = uri + .try_into() + .map_err(|err| anyhow!("invalid URI: {:?}", err))?; + + if let Some(path_and_query) = uri.path_and_query() { + if path_and_query.as_str().starts_with("//") { + bail!("protocol relative redirects are forbidden"); + } + } else { + // we always want a path to redirect to, even when it's just `/` + bail!("missing path in URI"); + } + + Ok(( + StatusCode::FOUND, + [( + http::header::LOCATION, + http::HeaderValue::try_from(uri.to_string()).context("invalid uri for redirect")?, + )], + )) +} + +#[instrument] +pub(crate) fn axum_cached_redirect( + uri: U, + cache_policy: cache::CachePolicy, +) -> Result +where + U: TryInto + std::fmt::Debug, + >::Error: std::fmt::Debug, +{ + let mut resp = axum_redirect(uri)?.into_response(); + resp.extensions_mut().insert(cache_policy); + Ok(resp) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::testing::{AxumResponseTestExt, AxumRouterTestExt, TestEnvironment, async_wrapper}; + use docs_rs_types::{DocCoverage, ReleaseId, Version}; + use kuchikiki::traits::TendrilSink; + use pretty_assertions::assert_eq; + use test_case::test_case; + + async fn release(version: &str, env: &TestEnvironment) -> ReleaseId { + let version = Version::parse(version).unwrap(); + env.fake_release() + .await + .name("foo") + .version(version) + .create() + .await + .unwrap() + } + + async fn clipboard_is_present_for_path(path: &str, web: &axum::Router) -> bool { + let data = web.get(path).await.unwrap().text().await.unwrap(); + let node = kuchikiki::parse_html().one(data); + node.select("#clipboard").unwrap().count() == 1 + } + + #[test] + fn test_index_returns_success() { + async_wrapper(|env| async move { + let web = env.web_app().await; + assert!(web.get("/").await?.status().is_success()); + Ok(()) + }); + } + + #[test] + fn test_doc_coverage_for_crate_pages() { + async_wrapper(|env| async move { + env.fake_release() + .await + .name("foo") + .version("0.0.1") + .source_file("test.rs", &[]) + .doc_coverage(DocCoverage { + total_items: 10, + documented_items: 6, + total_items_needing_examples: 2, + items_with_examples: 1, + }) + .create() + .await?; + let web = env.web_app().await; + + let foo_crate = kuchikiki::parse_html() + .one(web.assert_success("/crate/foo/0.0.1").await?.text().await?); + + for (idx, value) in ["60%", "6", "10", "2", "1"].iter().enumerate() { + let mut menu_items = foo_crate.select(".pure-menu-item b").unwrap(); + assert!( + menu_items.any(|e| e.text_contents().contains(value)), + "({idx}, {value:?})" + ); + } + + let foo_doc = kuchikiki::parse_html() + .one(web.assert_success("/foo/0.0.1/foo/").await?.text().await?); + assert!( + foo_doc + .select(".pure-menu-link b") + .unwrap() + .any(|e| e.text_contents().contains("60%")) + ); + + Ok(()) + }); + } + + #[test] + fn test_show_clipboard_for_crate_pages() { + async_wrapper(|env| async move { + env.fake_release() + .await + .name("fake_crate") + .version("0.0.1") + .source_file("test.rs", &[]) + .create() + .await?; + let web = env.web_app().await; + assert!(clipboard_is_present_for_path("/crate/fake_crate/0.0.1", &web).await); + assert!(clipboard_is_present_for_path("/crate/fake_crate/0.0.1/source/", &web).await); + assert!(clipboard_is_present_for_path("/fake_crate/0.0.1/fake_crate/", &web).await); + Ok(()) + }); + } + + #[test] + fn test_hide_clipboard_for_non_crate_pages() { + async_wrapper(|env| async move { + env.fake_release() + .await + .name("fake_crate") + .version("0.0.1") + .create() + .await?; + let web = env.web_app().await; + assert!(!clipboard_is_present_for_path("/about", &web).await); + assert!(!clipboard_is_present_for_path("/releases", &web).await); + assert!(!clipboard_is_present_for_path("/", &web).await); + assert!(!clipboard_is_present_for_path("/not/a/real/path", &web).await); + Ok(()) + }); + } + + #[test] + fn standard_library_redirects() { + async fn assert_external_redirect_success( + web: &axum::Router, + path: &str, + expected_target: &str, + ) -> Result<()> { + let redirect_response = web.assert_redirect_unchecked(path, expected_target).await?; + + let external_target_url = redirect_response.redirect_target().unwrap(); + + let response = reqwest::get(external_target_url).await?; + let status = response.status(); + assert!( + status.is_success(), + "failed to GET {external_target_url}: {status}" + ); + Ok(()) + } + + async_wrapper(|env| async move { + let web = env.web_app().await; + for krate in &["std", "alloc", "core", "proc_macro", "test"] { + let target = format!("https://doc.rust-lang.org/stable/{krate}/"); + + // with or without slash + assert_external_redirect_success(&web, &format!("/{krate}"), &target).await?; + assert_external_redirect_success(&web, &format!("/{krate}/"), &target).await?; + } + + let target = "https://doc.rust-lang.org/stable/proc_macro/"; + // with or without slash + assert_external_redirect_success(&web, "/proc-macro", target).await?; + assert_external_redirect_success(&web, "/proc-macro/", target).await?; + + let target = "https://doc.rust-lang.org/nightly/nightly-rustc/"; + // with or without slash + assert_external_redirect_success(&web, "/rustc", target).await?; + assert_external_redirect_success(&web, "/rustc/", target).await?; + + let target = "https://doc.rust-lang.org/nightly/nightly-rustc/rustdoc/"; + // with or without slash + assert_external_redirect_success(&web, "/rustdoc", target).await?; + assert_external_redirect_success(&web, "/rustdoc/", target).await?; + + // queries are supported + assert_external_redirect_success( + &web, + "/std?search=foobar", + "https://doc.rust-lang.org/stable/std/?search=foobar", + ) + .await?; + + Ok(()) + }) + } + + #[test] + fn double_slash_does_redirect_to_latest_version() { + async_wrapper(|env| async move { + env.fake_release() + .await + .name("bat") + .version("0.2.0") + .create() + .await?; + let web = env.web_app().await; + web.assert_redirect("/bat//", "/bat/latest/bat/").await?; + Ok(()) + }) + } + + #[test] + fn binary_docs_redirect_to_crate() { + async_wrapper(|env| async move { + env.fake_release() + .await + .name("bat") + .version("0.2.0") + .binary(true) + .create() + .await?; + let web = env.web_app().await; + web.assert_redirect("/bat/0.2.0", "/crate/bat/0.2.0") + .await?; + web.assert_redirect("/bat/0.2.0/aarch64-unknown-linux-gnu", "/crate/bat/0.2.0") + .await?; + /* TODO: this should work (https://github.com/rust-lang/docs.rs/issues/603) + assert_redirect("/bat/0.2.0/aarch64-unknown-linux-gnu/bat", "/crate/bat/0.2.0", web)?; + assert_redirect("/bat/0.2.0/aarch64-unknown-linux-gnu/bat/", "/crate/bat/0.2.0/", web)?; + */ + Ok(()) + }) + } + + #[test] + fn can_view_source() { + async_wrapper(|env| async move { + env.fake_release() + .await + .name("regex") + .version("0.3.0") + .source_file("src/main.rs", br#"println!("definitely valid rust")"#) + .create() + .await?; + + let web = env.web_app().await; + web.assert_success("/crate/regex/0.3.0/source/src/main.rs") + .await?; + web.assert_success("/crate/regex/0.3.0/source/").await?; + web.assert_success("/crate/regex/0.3.0/source/src").await?; + web.assert_success("/regex/0.3.0/src/regex/main.rs.html") + .await?; + Ok(()) + }) + } + + #[test] + fn platform_dropdown_not_shown_with_no_targets() { + async_wrapper(|env| async move { + release("0.1.0", &env).await; + let web = env.web_app().await; + let text = web.get("/foo/0.1.0/foo").await?.text().await?; + let platform = kuchikiki::parse_html() + .one(text) + .select(r#"ul > li > a[aria-label="Platform"]"#) + .unwrap() + .count(); + assert_eq!(platform, 0); + + // sanity check the test is doing something + env.fake_release() + .await + .name("foo") + .version("0.2.0") + .add_platform("x86_64-unknown-linux-musl") + .create() + .await?; + let text = web.assert_success("/foo/0.2.0/foo/").await?.text().await?; + let platform = kuchikiki::parse_html() + .one(text) + .select(r#"ul > li > a[aria-label="Platform"]"#) + .unwrap() + .count(); + assert_eq!(platform, 1); + Ok(()) + }); + } + + #[test] + fn test_tabindex_is_present_on_topbar_crate_search_input() { + async_wrapper(|env| async move { + release("0.1.0", &env).await; + let web = env.web_app().await; + let text = web.assert_success("/foo/0.1.0/foo/").await?.text().await?; + let tabindex = kuchikiki::parse_html() + .one(text) + .select(r#"#nav-search[tabindex="-1"]"#) + .unwrap() + .count(); + assert_eq!(tabindex, 1); + Ok(()) + }); + } + + #[test] + fn test_axum_redirect() { + let response = axum_redirect("/something").unwrap().into_response(); + assert_eq!(response.status(), StatusCode::FOUND); + assert_eq!( + response.headers().get(http::header::LOCATION).unwrap(), + "/something" + ); + assert!( + response + .headers() + .get(http::header::CACHE_CONTROL) + .is_none() + ); + assert!(response.extensions().get::().is_none()); + } + + #[test] + fn test_axum_redirect_cached() { + let response = axum_cached_redirect("/something", cache::CachePolicy::NoCaching) + .unwrap() + .into_response(); + assert_eq!(response.status(), StatusCode::FOUND); + assert_eq!( + response.headers().get(http::header::LOCATION).unwrap(), + "/something" + ); + assert!(matches!( + response.extensions().get::().unwrap(), + cache::CachePolicy::NoCaching, + )) + } + + #[test_case("without_leading_slash")] + #[test_case("//with_double_leading_slash")] + fn test_axum_redirect_failure(path: &str) { + assert!(axum_redirect(path).is_err()); + assert!(axum_cached_redirect(path, cache::CachePolicy::NoCaching).is_err()); + } +} diff --git a/src/web/releases.rs b/crates/bin/docs_rs_web/src/handlers/releases.rs similarity index 94% rename from src/web/releases.rs rename to crates/bin/docs_rs_web/src/handlers/releases.rs index 189fcef23..9d220eaa8 100644 --- a/src/web/releases.rs +++ b/crates/bin/docs_rs_web/src/handlers/releases.rs @@ -1,20 +1,17 @@ //! Releases web handlersrelease use crate::{ - Config, impl_axum_webpage, - utils::report_error, - web::{ - axum_redirect, - cache::CachePolicy, - error::{AxumNope, AxumResult}, - extractors::{DbConnection, Path, rustdoc::RustdocParams}, - match_version, - metrics::WebMetrics, - page::templates::{RenderBrands, RenderRegular, RenderSolid, filters}, - rustdoc::OfficialCrateDescription, - }, + Config, + cache::CachePolicy, + error::{AxumNope, AxumResult}, + extractors::{DbConnection, Path, rustdoc::RustdocParams}, + handlers::{axum_redirect, rustdoc::OfficialCrateDescription}, + impl_axum_webpage, + match_release::match_version, + metrics::WebMetrics, + page::templates::{RenderBrands, RenderRegular, RenderSolid, filters}, }; -use anyhow::{Context as _, Result, anyhow}; +use anyhow::{Context as _, Result}; use askama::Template; use axum::{ extract::{Extension, Query}, @@ -35,7 +32,7 @@ use std::{ str, sync::Arc, }; -use tracing::{trace, warn}; +use tracing::{error, trace, warn}; use url::form_urlencoded; /// Number of release in home page @@ -432,16 +429,16 @@ pub(crate) async fn owner_handler(Path(owner): Path) -> AxumResult, - pub(super) search_query: Option, - pub(super) search_sort_by: Option, - pub(super) previous_page_link: Option, - pub(super) next_page_link: Option, +pub(crate) struct Search { + pub(crate) title: String, + pub(crate) releases: Vec, + pub(crate) search_query: Option, + pub(crate) search_sort_by: Option, + pub(crate) previous_page_link: Option, + pub(crate) next_page_link: Option, /// This should always be `ReleaseType::Search` - pub(super) release_type: ReleaseType, - pub(super) status: http::StatusCode, + pub(crate) release_type: ReleaseType, + pub(crate) status: http::StatusCode, } impl Default for Search { @@ -508,7 +505,7 @@ async fn redirect_to_random_crate( Ok(axum_redirect(params.rustdoc_url())?) } else { - report_error(&anyhow!("found no result in random crate search")); + error!("found no result in random crate search"); Err(AxumNope::NoResults) } } @@ -786,19 +783,17 @@ pub(crate) async fn build_queue_handler( #[cfg(test)] mod tests { use super::*; - use crate::test::{ - AxumResponseTestExt, AxumRouterTestExt, FakeBuild, TestEnvironment, V0_1, V1, V2, V3, - async_wrapper, fake_release_that_failed_before_build, - }; + use crate::testing::{AxumResponseTestExt, AxumRouterTestExt, TestEnvironment, async_wrapper}; use anyhow::Error; use chrono::{Duration, TimeZone}; use docs_rs_database::releases::{ finish_build, initialize_build, initialize_crate, initialize_release, }; use docs_rs_registry_api::{CrateOwner, OwnerKind}; + use docs_rs_test_fakes::{FakeBuild, fake_release_that_failed_before_build}; use docs_rs_types::{ BuildStatus, - testing::{BAR, BAZ, FOO}, + testing::{BAR, BAZ, FOO, V0_1, V1, V2, V3}, }; use kuchikiki::traits::TendrilSink; use mockito::Matcher; @@ -810,8 +805,7 @@ mod tests { #[test] fn test_release_list_with_incomplete_release_and_successful_build() { async_wrapper(|env| async move { - let db = env.async_db(); - let mut conn = db.async_conn().await?; + let mut conn = env.async_conn().await?; let crate_id = initialize_crate(&mut conn, "foo").await?; let release_id = initialize_release(&mut conn, crate_id, &V1).await?; @@ -845,7 +839,7 @@ mod tests { #[test] fn get_releases_by_stars() { async_wrapper(|env| async move { - let db = env.async_db(); + let db = &env.db; env.fake_release() .await @@ -977,7 +971,7 @@ mod tests { // crate in the db breaks this test. // That's why we reset the id-sequence to zero for this test. - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; sqlx::query!(r#"ALTER SEQUENCE crates_id_seq RESTART WITH 1"#) .execute(&mut *conn) .await?; @@ -1051,13 +1045,14 @@ mod tests { async fn search_result_can_retrieve_sort_by_from_pagination() -> Result<()> { let mut crates_io = mockito::Server::new_async().await; - let mut config = TestEnvironment::base_config().build()?; - config.registry_api = docs_rs_registry_api::Config { - registry_api_host: crates_io.url().parse().unwrap(), - ..Default::default() - } - .into(); - let env = TestEnvironment::with_config(config).await?; + let env = TestEnvironment::builder() + .registry_api_config( + docs_rs_registry_api::Config::builder() + .registry_api_host(crates_io.url().parse().unwrap()) + .build(), + ) + .build() + .await?; let web = env.web_app().await; env.fake_release() @@ -1117,13 +1112,14 @@ mod tests { async fn search_result_passes_cratesio_pagination_links() -> Result<()> { let mut crates_io = mockito::Server::new_async().await; - let mut config = TestEnvironment::base_config().build()?; - config.registry_api = docs_rs_registry_api::Config { - registry_api_host: crates_io.url().parse().unwrap(), - ..Default::default() - } - .into(); - let env = TestEnvironment::with_config(config).await?; + let env = TestEnvironment::builder() + .registry_api_config( + docs_rs_registry_api::Config::builder() + .registry_api_host(crates_io.url().parse().unwrap()) + .build(), + ) + .build() + .await?; let web = env.web_app().await; env.fake_release() @@ -1209,13 +1205,14 @@ mod tests { async fn crates_io_errors_as_status_code_200() -> Result<()> { let mut crates_io = mockito::Server::new_async().await; - let mut config = TestEnvironment::base_config().build()?; - config.registry_api = docs_rs_registry_api::Config { - registry_api_host: crates_io.url().parse().unwrap(), - crates_io_api_call_retries: 0, - } - .into(); - let env = TestEnvironment::with_config(config).await?; + let env = TestEnvironment::builder() + .registry_api_config( + docs_rs_registry_api::Config::builder() + .registry_api_host(crates_io.url().parse().unwrap()) + .build(), + ) + .build() + .await?; let _m = crates_io .mock("GET", "/api/v1/crates") @@ -1262,13 +1259,15 @@ mod tests { ) -> Result<()> { let mut crates_io = mockito::Server::new_async().await; - let mut config = TestEnvironment::base_config().build()?; - config.registry_api = docs_rs_registry_api::Config { - registry_api_host: crates_io.url().parse().unwrap(), - crates_io_api_call_retries: 0, - } - .into(); - let env = TestEnvironment::with_config(config).await?; + let env = TestEnvironment::builder() + .registry_api_config( + docs_rs_registry_api::Config::builder() + .registry_api_host(crates_io.url().parse().unwrap()) + .crates_io_api_call_retries(0) + .build(), + ) + .build() + .await?; let _m = crates_io .mock("GET", "/api/v1/crates") @@ -1295,13 +1294,14 @@ mod tests { async fn search_encoded_pagination_passed_to_cratesio() -> Result<()> { let mut crates_io = mockito::Server::new_async().await; - let mut config = TestEnvironment::base_config().build()?; - config.registry_api = docs_rs_registry_api::Config { - registry_api_host: crates_io.url().parse().unwrap(), - ..Default::default() - } - .into(); - let env = TestEnvironment::with_config(config).await?; + let env = TestEnvironment::builder() + .registry_api_config( + docs_rs_registry_api::Config::builder() + .registry_api_host(crates_io.url().parse().unwrap()) + .build(), + ) + .build() + .await?; let web = env.web_app().await; env.fake_release() @@ -1351,13 +1351,14 @@ mod tests { async fn search_lucky_with_unknown_crate() -> Result<()> { let mut crates_io = mockito::Server::new_async().await; - let mut config = TestEnvironment::base_config().build()?; - config.registry_api = docs_rs_registry_api::Config { - registry_api_host: crates_io.url().parse().unwrap(), - ..Default::default() - } - .into(); - let env = TestEnvironment::with_config(config).await?; + let env = TestEnvironment::builder() + .registry_api_config( + docs_rs_registry_api::Config::builder() + .registry_api_host(crates_io.url().parse().unwrap()) + .build(), + ) + .build() + .await?; let web = env.web_app().await; env.fake_release() @@ -1407,13 +1408,14 @@ mod tests { async fn search() -> Result<()> { let mut crates_io = mockito::Server::new_async().await; - let mut config = TestEnvironment::base_config().build()?; - config.registry_api = docs_rs_registry_api::Config { - registry_api_host: crates_io.url().parse().unwrap(), - ..Default::default() - } - .into(); - let env = TestEnvironment::with_config(config).await?; + let env = TestEnvironment::builder() + .registry_api_config( + docs_rs_registry_api::Config::builder() + .registry_api_host(crates_io.url().parse().unwrap()) + .build(), + ) + .build() + .await?; let web = env.web_app().await; env.fake_release() @@ -1459,7 +1461,7 @@ mod tests { .await?; // release that failed in the fetch-step, will miss some details - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; fake_release_that_failed_before_build( &mut conn, "failed_hard", @@ -1829,7 +1831,7 @@ mod tests { .any(|el| el.text_contents().contains("active CDN deployments")) ); - let queue = env.async_build_queue(); + let queue = env.build_queue()?; queue.add_crate(&FOO, &V1, 0, None).await?; queue.add_crate(&BAR, &V2, -10, None).await?; queue.add_crate(&BAZ, &V3, 10, None).await?; @@ -1869,7 +1871,7 @@ mod tests { let web = env.web_app().await; // we have two queued releases, where the build for one is already in progress - let queue = env.async_build_queue(); + let queue = env.build_queue()?; queue.add_crate(&FOO, &V1, 0, None).await?; queue.add_crate(&BAR, &V2, 0, None).await?; @@ -1944,7 +1946,7 @@ mod tests { fn test_releases_rebuild_queue_with_crates() { async_wrapper(|env| async move { let web = env.web_app().await; - let queue = env.async_build_queue(); + let queue = env.build_queue()?; queue .add_crate(&FOO, &V1, PRIORITY_CONTINUOUS, None) .await?; @@ -2127,13 +2129,14 @@ mod tests { async fn crates_not_on_docsrs() -> Result<()> { let mut crates_io = mockito::Server::new_async().await; - let mut config = TestEnvironment::base_config().build()?; - config.registry_api = docs_rs_registry_api::Config { - registry_api_host: crates_io.url().parse().unwrap(), - ..Default::default() - } - .into(); - let env = TestEnvironment::with_config(config).await?; + let env = TestEnvironment::builder() + .registry_api_config( + docs_rs_registry_api::Config::builder() + .registry_api_host(crates_io.url().parse().unwrap()) + .build(), + ) + .build() + .await?; let web = env.web_app().await; env.fake_release() diff --git a/src/web/rustdoc.rs b/crates/bin/docs_rs_web/src/handlers/rustdoc.rs similarity index 98% rename from src/web/rustdoc.rs rename to crates/bin/docs_rs_web/src/handlers/rustdoc.rs index 4dffde7ca..988ae1a45 100644 --- a/src/web/rustdoc.rs +++ b/crates/bin/docs_rs_web/src/handlers/rustdoc.rs @@ -1,25 +1,25 @@ //! rustdoc handlerr use crate::{ - BUILD_VERSION, Config, RUSTDOC_STATIC_STORAGE_PREFIX, utils, - web::{ - MetaData, axum_cached_redirect, - cache::{CachePolicy, STATIC_ASSET_CACHE_POLICY}, - crate_details::CrateDetails, - csp::Csp, - error::{AxumNope, AxumResult}, - extractors::{ - DbConnection, Path, WantedCompression, - rustdoc::{PageKind, RustdocParams, UrlParams}, - }, - file::StreamingFile, - licenses, match_version, - metrics::WebMetrics, - page::{ - TemplateData, - templates::{RenderBrands, RenderRegular, RenderSolid, filters}, - }, + BUILD_VERSION, Config, RUSTDOC_STATIC_STORAGE_PREFIX, + cache::{CachePolicy, STATIC_ASSET_CACHE_POLICY}, + error::{AxumNope, AxumResult}, + extractors::{ + DbConnection, Path, WantedCompression, + rustdoc::{PageKind, RustdocParams, UrlParams}, }, + file::StreamingFile, + handlers::{axum_cached_redirect, crate_details::CrateDetails}, + match_release::match_version, + metadata::MetaData, + metrics::WebMetrics, + middleware::csp::Csp, + page::{ + TemplateData, + templates::{RenderBrands, RenderRegular, RenderSolid, filters}, + }, + utils, + utils::licenses, }; use anyhow::{Context as _, anyhow}; use askama::Template; @@ -517,7 +517,7 @@ impl RustdocPage { etag.map(TypedHeader), Extension(cache_policy), TypedHeader(ContentType::from(mime::TEXT_HTML_UTF_8)), - Body::from_stream(utils::rewrite_rustdoc_html_stream( + Body::from_stream(utils::html_rewrite::rewrite_rustdoc_html_stream( template_data, rustdoc_html.content, max_parse_memory, @@ -1040,7 +1040,7 @@ pub(crate) async fn static_asset_handler( #[cfg(test)] mod test { use super::*; - use crate::{Config, test::*, web::cache::CachePolicy}; + use crate::{Config, cache::CachePolicy, testing::*}; use anyhow::{Context, Result}; use chrono::{NaiveDate, Utc}; use docs_rs_builder::{ @@ -1346,12 +1346,15 @@ mod test { #[tokio::test(flavor = "multi_thread")] async fn cache_headers_on_version() -> Result<()> { - let env = TestEnvironment::with_config( - TestEnvironment::base_config() - .cache_control_stale_while_revalidate(Some(2592000)) - .build()?, - ) - .await?; + let env = TestEnvironment::builder() + .web_config( + Config::builder() + .test_config()? + .cache_control_stale_while_revalidate(2592000) + .build(), + ) + .build() + .await?; env.fake_release() .await @@ -2394,7 +2397,7 @@ mod test { .create() .await?; - let mut conn = env.async_db().async_conn().await?; + let mut conn = env.async_conn().await?; // https://stackoverflow.com/questions/18209625/how-do-i-modify-fields-inside-the-new-postgresql-json-datatype sqlx::query!( r#"UPDATE releases SET dependencies = dependencies::jsonb #- '{0,2}' WHERE id = $1"#, id.0 @@ -3040,7 +3043,7 @@ mod test { #[tokio::test(flavor = "multi_thread")] async fn download_semver() -> Result<()> { - let env = TestEnvironment::with_config(TestEnvironment::base_config().build()?).await?; + let env = TestEnvironment::new().await?; env.fake_release() .await @@ -3172,7 +3175,7 @@ mod test { async fn test_static_asset_handler(path: &str) -> Result<()> { let env = TestEnvironment::new().await?; - let storage = env.async_storage(); + let storage = env.storage()?; storage .store_one( format!("{RUSTDOC_STATIC_STORAGE_PREFIX}{path}"), @@ -3219,7 +3222,7 @@ mod test { const ROOT_ASSET: &str = "normalize-20200403-1.44.0-nightly-74bd074ee.css"; - let storage = env.async_storage(); + let storage = env.storage()?; storage.store_one(ROOT_ASSET, *b"content").await?; storage.store_one(path, *b"more_content").await?; @@ -3540,7 +3543,7 @@ mod test { .create() .await?; - let storage = env.async_storage(); + let storage = env.storage()?; let zstd_blob = storage .get( diff --git a/src/web/sitemap.rs b/crates/bin/docs_rs_web/src/handlers/sitemap.rs similarity index 92% rename from src/web/sitemap.rs rename to crates/bin/docs_rs_web/src/handlers/sitemap.rs index 2b05156fd..f45ba88f4 100644 --- a/src/web/sitemap.rs +++ b/crates/bin/docs_rs_web/src/handlers/sitemap.rs @@ -1,14 +1,9 @@ use crate::{ - Config, impl_axum_webpage, - utils::report_error, - web::{ - AxumErrorPage, - error::{AxumNope, AxumResult}, - extractors::{DbConnection, Path}, - page::templates::{RenderBrands, RenderSolid, filters}, - }, + error::{AxumErrorPage, AxumNope, AxumResult}, + extractors::{DbConnection, Path}, + impl_axum_webpage, + page::templates::{RenderBrands, RenderSolid, filters}, }; -use anyhow::Context as _; use askama::Template; use async_stream::stream; use axum::{ @@ -20,6 +15,7 @@ use axum::{ use axum_extra::{TypedHeader, headers::ContentType}; use chrono::{TimeZone, Utc}; use docs_rs_build_limits::Limits; +use docs_rs_context::Context; use docs_rs_database::service_config::{ConfigName, get_config}; use docs_rs_mimes as mimes; use futures_util::{StreamExt as _, pin_mut}; @@ -97,11 +93,11 @@ pub(crate) async fn sitemap_handler( pin_mut!(result); while let Some(row) = result.next().await { - let row = match row.context("error fetching row from database") { + let row = match row { Ok(row) => row, Err(err) => { - report_error(&err); - yield Err(AxumNope::InternalError(err)); + error!(?err, "error fetching row from database"); + yield Err(AxumNope::InternalError(err.into())); break; } }; @@ -118,9 +114,8 @@ pub(crate) async fn sitemap_handler( .max(Utc.with_ymd_and_hms(2022, 8, 28, 0, 0, 0).unwrap()) .format("%+") .to_string(), - } + }) .render() - .context("error when rendering sitemap item xml")) { Ok(item) => { let bytes = Bytes::from(item); @@ -129,8 +124,8 @@ pub(crate) async fn sitemap_handler( yield Ok(bytes); } Err(err) => { - report_error(&err); - yield Err(AxumNope::InternalError(err)); + error!(?err, "error when rendering sitemap item xml"); + yield Err(AxumNope::InternalError(err.into())); break; } }; @@ -170,11 +165,11 @@ impl_axum_webpage!(AboutBuilds); pub(crate) async fn about_builds_handler( mut conn: DbConnection, - Extension(config): Extension>, + Extension(context): Extension>, ) -> AxumResult { Ok(AboutBuilds { rustc_version: get_config::(&mut conn, ConfigName::RustcVersion).await?, - limits: Limits::new(&config.build_limits), + limits: Limits::new(context.config().build_limits()?), active_tab: "builds", }) } @@ -225,7 +220,7 @@ pub(crate) async fn about_handler(subpage: Option>) -> AxumResult Result<()> { - let env = TestEnvironment::with_config( - TestEnvironment::base_config() - .storage( - docs_rs_storage::Config::test_config(StorageKind::Memory)? - .set(|mut cfg| { - cfg.max_file_size = 1; - cfg.max_file_size_html = 1; - cfg - }) - .into(), - ) - .build()?, - ) - .await?; + let env = TestEnvironment::builder() + .storage_config( + docs_rs_storage::Config::test_config(StorageKind::Memory)?.set(|mut cfg| { + cfg.max_file_size = 1; + cfg.max_file_size_html = 1; + cfg + }), + ) + .build() + .await?; env.fake_release() .await diff --git a/src/web/statics.rs b/crates/bin/docs_rs_web/src/handlers/statics.rs similarity index 98% rename from src/web/statics.rs rename to crates/bin/docs_rs_web/src/handlers/statics.rs index 0f127a696..df8aefcfe 100644 --- a/src/web/statics.rs +++ b/crates/bin/docs_rs_web/src/handlers/statics.rs @@ -1,5 +1,7 @@ -use super::{cache::CachePolicy, metrics::request_recorder, routes::get_static}; -use crate::web::cache::STATIC_ASSET_CACHE_POLICY; +use crate::{ + cache::CachePolicy, cache::STATIC_ASSET_CACHE_POLICY, metrics::request_recorder, + routes::get_static, +}; use axum::{ Router as AxumRouter, extract::{Extension, Request}, @@ -130,7 +132,7 @@ pub(crate) fn build_static_router() -> AxumRouter { #[cfg(test)] mod tests { use super::*; - use crate::test::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}; + use crate::testing::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}; use axum::{Router, body::Body}; use docs_rs_headers::compute_etag; use http::{ diff --git a/src/web/status.rs b/crates/bin/docs_rs_web/src/handlers/status.rs similarity index 97% rename from src/web/status.rs rename to crates/bin/docs_rs_web/src/handlers/status.rs index e1369e674..085db4409 100644 --- a/src/web/status.rs +++ b/crates/bin/docs_rs_web/src/handlers/status.rs @@ -1,8 +1,8 @@ -use crate::web::{ +use crate::{ cache::CachePolicy, error::{AxumNope, AxumResult}, extractors::{DbConnection, rustdoc::RustdocParams}, - match_version, + match_release::match_version, }; use axum::{ Json, extract::Extension, http::header::ACCESS_CONTROL_ALLOW_ORIGIN, response::IntoResponse, @@ -51,8 +51,8 @@ pub(crate) async fn status_handler( #[cfg(test)] mod tests { use crate::{ - test::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}, - web::cache::CachePolicy, + cache::CachePolicy, + testing::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}, }; use docs_rs_types::ReqVersion; use reqwest::StatusCode; diff --git a/crates/bin/docs_rs_web/src/lib.rs b/crates/bin/docs_rs_web/src/lib.rs new file mode 100644 index 000000000..e48674658 --- /dev/null +++ b/crates/bin/docs_rs_web/src/lib.rs @@ -0,0 +1,40 @@ +#![allow( + // clippy::cognitive_complexity, + // TODO: `AxumNope::Redirect(EscapedURI, CachePolicy)` is too big. + clippy::result_large_err, +)] + +mod cache; +mod config; +mod error; +mod extractors; +mod file; +mod handlers; +pub(crate) mod match_release; +mod metadata; +mod metrics; +pub(crate) mod middleware; +mod page; +mod routes; +#[cfg(test)] +pub(crate) mod testing; +mod utils; + +pub use config::Config; +pub use docs_rs_build_limits::DEFAULT_MAX_TARGETS; +pub use docs_rs_utils::{APP_USER_AGENT, BUILD_VERSION, RUSTDOC_STATIC_STORAGE_PREFIX}; +pub use font_awesome_as_a_crate::icons; +pub use handlers::run_web_server; + +use page::GlobalAlert; + +// Warning message shown in the navigation bar of every page. Set to `None` to hide it. +pub(crate) static GLOBAL_ALERT: Option = None; +/* +pub(crate) static GLOBAL_ALERT: Option = Some(GlobalAlert { + url: "https://blog.rust-lang.org/2019/09/18/upcoming-docsrs-changes.html", + text: "Upcoming docs.rs breaking changes!", + css_class: "error", + fa_icon: "exclamation-triangle", +}); +*/ diff --git a/crates/bin/docs_rs_web/src/main.rs b/crates/bin/docs_rs_web/src/main.rs new file mode 100644 index 000000000..64a9c4fe4 --- /dev/null +++ b/crates/bin/docs_rs_web/src/main.rs @@ -0,0 +1,43 @@ +use anyhow::Context as _; +use clap::Parser; +use docs_rs_web::{Config, run_web_server}; +use std::{net::SocketAddr, sync::Arc}; + +#[derive(Parser)] +#[command( + about = env!("CARGO_PKG_DESCRIPTION"), + version = docs_rs_utils::BUILD_VERSION, + rename_all = "kebab-case", +)] +struct Cli { + #[arg(name = "SOCKET_ADDR", default_value = "0.0.0.0:3000")] + socket_addr: SocketAddr, +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let _guard = docs_rs_logging::init().context("error initializing logging")?; + + let args = Cli::parse(); + + let context = Arc::new( + docs_rs_context::Context::builder() + .with_runtime() + .await? + .with_meter_provider()? + .with_pool() + .await? + .with_build_queue()? + .with_storage() + .await? + .with_registry_api()? + .with_build_limits()? + .build()?, + ); + + let config = Arc::new(Config::from_environment()?); + + run_web_server(Some(args.socket_addr), config, context).await?; + + Ok(()) +} diff --git a/crates/bin/docs_rs_web/src/match_release.rs b/crates/bin/docs_rs_web/src/match_release.rs new file mode 100644 index 000000000..3e8036d6c --- /dev/null +++ b/crates/bin/docs_rs_web/src/match_release.rs @@ -0,0 +1,424 @@ +use crate::error::AxumNope; +use anyhow::{Context as _, Result}; +use docs_rs_database::crate_details::Release; +use docs_rs_types::{BuildStatus, CrateId, KrateName, ReqVersion, Version, VersionReq}; +use tracing::instrument; + +#[derive(Debug)] +pub(crate) struct MatchedRelease { + /// crate name + pub name: KrateName, + + /// The crate name that was found when attempting to load a crate release. + /// `match_version` will attempt to match a provided crate name against similar crate names with + /// dashes (`-`) replaced with underscores (`_`) and vice versa. + pub corrected_name: Option, + + /// what kind of version did we get in the request? ("latest", semver, exact) + pub req_version: ReqVersion, + + /// the matched release + pub release: Release, + + /// all releases since we have them anyways and so we can pass them to CrateDetails + pub(crate) all_releases: Vec, +} + +impl MatchedRelease { + pub(crate) fn assume_exact_name(self) -> Result { + if self.corrected_name.is_none() { + Ok(self) + } else { + Err(AxumNope::CrateNotFound) + } + } + + pub(crate) fn into_exactly_named(self) -> Self { + if let Some(corrected_name) = self.corrected_name { + Self { + name: corrected_name.to_owned(), + corrected_name: None, + ..self + } + } else { + self + } + } + + pub(crate) fn into_exactly_named_or_else(self, f: F) -> Result + where + F: FnOnce(&KrateName, &ReqVersion) -> AxumNope, + { + if let Some(corrected_name) = self.corrected_name { + Err(f(&corrected_name, &self.req_version)) + } else { + Ok(self) + } + } + + /// Canonicalize the version from the request + /// + /// Mainly: + /// * "newest"/"*" or empty -> "latest" in the URL + /// * any other semver requirement -> specific version in the URL + pub(crate) fn into_canonical_req_version(self) -> Self { + match self.req_version { + ReqVersion::Exact(_) | ReqVersion::Latest => self, + ReqVersion::Semver(version_req) => { + if version_req == VersionReq::STAR { + Self { + req_version: ReqVersion::Latest, + ..self + } + } else { + Self { + req_version: ReqVersion::Exact(self.release.version.clone()), + ..self + } + } + } + } + } + + /// translate this MatchRelease into a specific semver::Version while canonicalizing the + /// version specification. + pub(crate) fn into_canonical_req_version_or_else(self, f: F) -> Result + where + F: FnOnce(&KrateName, &ReqVersion) -> AxumNope, + { + let original_req_version = self.req_version.clone(); + let canonicalized = self.into_canonical_req_version(); + + if canonicalized.req_version == original_req_version { + Ok(canonicalized) + } else { + Err(f(&canonicalized.name, &canonicalized.req_version)) + } + } + + pub(crate) fn into_version(self) -> Version { + self.release.version + } + + pub(crate) fn build_status(&self) -> BuildStatus { + self.release.build_status + } + + pub(crate) fn rustdoc_status(&self) -> bool { + self.release.rustdoc_status.unwrap_or(false) + } + + pub(crate) fn is_latest_url(&self) -> bool { + matches!(self.req_version, ReqVersion::Latest) + } +} + +fn semver_match<'a, F: Fn(&Release) -> bool>( + releases: &'a [Release], + req: &VersionReq, + filter: F, +) -> Option<&'a Release> { + // first try standard semver match using `VersionReq::match`, should handle most cases. + if let Some(release) = releases + .iter() + .filter(|release| filter(release)) + .find(|release| req.matches(&release.version)) + { + Some(release) + } else if req == &VersionReq::STAR { + // semver `*` does not match pre-releases. + // So when we only have pre-releases, `VersionReq::STAR` would lead to an + // empty result. + // In this case we just return the latest prerelease instead of nothing. + releases.iter().find(|release| filter(release)) + } else { + None + } +} + +/// Checks the database for crate releases that match the given name and version. +/// +/// `version` may be an exact version number or loose semver version requirement. The return value +/// will indicate whether the given version exactly matched a version number from the database. +/// +/// This function will also check for crates where dashes in the name (`-`) have been replaced with +/// underscores (`_`) and vice-versa. The return value will indicate whether the crate name has +/// been matched exactly, or if there has been a "correction" in the name that matched instead. +#[instrument(skip(conn))] +pub(crate) async fn match_version( + conn: &mut sqlx::PgConnection, + name: &str, + input_version: &ReqVersion, +) -> Result { + let (crate_id, name, corrected_name) = { + let row = sqlx::query!( + r#" + SELECT + id as "id: CrateId", + name as "name: KrateName" + FROM crates + WHERE normalize_crate_name(name) = normalize_crate_name($1)"#, + name, + ) + .fetch_optional(&mut *conn) + .await + .context("error fetching crate")? + .ok_or(AxumNope::CrateNotFound)?; + + let name: KrateName = name + .parse() + .expect("here we know it's valid, because we found it after normalizing"); + + if row.name != name { + (row.id, name, Some(row.name)) + } else { + (row.id, name, None) + } + }; + + // first load and parse all versions of this crate, + // `releases_for_crate` is already sorted, newest version first. + let releases = docs_rs_database::crate_details::releases_for_crate(conn, crate_id) + .await + .context("error fetching releases for crate")?; + + if releases.is_empty() { + return Err(AxumNope::CrateNotFound); + } + + let req_semver: VersionReq = match input_version { + ReqVersion::Exact(parsed_req_version) => { + if let Some(release) = releases + .iter() + .find(|release| &release.version == parsed_req_version) + { + return Ok(MatchedRelease { + name, + corrected_name, + req_version: input_version.clone(), + release: release.clone(), + all_releases: releases, + }); + } + + if let Ok(version_req) = VersionReq::parse(&parsed_req_version.to_string()) { + // when we don't find a release with exact version, + // we try to interpret it as a semver requirement. + // A normal semver version ("1.2.3") is equivalent to a caret semver requirement. + version_req + } else { + return Err(AxumNope::VersionNotFound); + } + } + ReqVersion::Latest => VersionReq::STAR, + ReqVersion::Semver(version_req) => version_req.clone(), + }; + + // when matching semver requirements, + // we generally only want to look at non-yanked releases, + // excluding releases which just contain in-progress builds + if let Some(release) = semver_match(&releases, &req_semver, |r: &Release| { + r.build_status != BuildStatus::InProgress && (r.yanked.is_none() || r.yanked == Some(false)) + }) { + return Ok(MatchedRelease { + name: name.to_owned(), + corrected_name, + req_version: input_version.clone(), + release: release.clone(), + all_releases: releases, + }); + } + + // when we don't find any match with "normal" releases, we also look into in-progress releases + if let Some(release) = semver_match(&releases, &req_semver, |r: &Release| { + r.yanked.is_none() || r.yanked == Some(false) + }) { + return Ok(MatchedRelease { + name: name.to_owned(), + corrected_name, + req_version: input_version.clone(), + release: release.clone(), + all_releases: releases, + }); + } + + // Since we return with a CrateNotFound earlier if the db reply is empty, + // we know that versions were returned but none satisfied the version requirement. + // This can only happen when all versions are yanked. + Err(AxumNope::VersionNotFound) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::testing::{TestEnvironment, async_wrapper}; + use docs_rs_database::testing::TestDatabase; + use docs_rs_test_fakes::FakeBuild; + use docs_rs_types::ReleaseId; + use std::str::FromStr as _; + + async fn release(version: &str, env: &TestEnvironment) -> ReleaseId { + let version = Version::parse(version).unwrap(); + env.fake_release() + .await + .name("foo") + .version(version) + .create() + .await + .unwrap() + } + + async fn version(v: Option<&str>, db: &TestDatabase) -> Option { + let mut conn = db.async_conn().await.unwrap(); + let version = match_version( + &mut conn, + "foo", + &ReqVersion::from_str(v.unwrap_or_default()).unwrap(), + ) + .await + .ok()? + .assume_exact_name() + .ok()? + .into_version(); + Some(version) + } + + #[allow(clippy::unnecessary_wraps)] + fn exact(version: &'static str) -> Option { + version.parse().ok() + } + + #[allow(clippy::unnecessary_wraps)] + fn semver(version: &'static str) -> Option { + version.parse().ok() + } + + #[test] + // https://github.com/rust-lang/docs.rs/issues/223 + fn prereleases_are_not_considered_for_semver() { + async_wrapper(|env| async move { + let db = &env.db; + let version = |v| version(v, db); + let release = |v| release(v, &env); + + release("0.3.1-pre").await; + for search in &["*", "newest", "latest"] { + assert_eq!(version(Some(search)).await, semver("0.3.1-pre")); + } + + release("0.3.1-alpha").await; + assert_eq!(version(Some("0.3.1-alpha")).await, exact("0.3.1-alpha")); + + release("0.3.0").await; + let three = semver("0.3.0"); + assert_eq!(version(None).await, three); + // same thing but with "*" + assert_eq!(version(Some("*")).await, three); + // make sure exact matches still work + assert_eq!(version(Some("0.3.0")).await, exact("0.3.0")); + + Ok(()) + }); + } + + #[test] + // https://github.com/rust-lang/docs.rs/issues/1682 + fn prereleases_are_considered_when_others_dont_match() { + async_wrapper(|env| async move { + let db = &env.db; + + // normal release + release("1.0.0", &env).await; + // prereleases + release("2.0.0-alpha.1", &env).await; + release("2.0.0-alpha.2", &env).await; + + // STAR gives me the prod release + assert_eq!(version(Some("*"), db).await, exact("1.0.0")); + + // prerelease query gives me the latest prerelease + assert_eq!( + version(Some(">=2.0.0-alpha"), db).await, + exact("2.0.0-alpha.2") + ); + + Ok(()) + }) + } + + #[test] + // vaguely related to https://github.com/rust-lang/docs.rs/issues/395 + fn metadata_has_no_effect() { + async_wrapper(|env| async move { + let db = &env.db; + + release("0.1.0+4.1", &env).await; + release("0.1.1", &env).await; + assert_eq!(version(None, db).await, semver("0.1.1")); + release("0.5.1+zstd.1.4.4", &env).await; + assert_eq!(version(None, db).await, semver("0.5.1+zstd.1.4.4")); + assert_eq!(version(Some("0.5"), db).await, semver("0.5.1+zstd.1.4.4")); + assert_eq!( + version(Some("0.5.1+zstd.1.4.4"), db).await, + exact("0.5.1+zstd.1.4.4") + ); + + Ok(()) + }); + } + + #[test] + fn in_progress_releases_are_ignored_when_others_match() { + async_wrapper(|env| async move { + let db = &env.db; + + // normal release + release("1.0.0", &env).await; + + // in progress release + env.fake_release() + .await + .name("foo") + .version("1.1.0") + .builds(vec![ + FakeBuild::default().build_status(BuildStatus::InProgress), + ]) + .create() + .await?; + + // STAR gives me the prod release + assert_eq!(version(Some("*"), db).await, exact("1.0.0")); + + // exact-match query gives me the in progress release + assert_eq!(version(Some("=1.1.0"), db).await, exact("1.1.0")); + + Ok(()) + }) + } + + #[test] + // https://github.com/rust-lang/docs.rs/issues/221 + fn yanked_crates_are_not_considered() { + async_wrapper(|env| async move { + let db = &env.db; + + let release_id = release("0.3.0", &env).await; + + sqlx::query!( + "UPDATE releases SET yanked = true WHERE id = $1 AND version = '0.3.0'", + release_id.0 + ) + .execute(&mut *db.async_conn().await?) + .await?; + + assert_eq!(version(None, db).await, None); + assert_eq!(version(Some("0.3"), db).await, None); + + release("0.1.0+4.1", &env).await; + assert_eq!(version(Some("0.1.0+4.1"), db).await, exact("0.1.0+4.1")); + assert_eq!(version(None, db).await, semver("0.1.0+4.1")); + + Ok(()) + }); + } +} diff --git a/crates/bin/docs_rs_web/src/metadata.rs b/crates/bin/docs_rs_web/src/metadata.rs new file mode 100644 index 000000000..85ec82057 --- /dev/null +++ b/crates/bin/docs_rs_web/src/metadata.rs @@ -0,0 +1,200 @@ +use crate::utils::get_correct_docsrs_style_file; +use anyhow::{Context as _, Result}; +use docs_rs_database::crate_details::parse_doc_targets; +use docs_rs_types::{KrateName, ReqVersion, Version}; +use serde::Serialize; + +/// MetaData used in header +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +pub(crate) struct MetaData { + pub(crate) name: KrateName, + /// The exact version of the release being shown. + pub(crate) version: Version, + /// The version identifier in the request that was used to request this page. + /// This might be any of the variants of `ReqVersion`, but + /// due to a canonicalization step, it is either an Exact version, or `/latest/` + /// most of the time. + pub(crate) req_version: ReqVersion, + pub(crate) description: Option, + pub(crate) target_name: Option, + pub(crate) rustdoc_status: Option, + pub(crate) default_target: Option, + pub(crate) doc_targets: Option>, + pub(crate) yanked: Option, + /// CSS file to use depending on the rustdoc version used to generate this version of this + /// crate. + pub(crate) rustdoc_css_file: Option, +} + +impl MetaData { + pub(crate) async fn from_crate( + conn: &mut sqlx::PgConnection, + name: &str, + version: &Version, + req_version: Option, + ) -> Result { + let row = sqlx::query!( + r#"SELECT + crates.name as "name: KrateName", + releases.version, + releases.description, + releases.target_name, + releases.rustdoc_status, + releases.default_target, + releases.doc_targets, + releases.yanked, + builds.rustc_version as "rustc_version?" + FROM releases + INNER JOIN crates ON crates.id = releases.crate_id + LEFT JOIN LATERAL ( + SELECT * FROM builds + WHERE builds.rid = releases.id + ORDER BY builds.build_finished + DESC LIMIT 1 + ) AS builds ON true + WHERE crates.name = $1 AND releases.version = $2"#, + name, + version.to_string(), + ) + .fetch_one(&mut *conn) + .await + .context("error fetching crate metadata")?; + + Ok(MetaData { + name: row.name, + version: version.clone(), + req_version: req_version.unwrap_or_else(|| ReqVersion::Exact(version.clone())), + description: row.description, + target_name: row.target_name, + rustdoc_status: row.rustdoc_status, + default_target: row.default_target, + doc_targets: row.doc_targets.map(parse_doc_targets), + yanked: row.yanked, + rustdoc_css_file: row + .rustc_version + .as_deref() + .map(get_correct_docsrs_style_file) + .transpose()?, + }) + } +} + +#[cfg(test)] +mod tests { + use crate::testing::TestEnvironment; + + use super::*; + use serde_json::json; + + #[test] + fn serialize_metadata() { + let mut metadata = MetaData { + name: "serde".parse().unwrap(), + version: "1.0.0".parse().unwrap(), + req_version: ReqVersion::Latest, + description: Some("serde does stuff".to_string()), + target_name: None, + rustdoc_status: Some(true), + default_target: Some("x86_64-unknown-linux-gnu".to_string()), + doc_targets: Some(vec![ + "x86_64-unknown-linux-gnu".to_string(), + "arm64-unknown-linux-gnu".to_string(), + ]), + yanked: Some(false), + rustdoc_css_file: Some("rustdoc.css".to_string()), + }; + + let correct_json = json!({ + "name": "serde", + "version": "1.0.0", + "req_version": "latest", + "description": "serde does stuff", + "target_name": null, + "rustdoc_status": true, + "default_target": "x86_64-unknown-linux-gnu", + "doc_targets": [ + "x86_64-unknown-linux-gnu", + "arm64-unknown-linux-gnu", + ], + "yanked": false, + "rustdoc_css_file": "rustdoc.css", + }); + + assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap()); + + metadata.target_name = Some("serde_lib_name".to_string()); + let correct_json = json!({ + "name": "serde", + "version": "1.0.0", + "req_version": "latest", + "description": "serde does stuff", + "target_name": "serde_lib_name", + "rustdoc_status": true, + "default_target": "x86_64-unknown-linux-gnu", + "doc_targets": [ + "x86_64-unknown-linux-gnu", + "arm64-unknown-linux-gnu", + ], + "yanked": false, + "rustdoc_css_file": "rustdoc.css", + }); + + assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap()); + + metadata.description = None; + let correct_json = json!({ + "name": "serde", + "version": "1.0.0", + "req_version": "latest", + "description": null, + "target_name": "serde_lib_name", + "rustdoc_status": true, + "default_target": "x86_64-unknown-linux-gnu", + "doc_targets": [ + "x86_64-unknown-linux-gnu", + "arm64-unknown-linux-gnu", + ], + "yanked": false, + "rustdoc_css_file": "rustdoc.css", + }); + + assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap()); + } + + #[tokio::test(flavor = "multi_thread")] + async fn metadata_from_crate() -> Result<()> { + let env = TestEnvironment::new().await?; + + env.fake_release() + .await + .name("foo") + .version("0.1.0") + .create() + .await?; + + let mut conn = env.async_conn().await?; + let metadata = MetaData::from_crate( + &mut conn, + "foo", + &"0.1.0".parse().unwrap(), + Some(ReqVersion::Latest), + ) + .await; + assert_eq!( + metadata.unwrap(), + MetaData { + name: "foo".parse().unwrap(), + version: "0.1.0".parse().unwrap(), + req_version: ReqVersion::Latest, + description: Some("Fake package".to_string()), + target_name: Some("foo".to_string()), + rustdoc_status: Some(true), + default_target: Some("x86_64-unknown-linux-gnu".to_string()), + doc_targets: Some(vec!["x86_64-unknown-linux-gnu".to_string()]), + yanked: Some(false), + rustdoc_css_file: Some("rustdoc.css".to_string()), + }, + ); + Ok(()) + } +} diff --git a/src/web/metrics.rs b/crates/bin/docs_rs_web/src/metrics.rs similarity index 93% rename from src/web/metrics.rs rename to crates/bin/docs_rs_web/src/metrics.rs index d1dc67020..62c003ce9 100644 --- a/src/web/metrics.rs +++ b/crates/bin/docs_rs_web/src/metrics.rs @@ -1,4 +1,3 @@ -use crate::metrics::RESPONSE_TIME_HISTOGRAM_BUCKETS; use axum::{ extract::{MatchedPath, Request as AxumRequest}, http::StatusCode, @@ -12,6 +11,18 @@ use opentelemetry::{ }; use std::{borrow::Cow, sync::Arc, time::Instant}; +/// response time histogram buckets from the opentelemetry semantiv conventions +/// https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverrequestduration +/// +/// These are the default prometheus bucket sizes, +/// https://docs.rs/prometheus/0.14.0/src/prometheus/histogram.rs.html#25-27 +/// tailored to broadly measure the response time (in seconds) of a network service. +/// +/// Otel default buckets are not suited for that. +pub const RESPONSE_TIME_HISTOGRAM_BUCKETS: &[f64] = &[ + 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0, +]; + #[derive(Debug)] pub(crate) struct WebMetrics { pub(crate) html_rewrite_ooms: Counter, @@ -107,7 +118,7 @@ pub(crate) async fn request_recorder( #[cfg(test)] mod tests { - use crate::test::{AxumRouterTestExt, async_wrapper}; + use crate::testing::{AxumRouterTestExt, async_wrapper}; use opentelemetry_sdk::metrics::data::{AggregatedMetrics, MetricData}; use pretty_assertions::assert_eq; use std::collections::HashMap; diff --git a/src/web/csp.rs b/crates/bin/docs_rs_web/src/middleware/csp.rs similarity index 98% rename from src/web/csp.rs rename to crates/bin/docs_rs_web/src/middleware/csp.rs index 5f36a509d..9ad402bf7 100644 --- a/src/web/csp.rs +++ b/crates/bin/docs_rs_web/src/middleware/csp.rs @@ -29,11 +29,11 @@ impl Csp { } } - pub(super) fn suppress(&self, suppress: bool) { + pub(crate) fn suppress(&self, suppress: bool) { self.suppress.store(suppress, Ordering::Relaxed); } - pub(super) fn nonce(&self) -> &str { + pub(crate) fn nonce(&self) -> &str { &self.nonce } diff --git a/crates/bin/docs_rs_web/src/middleware/mod.rs b/crates/bin/docs_rs_web/src/middleware/mod.rs new file mode 100644 index 000000000..528ac83ab --- /dev/null +++ b/crates/bin/docs_rs_web/src/middleware/mod.rs @@ -0,0 +1,2 @@ +pub(crate) mod csp; +pub(crate) mod security; diff --git a/src/web/security.rs b/crates/bin/docs_rs_web/src/middleware/security.rs similarity index 95% rename from src/web/security.rs rename to crates/bin/docs_rs_web/src/middleware/security.rs index cd5be85f1..122d2c741 100644 --- a/src/web/security.rs +++ b/crates/bin/docs_rs_web/src/middleware/security.rs @@ -31,8 +31,8 @@ pub(crate) async fn security_middleware( mod tests { use super::*; use crate::{ - test::{AxumResponseTestExt as _, AxumRouterTestExt as _}, - web::extractors::Path, + extractors::Path, + testing::{AxumResponseTestExt as _, AxumRouterTestExt as _}, }; use anyhow::Result; use axum::{Router, middleware, routing::get}; diff --git a/src/web/page/mod.rs b/crates/bin/docs_rs_web/src/page/mod.rs similarity index 100% rename from src/web/page/mod.rs rename to crates/bin/docs_rs_web/src/page/mod.rs diff --git a/src/web/page/templates.rs b/crates/bin/docs_rs_web/src/page/templates.rs similarity index 97% rename from src/web/page/templates.rs rename to crates/bin/docs_rs_web/src/page/templates.rs index 84d4d58ef..760861da9 100644 --- a/src/web/page/templates.rs +++ b/crates/bin/docs_rs_web/src/page/templates.rs @@ -1,6 +1,5 @@ -use crate::error::Result; -use crate::web::rustdoc::RustdocPage; -use anyhow::Context; +use crate::handlers::rustdoc::RustdocPage; +use anyhow::{Context as _, Result}; use askama::Template; use std::sync::Arc; use tracing::trace; @@ -147,7 +146,7 @@ pub mod filters { // TODO: This can be replaced by chrono #[askama::filter_fn] pub fn timeformat(value: &DateTime, _: &dyn Values) -> askama::Result { - Ok(crate::web::duration_to_str(*value)) + Ok(crate::utils::duration_to_str(*value)) } #[askama::filter_fn] @@ -221,7 +220,7 @@ pub mod filters { lang: &str, ) -> askama::Result> { let highlighted_code = - crate::web::highlight::with_lang(Some(lang), &code.to_string(), None); + crate::utils::highlight::with_lang(Some(lang), &code.to_string(), None); Ok(Safe(format!("
{highlighted_code}
"))) } diff --git a/src/web/page/web_page.rs b/crates/bin/docs_rs_web/src/page/web_page.rs similarity index 95% rename from src/web/page/web_page.rs rename to crates/bin/docs_rs_web/src/page/web_page.rs index 71c6bbbeb..3946af94e 100644 --- a/src/web/page/web_page.rs +++ b/crates/bin/docs_rs_web/src/page/web_page.rs @@ -1,4 +1,4 @@ -use crate::web::{TemplateData, csp::Csp, error::AxumNope}; +use crate::{error::AxumNope, middleware::csp::Csp, page::templates::TemplateData}; use axum::{ body::Body, extract::Request as AxumRequest, @@ -24,7 +24,7 @@ macro_rules! impl_axum_webpage { $(, cpu_intensive_rendering = $cpu_intensive_rendering:expr)? $(,)? ) => { - impl $crate::web::page::web_page::AddCspNonce for $page { + impl $crate::page::web_page::AddCspNonce for $page { fn render_with_csp_nonce(&mut self, csp_nonce: String) -> askama::Result { let values: (&str, &dyn std::any::Any) = ("csp_nonce", &csp_nonce); self.render_with_values(&values) @@ -62,7 +62,7 @@ macro_rules! impl_axum_webpage { $( response.extensions_mut().insert({ - let cache_policy: fn(&$page) -> $crate::web::cache::CachePolicy = $cache_policy; + let cache_policy: fn(&$page) -> $crate::cache::CachePolicy = $cache_policy; (cache_policy)(&self) }); )? @@ -80,7 +80,7 @@ macro_rules! impl_axum_webpage { )? - response.extensions_mut().insert($crate::web::page::web_page::DelayedTemplateRender { + response.extensions_mut().insert($crate::page::web_page::DelayedTemplateRender { template: std::sync::Arc::new(Box::new(self)), cpu_intensive_rendering, }); diff --git a/src/web/routes.rs b/crates/bin/docs_rs_web/src/routes.rs similarity index 69% rename from src/web/routes.rs rename to crates/bin/docs_rs_web/src/routes.rs index 0c0e4cc73..d6ee259a8 100644 --- a/src/web/routes.rs +++ b/crates/bin/docs_rs_web/src/routes.rs @@ -1,5 +1,11 @@ -use crate::web::{ - cache::CachePolicy, error::AxumNope, metrics::request_recorder, statics::build_static_router, +use crate::{ + cache::CachePolicy, + error::AxumNope, + handlers::{ + build_details, builds, crate_details, features, releases, rustdoc, sitemap, source, + statics::build_static_router, status, + }, + metrics::request_recorder, }; use askama::Template; use axum::{ @@ -92,7 +98,7 @@ fn cached_permanent_redirect(uri: &str) -> impl IntoResponse { ) } -pub(super) fn build_axum_routes() -> AxumRouter { +pub(crate) fn build_axum_routes() -> AxumRouter { // hint for naming axum routes: // when routes overlap, the route parameters at the same position // have to use the same name: @@ -126,143 +132,125 @@ pub(super) fn build_axum_routes() -> AxumRouter { "/opensearch.xml", get_static(|| async { cached_permanent_redirect("/-/static/opensearch.xml") }), ) - .route_with_tsr( - "/sitemap.xml", - get_internal(super::sitemap::sitemapindex_handler), - ) + .route_with_tsr("/sitemap.xml", get_internal(sitemap::sitemapindex_handler)) .route_with_tsr( "/-/sitemap/{letter}/sitemap.xml", - get_internal(super::sitemap::sitemap_handler), - ) - .route_with_tsr( - "/about/builds", - get_internal(super::sitemap::about_builds_handler), - ) - .route_with_tsr("/about", get_internal(super::sitemap::about_handler)) - .route_with_tsr( - "/about/{subpage}", - get_internal(super::sitemap::about_handler), - ) - .route("/", get_internal(super::releases::home_page)) - .route_with_tsr( - "/releases", - get_internal(super::releases::recent_releases_handler), + get_internal(sitemap::sitemap_handler), ) + .route_with_tsr("/about/builds", get_internal(sitemap::about_builds_handler)) + .route_with_tsr("/about", get_internal(sitemap::about_handler)) + .route_with_tsr("/about/{subpage}", get_internal(sitemap::about_handler)) + .route("/", get_internal(releases::home_page)) + .route_with_tsr("/releases", get_internal(releases::recent_releases_handler)) .route_with_tsr( "/releases/recent/{page}", - get_internal(super::releases::recent_releases_handler), + get_internal(releases::recent_releases_handler), ) .route_with_tsr( "/releases/stars", - get_internal(super::releases::releases_by_stars_handler), + get_internal(releases::releases_by_stars_handler), ) .route_with_tsr( "/releases/stars/{page}", - get_internal(super::releases::releases_by_stars_handler), + get_internal(releases::releases_by_stars_handler), ) .route_with_tsr( "/releases/recent-failures", - get_internal(super::releases::releases_recent_failures_handler), + get_internal(releases::releases_recent_failures_handler), ) .route_with_tsr( "/releases/recent-failures/{page}", - get_internal(super::releases::releases_recent_failures_handler), + get_internal(releases::releases_recent_failures_handler), ) .route_with_tsr( "/releases/failures", - get_internal(super::releases::releases_failures_by_stars_handler), + get_internal(releases::releases_failures_by_stars_handler), ) .route_with_tsr( "/releases/failures/{page}", - get_internal(super::releases::releases_failures_by_stars_handler), + get_internal(releases::releases_failures_by_stars_handler), ) .route( "/crate/{name}", - get_internal(super::crate_details::crate_details_handler), + get_internal(crate_details::crate_details_handler), ) .route( "/crate/{name}/", - get_internal(super::crate_details::crate_details_handler), + get_internal(crate_details::crate_details_handler), ) .route_with_tsr( "/crate/{name}/{version}", - get_internal(super::crate_details::crate_details_handler), + get_internal(crate_details::crate_details_handler), ) .route_with_tsr( "/releases/feed", - get_internal(super::releases::releases_feed_handler), - ) - .route_with_tsr( - "/releases/{owner}", - get_internal(super::releases::owner_handler), + get_internal(releases::releases_feed_handler), ) + .route_with_tsr("/releases/{owner}", get_internal(releases::owner_handler)) .route_with_tsr( "/releases/{owner}/{page}", - get_internal(super::releases::owner_handler), + get_internal(releases::owner_handler), ) .route_with_tsr( "/releases/activity", - get_internal(super::releases::activity_handler), - ) - .route_with_tsr( - "/releases/search", - get_internal(super::releases::search_handler), + get_internal(releases::activity_handler), ) + .route_with_tsr("/releases/search", get_internal(releases::search_handler)) .route_with_tsr( "/releases/queue", - get_internal(super::releases::build_queue_handler), + get_internal(releases::build_queue_handler), ) .route_with_tsr( "/crate/{name}/{version}/builds", - get_internal(super::builds::build_list_handler), + get_internal(builds::build_list_handler), ) .route( "/crate/{name}/{version}/rebuild", - post_internal(super::builds::build_trigger_rebuild_handler), + post_internal(builds::build_trigger_rebuild_handler), ) .route( "/crate/{name}/{version}/status.json", - get_internal(super::status::status_handler), + get_internal(status::status_handler), ) .route_with_tsr( "/crate/{name}/{version}/builds/{id}", - get_internal(super::build_details::build_details_handler), + get_internal(build_details::build_details_handler), ) .route_with_tsr( "/crate/{name}/{version}/builds/{id}/{filename}", - get_internal(super::build_details::build_details_handler), + get_internal(build_details::build_details_handler), ) .route_with_tsr( "/crate/{name}/{version}/features", - get_internal(super::features::build_features_handler), + get_internal(features::build_features_handler), ) .route_with_tsr( "/crate/{name}/{version}/source/", - get_internal(super::source::source_browser_handler), + get_internal(source::source_browser_handler), ) .route( "/crate/{name}/{version}/source/{*path}", - get_internal(super::source::source_browser_handler), + get_internal(source::source_browser_handler), ) .route( "/crate/{name}/{version}/menus/platforms/{target}/", - get_internal(super::crate_details::get_all_platforms), + get_internal(crate_details::get_all_platforms), ) .route( "/crate/{name}/{version}/menus/platforms/{target}/{*path}", - get_internal(super::crate_details::get_all_platforms), + get_internal(crate_details::get_all_platforms), ) .route( "/crate/{name}/{version}/menus/platforms/", - get_internal(super::crate_details::get_all_platforms_root), + get_internal(crate_details::get_all_platforms_root), ) .route( "/crate/{name}/{version}/menus/releases/{*path}", - get_internal(super::crate_details::get_all_releases), + get_internal(crate_details::get_all_releases), ) .route( "/-/rustdoc.static/{*path}", - get_internal(super::rustdoc::static_asset_handler), + get_internal(rustdoc::static_asset_handler), ) .route( "/-/storage-change-detection.html", @@ -280,91 +268,82 @@ pub(super) fn build_axum_routes() -> AxumRouter { ) .route_with_tsr( "/crate/{name}/{version}/download", - get_internal(super::rustdoc::download_handler), + get_internal(rustdoc::download_handler), ) .route_with_tsr( "/crate/{name}/{version}/json.gz", - get_internal(super::rustdoc::json_download_handler), + get_internal(rustdoc::json_download_handler), ) .route_with_tsr( "/crate/{name}/{version}/json.zst", - get_internal(super::rustdoc::json_download_handler), + get_internal(rustdoc::json_download_handler), ) .route_with_tsr( "/crate/{name}/{version}/json", - get_internal(super::rustdoc::json_download_handler), + get_internal(rustdoc::json_download_handler), ) .route_with_tsr( "/crate/{name}/{version}/json/{format_version}", - get_internal(super::rustdoc::json_download_handler), + get_internal(rustdoc::json_download_handler), ) .route( "/crate/{name}/{version}/target-redirect/{*path}", - get_internal(super::rustdoc::target_redirect_handler), + get_internal(rustdoc::target_redirect_handler), ) .route_with_tsr( "/crate/{name}/{version}/{target}/json.gz", - get_internal(super::rustdoc::json_download_handler), + get_internal(rustdoc::json_download_handler), ) .route_with_tsr( "/crate/{name}/{version}/{target}/json.zst", - get_internal(super::rustdoc::json_download_handler), + get_internal(rustdoc::json_download_handler), ) .route_with_tsr( "/crate/{name}/{version}/{target}/json", - get_internal(super::rustdoc::json_download_handler), + get_internal(rustdoc::json_download_handler), ) .route_with_tsr( "/crate/{name}/{version}/{target}/json/{format_version}", - get_internal(super::rustdoc::json_download_handler), - ) - .route( - "/{name}/badge.svg", - get_internal(super::rustdoc::badge_handler), - ) - .route( - "/{name}", - get_rustdoc(super::rustdoc::rustdoc_redirector_handler), - ) - .route( - "/{name}/", - get_rustdoc(super::rustdoc::rustdoc_redirector_handler), + get_internal(rustdoc::json_download_handler), ) + .route("/{name}/badge.svg", get_internal(rustdoc::badge_handler)) + .route("/{name}", get_rustdoc(rustdoc::rustdoc_redirector_handler)) + .route("/{name}/", get_rustdoc(rustdoc::rustdoc_redirector_handler)) .route( "/{name}/{version}", - get_rustdoc(super::rustdoc::rustdoc_redirector_handler), + get_rustdoc(rustdoc::rustdoc_redirector_handler), ) .route( "/{name}/{version}/", - get_rustdoc(super::rustdoc::rustdoc_redirector_handler), + get_rustdoc(rustdoc::rustdoc_redirector_handler), ) .route( "/{name}/{version}/all.html", - get_rustdoc(super::rustdoc::rustdoc_html_server_handler), + get_rustdoc(rustdoc::rustdoc_html_server_handler), ) .route( "/{name}/{version}/help.html", - get_rustdoc(super::rustdoc::rustdoc_html_server_handler), + get_rustdoc(rustdoc::rustdoc_html_server_handler), ) .route( "/{name}/{version}/settings.html", - get_rustdoc(super::rustdoc::rustdoc_html_server_handler), + get_rustdoc(rustdoc::rustdoc_html_server_handler), ) .route( "/{name}/{version}/scrape-examples-help.html", - get_rustdoc(super::rustdoc::rustdoc_html_server_handler), + get_rustdoc(rustdoc::rustdoc_html_server_handler), ) .route( "/{name}/{version}/{target}", - get_rustdoc(super::rustdoc::rustdoc_redirector_handler), + get_rustdoc(rustdoc::rustdoc_redirector_handler), ) .route( "/{name}/{version}/{target}/", - get_rustdoc(super::rustdoc::rustdoc_html_server_handler), + get_rustdoc(rustdoc::rustdoc_html_server_handler), ) .route( "/{name}/{version}/{target}/{*path}", - get_rustdoc(super::rustdoc::rustdoc_html_server_handler), + get_rustdoc(rustdoc::rustdoc_html_server_handler), ) .fallback(fallback) } @@ -375,8 +354,8 @@ async fn fallback() -> impl IntoResponse { #[cfg(test)] mod tests { - use crate::test::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}; - use crate::web::cache::CachePolicy; + use crate::cache::CachePolicy; + use crate::testing::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}; use reqwest::StatusCode; #[test] @@ -434,7 +413,7 @@ mod tests { fn serve_rustdoc_content() { async_wrapper(|env| async move { let web = env.web_app().await; - let storage = env.async_storage(); + let storage = env.storage()?; storage .store_one("/rustdoc-static/style.css", "content".as_bytes()) .await?; diff --git a/src/test/mod.rs b/crates/bin/docs_rs_web/src/testing/axum_helpers.rs similarity index 68% rename from src/test/mod.rs rename to crates/bin/docs_rs_web/src/testing/axum_helpers.rs index b3a36dbef..da1ada6ea 100644 --- a/src/test/mod.rs +++ b/crates/bin/docs_rs_web/src/testing/axum_helpers.rs @@ -1,55 +1,18 @@ -pub(crate) mod headers; - -pub(crate) use docs_rs_test_fakes::{FakeBuild, fake_release_that_failed_before_build}; - -use crate::{ - Config, Context, - config::ConfigBuilder, - error::Result, - web::{build_axum_app, cache, page::TemplateData}, -}; -use anyhow::{Context as _, anyhow}; +use crate::{Config, cache}; +use anyhow::{Context as _, Result, anyhow}; use axum::body::Bytes; -use axum::{Router, body::Body, http::Request, response::Response as AxumResponse}; +use axum::{body::Body, http::Request, response::Response as AxumResponse}; use axum_extra::headers::{ETag, HeaderMapExt as _}; -use docs_rs_build_queue::AsyncBuildQueue; -use docs_rs_database::testing::TestDatabase; use docs_rs_headers::{IfNoneMatch, SURROGATE_CONTROL, SurrogateKeys}; -use docs_rs_opentelemetry::testing::{CollectedMetrics, TestMetrics}; -use docs_rs_storage::{AsyncStorage, StorageKind, testing::TestStorage}; -use docs_rs_test_fakes::FakeRelease; -use docs_rs_types::Version; -use fn_error_context::context; use http::{ HeaderMap, HeaderName, HeaderValue, StatusCode, header::{CACHE_CONTROL, CONTENT_TYPE}, }; use http_body_util::BodyExt; use serde::de::DeserializeOwned; -use std::{collections::HashMap, fs, future::Future, panic, rc::Rc, sync::Arc}; -use tokio::runtime; +use std::{collections::HashMap, panic}; use tower::ServiceExt; -// testing krate name constants -// some versions as constants for tests -pub(crate) const V0_1: Version = Version::new(0, 1, 0); -pub(crate) const V1: Version = Version::new(1, 0, 0); -pub(crate) const V2: Version = Version::new(2, 0, 0); -pub(crate) const V3: Version = Version::new(3, 0, 0); - -pub(crate) fn async_wrapper(f: F) -where - F: FnOnce(Rc) -> Fut, - Fut: Future>, -{ - let env = Rc::new( - TestEnvironment::with_config_and_runtime(TestEnvironment::base_config().build().unwrap()) - .unwrap(), - ); - - env.runtime().block_on(f(env.clone())).expect("test failed"); -} - pub(crate) fn assert_cache_headers_eq( response: &axum::response::Response, expected_headers: &cache::ResponseCacheHeaders, @@ -177,8 +140,12 @@ impl AxumRouterTestExt for axum::Router { response.redirect_target() ); } - assert!(status.is_success(), "failed to GET {path}: {status}"); - Ok(response) + if status.is_success() { + Ok(response) + } else { + let body = response.text().await?; + panic!("failed to GET {path}: {status}\n{body}"); + } } async fn assert_conditional_get( @@ -349,7 +316,6 @@ impl AxumRouterTestExt for axum::Router { Ok(response) } - #[context("expected redirect from {path} to {expected_target}")] async fn assert_redirect(&self, path: &str, expected_target: &str) -> Result { let redirect_response = self.assert_redirect_common(path, expected_target).await?; @@ -401,125 +367,3 @@ impl AxumRouterTestExt for axum::Router { Ok(redirect_response) } } - -pub(crate) struct TestEnvironment { - // NOTE: the database & storage have to come before the context, - // otherwise it can happen that we can't cleanup the test database - // because the tokio runtime from the context is gone. - db: TestDatabase, - _storage: TestStorage, - pub context: Context, - owned_runtime: Option>, - test_metrics: TestMetrics, -} - -pub(crate) fn init_logger() { - docs_rs_logging::testing::init(); -} - -impl TestEnvironment { - pub(crate) async fn new() -> Result { - Self::with_config(Self::base_config().build()?).await - } - - pub(crate) fn with_config_and_runtime(config: Config) -> Result { - let runtime = Arc::new( - runtime::Builder::new_multi_thread() - .enable_all() - .build() - .context("failed to initialize runtime")?, - ); - let mut env = runtime.block_on(Self::with_config(config))?; - env.owned_runtime = Some(runtime); - Ok(env) - } - - pub(crate) async fn with_config(config: Config) -> Result { - init_logger(); - - // create index directory - fs::create_dir_all(config.watcher.registry_index_path.clone())?; - - let test_metrics = TestMetrics::new(); - let test_db = TestDatabase::new(&config.database, test_metrics.provider()) - .await - .context("can't initialize test database")?; - - let test_storage = - TestStorage::from_config(config.storage.clone(), test_metrics.provider()) - .await - .context("can't initialize test storage")?; - - Ok(Self { - context: Context::from_test_config( - config, - test_metrics.provider().clone(), - test_db.pool().clone(), - test_storage.storage(), - ) - .await?, - db: test_db, - _storage: test_storage, - owned_runtime: None, - test_metrics, - }) - } - - pub(crate) fn base_config() -> ConfigBuilder { - Config::from_env() - .expect("can't load base config from environment") - .database( - docs_rs_database::Config::test_config() - .expect("can't load database config") - .into(), - ) - .storage( - docs_rs_storage::Config::test_config(StorageKind::Memory) - .expect("can't load storage config") - .into(), - ) - .builder( - docs_rs_builder::Config::test_config() - .expect("can't load builder config") - .into(), - ) - // set stale content serving so Cache::ForeverInCdn and Cache::ForeverInCdnAndStaleInBrowser - // are actually different. - .cache_control_stale_while_revalidate(Some(86400)) - } - - pub(crate) fn async_build_queue(&self) -> &AsyncBuildQueue { - &self.context.async_build_queue - } - - pub(crate) fn config(&self) -> &Config { - &self.context.config - } - - pub(crate) fn async_storage(&self) -> &AsyncStorage { - &self.context.async_storage - } - - pub(crate) fn runtime(&self) -> &runtime::Handle { - &self.context.runtime - } - - pub(crate) fn async_db(&self) -> &TestDatabase { - &self.db - } - - pub(crate) fn collected_metrics(&self) -> CollectedMetrics { - self.test_metrics.collected_metrics() - } - - pub(crate) async fn web_app(&self) -> Router { - let template_data = Arc::new(TemplateData::new(1).unwrap()); - build_axum_app(&self.context, template_data) - .await - .expect("could not build axum app") - } - - pub(crate) async fn fake_release(&self) -> FakeRelease<'_> { - FakeRelease::new(self.db.pool().clone(), self.context.async_storage.clone()) - } -} diff --git a/src/test/headers.rs b/crates/bin/docs_rs_web/src/testing/headers.rs similarity index 100% rename from src/test/headers.rs rename to crates/bin/docs_rs_web/src/testing/headers.rs diff --git a/crates/bin/docs_rs_web/src/testing/mod.rs b/crates/bin/docs_rs_web/src/testing/mod.rs new file mode 100644 index 000000000..b547cdccf --- /dev/null +++ b/crates/bin/docs_rs_web/src/testing/mod.rs @@ -0,0 +1,30 @@ +pub(crate) mod axum_helpers; +pub(crate) mod headers; +mod test_env; + +pub(crate) use axum_helpers::{AxumResponseTestExt, AxumRouterTestExt, assert_cache_headers_eq}; +pub(crate) use test_env::TestEnvironment; + +use std::rc::Rc; +use tokio::runtime; + +/// legacy async wrapper, too much `.expect`. +/// Use `tokio::test`. +pub(crate) fn async_wrapper(f: F) +where + F: FnOnce(Rc) -> Fut, + Fut: Future>, +{ + let runtime = runtime::Builder::new_multi_thread() + .enable_all() + .build() + .expect("failed to initialize runtime"); + + let env = Rc::new( + runtime + .block_on(TestEnvironment::new()) + .expect("failed to initialize test environment"), + ); + + runtime.block_on(f(env.clone())).expect("test failed"); +} diff --git a/crates/bin/docs_rs_web/src/testing/test_env.rs b/crates/bin/docs_rs_web/src/testing/test_env.rs new file mode 100644 index 000000000..725e884d2 --- /dev/null +++ b/crates/bin/docs_rs_web/src/testing/test_env.rs @@ -0,0 +1,123 @@ +use crate::{Config as WebConfig, handlers::build_axum_app, page::TemplateData}; +use anyhow::Result; +use axum::Router; +use bon::bon; +use docs_rs_build_queue::AsyncBuildQueue; +use docs_rs_context::Context; +use docs_rs_database::{AsyncPoolClient, Config as DatabaseConfig, testing::TestDatabase}; +use docs_rs_opentelemetry::testing::{CollectedMetrics, TestMetrics}; +use docs_rs_registry_api::RegistryApi; +use docs_rs_storage::{AsyncStorage, Config as StorageConfig, StorageKind, testing::TestStorage}; +use docs_rs_test_fakes::FakeRelease; +use std::sync::Arc; + +pub(crate) struct TestEnvironment { + pub(crate) context: Arc, + pub(crate) config: Arc, + // so we can allow asserting collected metrics later. + pub(crate) metrics: TestMetrics, + #[allow(dead_code)] // we need to keep the storage so it can be cleaned up. + pub(crate) storage: TestStorage, + #[allow(dead_code)] // we need to keep the storage so it can be cleaned up. + pub(crate) db: TestDatabase, +} + +#[bon] +impl TestEnvironment { + pub(crate) async fn new() -> Result { + // NOTE: compiler crashes when I change the return to + // `Self::builder().build().await + #[allow(clippy::needless_question_mark)] + Ok(Self::builder().build().await?) + } + + #[builder(finish_fn = build)] + pub(crate) async fn builder( + web_config: Option, + registry_api_config: Option, + storage_config: Option, + ) -> Result { + docs_rs_logging::testing::init(); + + let web_config = Arc::new(if let Some(web_config) = web_config { + web_config + } else { + WebConfig::test_config()? + }); + + let registry_api_config = + Arc::new(if let Some(registry_api_config) = registry_api_config { + registry_api_config + } else { + docs_rs_registry_api::Config::from_environment()? + }); + + let registry_api = RegistryApi::from_config(®istry_api_config)?; + + let metrics = TestMetrics::new(); + + let db_config = DatabaseConfig::test_config()?; + let db = TestDatabase::new(&db_config, metrics.provider()).await?; + + let storage_config = Arc::new(if let Some(storage_config) = storage_config { + storage_config + } else { + StorageConfig::test_config(StorageKind::Memory)? + }); + + let test_storage = + TestStorage::from_config(storage_config.clone(), metrics.provider()).await?; + + Ok(Self { + config: web_config, + context: Context::builder() + .with_runtime() + .await? + .meter_provider(metrics.provider().clone()) + .pool(db_config.into(), db.pool().clone()) + .storage(storage_config.clone(), test_storage.storage()) + .with_build_queue()? + .registry_api(registry_api_config, registry_api.into()) + .with_build_limits()? + .build()? + .into(), + db, + storage: test_storage, + metrics, + }) + } + + pub(crate) fn config(&self) -> &WebConfig { + &self.config + } + + pub(crate) fn build_queue(&self) -> Result<&Arc> { + self.context.build_queue() + } + + pub(crate) async fn async_conn(&self) -> Result { + self.context.pool()?.get_async().await.map_err(Into::into) + } + + pub(crate) fn storage(&self) -> Result<&Arc> { + self.context.storage() + } + + pub(crate) async fn web_app(&self) -> Router { + let template_data = Arc::new(TemplateData::new(1).unwrap()); + build_axum_app(self.config.clone(), self.context.clone(), template_data) + .await + .expect("could not build axum app") + } + + pub async fn fake_release(&self) -> FakeRelease<'_> { + FakeRelease::new( + self.context.pool().unwrap().clone(), + self.context.storage().unwrap().clone(), + ) + } + + pub fn collected_metrics(&self) -> CollectedMetrics { + self.metrics.collected_metrics() + } +} diff --git a/src/web/highlight.rs b/crates/bin/docs_rs_web/src/utils/highlight.rs similarity index 97% rename from src/web/highlight.rs rename to crates/bin/docs_rs_web/src/utils/highlight.rs index ffc2599ac..2705b9d9f 100644 --- a/src/web/highlight.rs +++ b/crates/bin/docs_rs_web/src/utils/highlight.rs @@ -1,4 +1,4 @@ -use crate::error::Result; +use anyhow::Result; use std::sync::LazyLock; use syntect::{ html::{ClassStyle, ClassedHTMLGenerator}, @@ -83,7 +83,7 @@ pub fn with_lang(lang: Option<&str>, code: &str, default: Option<&str>) -> Strin } else { error!(?err, "failed while highlighting code"); } - crate::web::page::templates::filters::escape_html_inner(code) + crate::page::templates::filters::escape_html_inner(code) .map(|s| s.to_string()) .unwrap_or_default() } diff --git a/src/utils/html.rs b/crates/bin/docs_rs_web/src/utils/html_rewrite.rs similarity index 91% rename from src/utils/html.rs rename to crates/bin/docs_rs_web/src/utils/html_rewrite.rs index f0da4f655..969d76b0e 100644 --- a/src/utils/html.rs +++ b/crates/bin/docs_rs_web/src/utils/html_rewrite.rs @@ -1,12 +1,9 @@ use crate::{ - utils::report_error, - web::{ - metrics::WebMetrics, - page::{ - TemplateData, - templates::{Body, Head, Vendored}, - }, - rustdoc::RustdocPage, + handlers::rustdoc::RustdocPage, + metrics::WebMetrics, + page::{ + TemplateData, + templates::{Body, Head, Vendored}, }, }; use anyhow::{Context as _, anyhow}; @@ -18,7 +15,7 @@ use lol_html::{element, errors::RewritingError}; use std::sync::Arc; use tokio::{io::AsyncRead, task::JoinHandle}; use tokio_util::io::ReaderStream; -use tracing::{Span, instrument}; +use tracing::{Span, error, instrument}; use tracing_futures::Instrument as _; const CHANNEL_SIZE: usize = 64; @@ -177,20 +174,17 @@ where let mut reader_stream = ReaderStream::new(&mut reader); while let Some(chunk) = reader_stream.next().await { - let chunk = chunk - .context("error while reading from rustdoc HTML reader") - .map_err(|err| { - report_error(&err); - RustdocRewritingError::Other(err) - })?; + let chunk = chunk.map_err(|err| { + error!(?err, "error while reading from rustdoc HTML reader"); + RustdocRewritingError::Other(err.into()) + })?; - if let Err(err) = input_sender - .send(Some(chunk)) - .await - .context("error when trying to send chunk to html rewriter thread") - { - report_error(&err); - yield Err(RustdocRewritingError::Other(err)); + if let Err(err) = input_sender.send(Some(chunk)).await { + error!( + ?err, + "error when trying to send chunk to html rewriter thread" + ); + yield Err(RustdocRewritingError::Other(err.into())); break; } @@ -199,13 +193,12 @@ where } } // This signals the renderer thread to finalize & exit. - if let Err(err) = input_sender - .send(None) - .await - .context("error when trying to send end signal to html rewriter thread") - { - report_error(&err); - yield Err(RustdocRewritingError::Other(err)); + if let Err(err) = input_sender.send(None).await { + error!( + ?err, + "error when trying to send end signal to html rewriter thread" + ); + yield Err(RustdocRewritingError::Other(err.into())); } while let Some(bytes) = result_receiver.recv().await { yield Ok(bytes); @@ -214,9 +207,8 @@ where join_handle .await .context("task join failed")? - .context("error while rewriting rustdoc HTML") .map_err(|e| { - report_error(&e); + error!(?e, "error while rewriting rustdoc HTML"); // our `render_in_threadpool` and so the async tokio task return an `anyhow::Result`. // In most cases this will be an error from the `HtmlRewriter`, which we'll get as a // `RewritingError` which we extract here again. The other cases remain an @@ -237,7 +229,8 @@ where #[cfg(test)] mod test { - use crate::test::{AxumResponseTestExt, AxumRouterTestExt, V1, async_wrapper}; + use crate::testing::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}; + use docs_rs_types::testing::V1; #[test] fn rewriting_only_injects_css_once() { diff --git a/src/web/licenses.rs b/crates/bin/docs_rs_web/src/utils/licenses.rs similarity index 100% rename from src/web/licenses.rs rename to crates/bin/docs_rs_web/src/utils/licenses.rs diff --git a/src/web/markdown.rs b/crates/bin/docs_rs_web/src/utils/markdown.rs similarity index 99% rename from src/web/markdown.rs rename to crates/bin/docs_rs_web/src/utils/markdown.rs index 79998b6c4..2e244a318 100644 --- a/src/web/markdown.rs +++ b/crates/bin/docs_rs_web/src/utils/markdown.rs @@ -1,4 +1,4 @@ -use crate::web::highlight; +use crate::utils::highlight; use comrak::{Options, adapters::SyntaxHighlighterAdapter, options}; use std::{borrow::Cow, collections::HashMap, fmt}; diff --git a/crates/bin/docs_rs_web/src/utils/mod.rs b/crates/bin/docs_rs_web/src/utils/mod.rs new file mode 100644 index 000000000..b7181d683 --- /dev/null +++ b/crates/bin/docs_rs_web/src/utils/mod.rs @@ -0,0 +1,71 @@ +pub(crate) mod highlight; +pub(crate) mod html_rewrite; +pub(crate) mod licenses; +pub(crate) mod markdown; + +use anyhow::Result; +use chrono::{DateTime, NaiveDate, Utc}; +use docs_rs_utils::rustc_version::parse_rustc_date; + +/// Picks the correct "rustdoc.css" static file depending on which rustdoc version was used to +/// generate this version of this crate. +pub(crate) fn get_correct_docsrs_style_file(version: &str) -> Result { + let date = parse_rustc_date(version)?; + // This is the date where https://github.com/rust-lang/rust/pull/144476 was merged. + if NaiveDate::from_ymd_opt(2025, 8, 20).unwrap() < date { + Ok("rustdoc-2025-08-20.css".to_owned()) + // This is the date where https://github.com/rust-lang/rust/pull/91356 was merged. + } else if NaiveDate::from_ymd_opt(2021, 12, 5).unwrap() < date { + // If this is the new rustdoc layout, we need the newer docs.rs CSS file. + Ok("rustdoc-2021-12-05.css".to_owned()) + } else { + // By default, we return the old docs.rs CSS file. + Ok("rustdoc.css".to_owned()) + } +} + +/// Converts Timespec to nice readable relative time string +pub(crate) fn duration_to_str(init: DateTime) -> String { + let now = Utc::now(); + let delta = now.signed_duration_since(init); + + let delta = ( + delta.num_days(), + delta.num_hours(), + delta.num_minutes(), + delta.num_seconds(), + ); + + match delta { + (days, ..) if days > 5 => format!("{}", init.format("%b %d, %Y")), + (days @ 2..=5, ..) => format!("{days} days ago"), + (1, ..) => "one day ago".to_string(), + + (_, hours, ..) if hours > 1 => format!("{hours} hours ago"), + (_, 1, ..) => "an hour ago".to_string(), + + (_, _, minutes, _) if minutes > 1 => format!("{minutes} minutes ago"), + (_, _, 1, _) => "one minute ago".to_string(), + + (_, _, _, seconds) if seconds > 0 => format!("{seconds} seconds ago"), + _ => "just now".to_string(), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_correct_docsrs_style_file() { + assert_eq!( + get_correct_docsrs_style_file("rustc 1.10.0-nightly (57ef01513 2016-05-23)").unwrap(), + "rustdoc.css" + ); + assert_eq!( + get_correct_docsrs_style_file("docsrs 0.2.0 (ba9ae23 2022-05-26)").unwrap(), + "rustdoc-2021-12-05.css" + ); + assert!(get_correct_docsrs_style_file("docsrs 0.2.0").is_err(),); + } +} diff --git a/static/FiraSans-LICENSE.txt b/crates/bin/docs_rs_web/static/FiraSans-LICENSE.txt similarity index 100% rename from static/FiraSans-LICENSE.txt rename to crates/bin/docs_rs_web/static/FiraSans-LICENSE.txt diff --git a/static/FiraSans-Medium.woff b/crates/bin/docs_rs_web/static/FiraSans-Medium.woff similarity index 100% rename from static/FiraSans-Medium.woff rename to crates/bin/docs_rs_web/static/FiraSans-Medium.woff diff --git a/static/FiraSans-Medium.woff2 b/crates/bin/docs_rs_web/static/FiraSans-Medium.woff2 similarity index 100% rename from static/FiraSans-Medium.woff2 rename to crates/bin/docs_rs_web/static/FiraSans-Medium.woff2 diff --git a/static/FiraSans-Regular.woff b/crates/bin/docs_rs_web/static/FiraSans-Regular.woff similarity index 100% rename from static/FiraSans-Regular.woff rename to crates/bin/docs_rs_web/static/FiraSans-Regular.woff diff --git a/static/FiraSans-Regular.woff2 b/crates/bin/docs_rs_web/static/FiraSans-Regular.woff2 similarity index 100% rename from static/FiraSans-Regular.woff2 rename to crates/bin/docs_rs_web/static/FiraSans-Regular.woff2 diff --git a/static/SourceCodePro-It.ttf.woff b/crates/bin/docs_rs_web/static/SourceCodePro-It.ttf.woff similarity index 100% rename from static/SourceCodePro-It.ttf.woff rename to crates/bin/docs_rs_web/static/SourceCodePro-It.ttf.woff diff --git a/static/SourceCodePro-It.ttf.woff2 b/crates/bin/docs_rs_web/static/SourceCodePro-It.ttf.woff2 similarity index 100% rename from static/SourceCodePro-It.ttf.woff2 rename to crates/bin/docs_rs_web/static/SourceCodePro-It.ttf.woff2 diff --git a/static/SourceCodePro-LICENSE.md b/crates/bin/docs_rs_web/static/SourceCodePro-LICENSE.md similarity index 100% rename from static/SourceCodePro-LICENSE.md rename to crates/bin/docs_rs_web/static/SourceCodePro-LICENSE.md diff --git a/static/SourceCodePro-Regular.ttf.woff b/crates/bin/docs_rs_web/static/SourceCodePro-Regular.ttf.woff similarity index 100% rename from static/SourceCodePro-Regular.ttf.woff rename to crates/bin/docs_rs_web/static/SourceCodePro-Regular.ttf.woff diff --git a/static/SourceCodePro-Regular.ttf.woff2 b/crates/bin/docs_rs_web/static/SourceCodePro-Regular.ttf.woff2 similarity index 100% rename from static/SourceCodePro-Regular.ttf.woff2 rename to crates/bin/docs_rs_web/static/SourceCodePro-Regular.ttf.woff2 diff --git a/static/SourceCodePro-Semibold.ttf.woff b/crates/bin/docs_rs_web/static/SourceCodePro-Semibold.ttf.woff similarity index 100% rename from static/SourceCodePro-Semibold.ttf.woff rename to crates/bin/docs_rs_web/static/SourceCodePro-Semibold.ttf.woff diff --git a/static/SourceCodePro-Semibold.ttf.woff2 b/crates/bin/docs_rs_web/static/SourceCodePro-Semibold.ttf.woff2 similarity index 100% rename from static/SourceCodePro-Semibold.ttf.woff2 rename to crates/bin/docs_rs_web/static/SourceCodePro-Semibold.ttf.woff2 diff --git a/static/SourceSerif4-Bold.ttf.woff b/crates/bin/docs_rs_web/static/SourceSerif4-Bold.ttf.woff similarity index 100% rename from static/SourceSerif4-Bold.ttf.woff rename to crates/bin/docs_rs_web/static/SourceSerif4-Bold.ttf.woff diff --git a/static/SourceSerif4-Bold.ttf.woff2 b/crates/bin/docs_rs_web/static/SourceSerif4-Bold.ttf.woff2 similarity index 100% rename from static/SourceSerif4-Bold.ttf.woff2 rename to crates/bin/docs_rs_web/static/SourceSerif4-Bold.ttf.woff2 diff --git a/static/SourceSerif4-It.ttf.woff b/crates/bin/docs_rs_web/static/SourceSerif4-It.ttf.woff similarity index 100% rename from static/SourceSerif4-It.ttf.woff rename to crates/bin/docs_rs_web/static/SourceSerif4-It.ttf.woff diff --git a/static/SourceSerif4-It.ttf.woff2 b/crates/bin/docs_rs_web/static/SourceSerif4-It.ttf.woff2 similarity index 100% rename from static/SourceSerif4-It.ttf.woff2 rename to crates/bin/docs_rs_web/static/SourceSerif4-It.ttf.woff2 diff --git a/static/SourceSerif4-LICENSE.md b/crates/bin/docs_rs_web/static/SourceSerif4-LICENSE.md similarity index 100% rename from static/SourceSerif4-LICENSE.md rename to crates/bin/docs_rs_web/static/SourceSerif4-LICENSE.md diff --git a/static/SourceSerif4-Regular.ttf.woff b/crates/bin/docs_rs_web/static/SourceSerif4-Regular.ttf.woff similarity index 100% rename from static/SourceSerif4-Regular.ttf.woff rename to crates/bin/docs_rs_web/static/SourceSerif4-Regular.ttf.woff diff --git a/static/SourceSerif4-Regular.ttf.woff2 b/crates/bin/docs_rs_web/static/SourceSerif4-Regular.ttf.woff2 similarity index 100% rename from static/SourceSerif4-Regular.ttf.woff2 rename to crates/bin/docs_rs_web/static/SourceSerif4-Regular.ttf.woff2 diff --git a/static/ayu-highlight.css b/crates/bin/docs_rs_web/static/ayu-highlight.css similarity index 100% rename from static/ayu-highlight.css rename to crates/bin/docs_rs_web/static/ayu-highlight.css diff --git a/static/clipboard.svg b/crates/bin/docs_rs_web/static/clipboard.svg similarity index 100% rename from static/clipboard.svg rename to crates/bin/docs_rs_web/static/clipboard.svg diff --git a/static/fa-brands-400.ttf b/crates/bin/docs_rs_web/static/fa-brands-400.ttf similarity index 100% rename from static/fa-brands-400.ttf rename to crates/bin/docs_rs_web/static/fa-brands-400.ttf diff --git a/static/fa-brands-400.woff2 b/crates/bin/docs_rs_web/static/fa-brands-400.woff2 similarity index 100% rename from static/fa-brands-400.woff2 rename to crates/bin/docs_rs_web/static/fa-brands-400.woff2 diff --git a/static/fa-regular-400.ttf b/crates/bin/docs_rs_web/static/fa-regular-400.ttf similarity index 100% rename from static/fa-regular-400.ttf rename to crates/bin/docs_rs_web/static/fa-regular-400.ttf diff --git a/static/fa-regular-400.woff2 b/crates/bin/docs_rs_web/static/fa-regular-400.woff2 similarity index 100% rename from static/fa-regular-400.woff2 rename to crates/bin/docs_rs_web/static/fa-regular-400.woff2 diff --git a/static/fa-solid-900.ttf b/crates/bin/docs_rs_web/static/fa-solid-900.ttf similarity index 100% rename from static/fa-solid-900.ttf rename to crates/bin/docs_rs_web/static/fa-solid-900.ttf diff --git a/static/fa-solid-900.woff2 b/crates/bin/docs_rs_web/static/fa-solid-900.woff2 similarity index 100% rename from static/fa-solid-900.woff2 rename to crates/bin/docs_rs_web/static/fa-solid-900.woff2 diff --git a/static/fa-v4compatibility.ttf b/crates/bin/docs_rs_web/static/fa-v4compatibility.ttf similarity index 100% rename from static/fa-v4compatibility.ttf rename to crates/bin/docs_rs_web/static/fa-v4compatibility.ttf diff --git a/static/fa-v4compatibility.woff2 b/crates/bin/docs_rs_web/static/fa-v4compatibility.woff2 similarity index 100% rename from static/fa-v4compatibility.woff2 rename to crates/bin/docs_rs_web/static/fa-v4compatibility.woff2 diff --git a/static/favicon.ico b/crates/bin/docs_rs_web/static/favicon.ico similarity index 100% rename from static/favicon.ico rename to crates/bin/docs_rs_web/static/favicon.ico diff --git a/static/font-awesome.css b/crates/bin/docs_rs_web/static/font-awesome.css similarity index 100% rename from static/font-awesome.css rename to crates/bin/docs_rs_web/static/font-awesome.css diff --git a/static/index.js b/crates/bin/docs_rs_web/static/index.js similarity index 100% rename from static/index.js rename to crates/bin/docs_rs_web/static/index.js diff --git a/static/keyboard.js b/crates/bin/docs_rs_web/static/keyboard.js similarity index 100% rename from static/keyboard.js rename to crates/bin/docs_rs_web/static/keyboard.js diff --git a/static/menu.js b/crates/bin/docs_rs_web/static/menu.js similarity index 100% rename from static/menu.js rename to crates/bin/docs_rs_web/static/menu.js diff --git a/static/opensearch.xml b/crates/bin/docs_rs_web/static/opensearch.xml similarity index 100% rename from static/opensearch.xml rename to crates/bin/docs_rs_web/static/opensearch.xml diff --git a/static/robots.txt b/crates/bin/docs_rs_web/static/robots.txt similarity index 100% rename from static/robots.txt rename to crates/bin/docs_rs_web/static/robots.txt diff --git a/static/source.js b/crates/bin/docs_rs_web/static/source.js similarity index 100% rename from static/source.js rename to crates/bin/docs_rs_web/static/source.js diff --git a/static/trigger-rebuild.png b/crates/bin/docs_rs_web/static/trigger-rebuild.png similarity index 100% rename from static/trigger-rebuild.png rename to crates/bin/docs_rs_web/static/trigger-rebuild.png diff --git a/templates/about-base.html b/crates/bin/docs_rs_web/templates/about-base.html similarity index 100% rename from templates/about-base.html rename to crates/bin/docs_rs_web/templates/about-base.html diff --git a/templates/base.html b/crates/bin/docs_rs_web/templates/base.html similarity index 100% rename from templates/base.html rename to crates/bin/docs_rs_web/templates/base.html diff --git a/templates/core/Cargo.toml.example b/crates/bin/docs_rs_web/templates/core/Cargo.toml.example similarity index 100% rename from templates/core/Cargo.toml.example rename to crates/bin/docs_rs_web/templates/core/Cargo.toml.example diff --git a/templates/core/about/badges.html b/crates/bin/docs_rs_web/templates/core/about/badges.html similarity index 100% rename from templates/core/about/badges.html rename to crates/bin/docs_rs_web/templates/core/about/badges.html diff --git a/templates/core/about/builds.html b/crates/bin/docs_rs_web/templates/core/about/builds.html similarity index 100% rename from templates/core/about/builds.html rename to crates/bin/docs_rs_web/templates/core/about/builds.html diff --git a/templates/core/about/download.html b/crates/bin/docs_rs_web/templates/core/about/download.html similarity index 100% rename from templates/core/about/download.html rename to crates/bin/docs_rs_web/templates/core/about/download.html diff --git a/templates/core/about/index.html b/crates/bin/docs_rs_web/templates/core/about/index.html similarity index 100% rename from templates/core/about/index.html rename to crates/bin/docs_rs_web/templates/core/about/index.html diff --git a/templates/core/about/metadata.html b/crates/bin/docs_rs_web/templates/core/about/metadata.html similarity index 100% rename from templates/core/about/metadata.html rename to crates/bin/docs_rs_web/templates/core/about/metadata.html diff --git a/templates/core/about/redirections.html b/crates/bin/docs_rs_web/templates/core/about/redirections.html similarity index 100% rename from templates/core/about/redirections.html rename to crates/bin/docs_rs_web/templates/core/about/redirections.html diff --git a/templates/core/about/rustdoc-json.html b/crates/bin/docs_rs_web/templates/core/about/rustdoc-json.html similarity index 100% rename from templates/core/about/rustdoc-json.html rename to crates/bin/docs_rs_web/templates/core/about/rustdoc-json.html diff --git a/templates/core/home.html b/crates/bin/docs_rs_web/templates/core/home.html similarity index 100% rename from templates/core/home.html rename to crates/bin/docs_rs_web/templates/core/home.html diff --git a/templates/core/sitemap/_item.xml b/crates/bin/docs_rs_web/templates/core/sitemap/_item.xml similarity index 100% rename from templates/core/sitemap/_item.xml rename to crates/bin/docs_rs_web/templates/core/sitemap/_item.xml diff --git a/templates/core/sitemap/index.xml b/crates/bin/docs_rs_web/templates/core/sitemap/index.xml similarity index 100% rename from templates/core/sitemap/index.xml rename to crates/bin/docs_rs_web/templates/core/sitemap/index.xml diff --git a/templates/crate/build_details.html b/crates/bin/docs_rs_web/templates/crate/build_details.html similarity index 100% rename from templates/crate/build_details.html rename to crates/bin/docs_rs_web/templates/crate/build_details.html diff --git a/templates/crate/builds.html b/crates/bin/docs_rs_web/templates/crate/builds.html similarity index 100% rename from templates/crate/builds.html rename to crates/bin/docs_rs_web/templates/crate/builds.html diff --git a/templates/crate/details.html b/crates/bin/docs_rs_web/templates/crate/details.html similarity index 98% rename from templates/crate/details.html rename to crates/bin/docs_rs_web/templates/crate/details.html index 25e6f152c..555962e38 100644 --- a/templates/crate/details.html +++ b/crates/bin/docs_rs_web/templates/crate/details.html @@ -193,11 +193,11 @@ {# If there's a readme, display it #} {%- if let Some(readme) = readme -%} - {{ crate::web::markdown::render(readme)|safe }} + {{ crate::utils::markdown::render(readme)|safe }} {# If there's not a readme then attempt to display the long description #} {%- elif let Some(rustdoc) = rustdoc -%} - {{ crate::web::markdown::render_with_default(rustdoc, "rust")|safe }} + {{ crate::utils::markdown::render_with_default(rustdoc, "rust")|safe }} {%- endif -%} diff --git a/templates/crate/features.html b/crates/bin/docs_rs_web/templates/crate/features.html similarity index 100% rename from templates/crate/features.html rename to crates/bin/docs_rs_web/templates/crate/features.html diff --git a/templates/crate/source.html b/crates/bin/docs_rs_web/templates/crate/source.html similarity index 100% rename from templates/crate/source.html rename to crates/bin/docs_rs_web/templates/crate/source.html diff --git a/templates/error.html b/crates/bin/docs_rs_web/templates/error.html similarity index 100% rename from templates/error.html rename to crates/bin/docs_rs_web/templates/error.html diff --git a/templates/header/global_alert.html b/crates/bin/docs_rs_web/templates/header/global_alert.html similarity index 100% rename from templates/header/global_alert.html rename to crates/bin/docs_rs_web/templates/header/global_alert.html diff --git a/templates/header/package_navigation.html b/crates/bin/docs_rs_web/templates/header/package_navigation.html similarity index 100% rename from templates/header/package_navigation.html rename to crates/bin/docs_rs_web/templates/header/package_navigation.html diff --git a/templates/header/topbar.html b/crates/bin/docs_rs_web/templates/header/topbar.html similarity index 100% rename from templates/header/topbar.html rename to crates/bin/docs_rs_web/templates/header/topbar.html diff --git a/templates/header/topbar_begin.html b/crates/bin/docs_rs_web/templates/header/topbar_begin.html similarity index 100% rename from templates/header/topbar_begin.html rename to crates/bin/docs_rs_web/templates/header/topbar_begin.html diff --git a/templates/header/topbar_end.html b/crates/bin/docs_rs_web/templates/header/topbar_end.html similarity index 100% rename from templates/header/topbar_end.html rename to crates/bin/docs_rs_web/templates/header/topbar_end.html diff --git a/templates/macros.html b/crates/bin/docs_rs_web/templates/macros.html similarity index 100% rename from templates/macros.html rename to crates/bin/docs_rs_web/templates/macros.html diff --git a/templates/releases/activity.html b/crates/bin/docs_rs_web/templates/releases/activity.html similarity index 100% rename from templates/releases/activity.html rename to crates/bin/docs_rs_web/templates/releases/activity.html diff --git a/templates/releases/build_queue.html b/crates/bin/docs_rs_web/templates/releases/build_queue.html similarity index 100% rename from templates/releases/build_queue.html rename to crates/bin/docs_rs_web/templates/releases/build_queue.html diff --git a/templates/releases/feed.xml b/crates/bin/docs_rs_web/templates/releases/feed.xml similarity index 100% rename from templates/releases/feed.xml rename to crates/bin/docs_rs_web/templates/releases/feed.xml diff --git a/templates/releases/header.html b/crates/bin/docs_rs_web/templates/releases/header.html similarity index 100% rename from templates/releases/header.html rename to crates/bin/docs_rs_web/templates/releases/header.html diff --git a/templates/releases/releases.html b/crates/bin/docs_rs_web/templates/releases/releases.html similarity index 100% rename from templates/releases/releases.html rename to crates/bin/docs_rs_web/templates/releases/releases.html diff --git a/templates/releases/search_results.html b/crates/bin/docs_rs_web/templates/releases/search_results.html similarity index 100% rename from templates/releases/search_results.html rename to crates/bin/docs_rs_web/templates/releases/search_results.html diff --git a/templates/rustdoc/body.html b/crates/bin/docs_rs_web/templates/rustdoc/body.html similarity index 100% rename from templates/rustdoc/body.html rename to crates/bin/docs_rs_web/templates/rustdoc/body.html diff --git a/templates/rustdoc/head.html b/crates/bin/docs_rs_web/templates/rustdoc/head.html similarity index 100% rename from templates/rustdoc/head.html rename to crates/bin/docs_rs_web/templates/rustdoc/head.html diff --git a/templates/rustdoc/platforms.html b/crates/bin/docs_rs_web/templates/rustdoc/platforms.html similarity index 100% rename from templates/rustdoc/platforms.html rename to crates/bin/docs_rs_web/templates/rustdoc/platforms.html diff --git a/templates/rustdoc/releases.html b/crates/bin/docs_rs_web/templates/rustdoc/releases.html similarity index 100% rename from templates/rustdoc/releases.html rename to crates/bin/docs_rs_web/templates/rustdoc/releases.html diff --git a/templates/rustdoc/topbar.html b/crates/bin/docs_rs_web/templates/rustdoc/topbar.html similarity index 97% rename from templates/rustdoc/topbar.html rename to crates/bin/docs_rs_web/templates/rustdoc/topbar.html index 26e7c7345..8c9a168fa 100644 --- a/templates/rustdoc/topbar.html +++ b/crates/bin/docs_rs_web/templates/rustdoc/topbar.html @@ -47,11 +47,11 @@ {{- crate::icons::IconScaleUnbalancedFlip.render_solid(false, false, "") }} {%+ for item in parsed_licenses -%} {%- match item -%} - {%- when crate::web::licenses::LicenseSegment::Spdx(license) -%} + {%- when crate::utils::licenses::LicenseSegment::Spdx(license) -%} {{ license }} - {%- when crate::web::licenses::LicenseSegment::UnknownLicense(license) -%} + {%- when crate::utils::licenses::LicenseSegment::UnknownLicense(license) -%} {{ license }} - {%- when crate::web::licenses::LicenseSegment::GlueTokens(tokens) -%} + {%- when crate::utils::licenses::LicenseSegment::GlueTokens(tokens) -%} {{ tokens }} {%- endmatch -%} {%- endfor -%} diff --git a/templates/rustdoc/vendored.html b/crates/bin/docs_rs_web/templates/rustdoc/vendored.html similarity index 100% rename from templates/rustdoc/vendored.html rename to crates/bin/docs_rs_web/templates/rustdoc/vendored.html diff --git a/templates/storage-change-detection.html b/crates/bin/docs_rs_web/templates/storage-change-detection.html similarity index 100% rename from templates/storage-change-detection.html rename to crates/bin/docs_rs_web/templates/storage-change-detection.html diff --git a/templates/style/_navbar.scss b/crates/bin/docs_rs_web/templates/style/_navbar.scss similarity index 100% rename from templates/style/_navbar.scss rename to crates/bin/docs_rs_web/templates/style/_navbar.scss diff --git a/templates/style/_rustdoc-common.scss b/crates/bin/docs_rs_web/templates/style/_rustdoc-common.scss similarity index 100% rename from templates/style/_rustdoc-common.scss rename to crates/bin/docs_rs_web/templates/style/_rustdoc-common.scss diff --git a/templates/style/_syntax-themes.scss b/crates/bin/docs_rs_web/templates/style/_syntax-themes.scss similarity index 100% rename from templates/style/_syntax-themes.scss rename to crates/bin/docs_rs_web/templates/style/_syntax-themes.scss diff --git a/templates/style/_syntax.scss b/crates/bin/docs_rs_web/templates/style/_syntax.scss similarity index 100% rename from templates/style/_syntax.scss rename to crates/bin/docs_rs_web/templates/style/_syntax.scss diff --git a/templates/style/_themes.scss b/crates/bin/docs_rs_web/templates/style/_themes.scss similarity index 100% rename from templates/style/_themes.scss rename to crates/bin/docs_rs_web/templates/style/_themes.scss diff --git a/templates/style/_utils.scss b/crates/bin/docs_rs_web/templates/style/_utils.scss similarity index 100% rename from templates/style/_utils.scss rename to crates/bin/docs_rs_web/templates/style/_utils.scss diff --git a/templates/style/_vars.scss b/crates/bin/docs_rs_web/templates/style/_vars.scss similarity index 100% rename from templates/style/_vars.scss rename to crates/bin/docs_rs_web/templates/style/_vars.scss diff --git a/templates/style/rustdoc-2021-12-05.scss b/crates/bin/docs_rs_web/templates/style/rustdoc-2021-12-05.scss similarity index 100% rename from templates/style/rustdoc-2021-12-05.scss rename to crates/bin/docs_rs_web/templates/style/rustdoc-2021-12-05.scss diff --git a/templates/style/rustdoc-2025-08-20.scss b/crates/bin/docs_rs_web/templates/style/rustdoc-2025-08-20.scss similarity index 100% rename from templates/style/rustdoc-2025-08-20.scss rename to crates/bin/docs_rs_web/templates/style/rustdoc-2025-08-20.scss diff --git a/templates/style/rustdoc.scss b/crates/bin/docs_rs_web/templates/style/rustdoc.scss similarity index 100% rename from templates/style/rustdoc.scss rename to crates/bin/docs_rs_web/templates/style/rustdoc.scss diff --git a/templates/style/style.scss b/crates/bin/docs_rs_web/templates/style/style.scss similarity index 100% rename from templates/style/style.scss rename to crates/bin/docs_rs_web/templates/style/style.scss diff --git a/templates/theme.js b/crates/bin/docs_rs_web/templates/theme.js similarity index 100% rename from templates/theme.js rename to crates/bin/docs_rs_web/templates/theme.js diff --git a/vendor/chartjs/LICENSE b/crates/bin/docs_rs_web/vendor/chartjs/LICENSE similarity index 99% rename from vendor/chartjs/LICENSE rename to crates/bin/docs_rs_web/vendor/chartjs/LICENSE index 837673f68..29c941dcc 100644 --- a/vendor/chartjs/LICENSE +++ b/crates/bin/docs_rs_web/vendor/chartjs/LICENSE @@ -1,9 +1,9 @@ -The MIT License (MIT) - -Copyright (c) 2018 Chart.js Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The MIT License (MIT) + +Copyright (c) 2018 Chart.js Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/chartjs/chart.min.css b/crates/bin/docs_rs_web/vendor/chartjs/chart.min.css similarity index 100% rename from vendor/chartjs/chart.min.css rename to crates/bin/docs_rs_web/vendor/chartjs/chart.min.css diff --git a/vendor/chartjs/chart.min.js b/crates/bin/docs_rs_web/vendor/chartjs/chart.min.js similarity index 100% rename from vendor/chartjs/chart.min.js rename to crates/bin/docs_rs_web/vendor/chartjs/chart.min.js diff --git a/vendor/pure-css/LICENSE b/crates/bin/docs_rs_web/vendor/pure-css/LICENSE similarity index 100% rename from vendor/pure-css/LICENSE rename to crates/bin/docs_rs_web/vendor/pure-css/LICENSE diff --git a/vendor/pure-css/css/grids-responsive-min.css b/crates/bin/docs_rs_web/vendor/pure-css/css/grids-responsive-min.css similarity index 100% rename from vendor/pure-css/css/grids-responsive-min.css rename to crates/bin/docs_rs_web/vendor/pure-css/css/grids-responsive-min.css diff --git a/vendor/pure-css/css/pure-min.css b/crates/bin/docs_rs_web/vendor/pure-css/css/pure-min.css similarity index 100% rename from vendor/pure-css/css/pure-min.css rename to crates/bin/docs_rs_web/vendor/pure-css/css/pure-min.css diff --git a/crates/lib/docs_rs_context/.sqlx/query-4f81678f0d680c4be7215ef0667729e8518063e0ee4ecad5aa7e559e88b8e1cb.json b/crates/lib/docs_rs_context/.sqlx/query-4f81678f0d680c4be7215ef0667729e8518063e0ee4ecad5aa7e559e88b8e1cb.json new file mode 100644 index 000000000..a95b272dd --- /dev/null +++ b/crates/lib/docs_rs_context/.sqlx/query-4f81678f0d680c4be7215ef0667729e8518063e0ee4ecad5aa7e559e88b8e1cb.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT id FROM crates WHERE crates.name = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "4f81678f0d680c4be7215ef0667729e8518063e0ee4ecad5aa7e559e88b8e1cb" +} diff --git a/crates/lib/docs_rs_context/.sqlx/query-73ff86cdb5b9d0ab312493690d4108803ce04531d497d6dd8d67ad05a844eab3.json b/crates/lib/docs_rs_context/.sqlx/query-73ff86cdb5b9d0ab312493690d4108803ce04531d497d6dd8d67ad05a844eab3.json new file mode 100644 index 000000000..6f21daee0 --- /dev/null +++ b/crates/lib/docs_rs_context/.sqlx/query-73ff86cdb5b9d0ab312493690d4108803ce04531d497d6dd8d67ad05a844eab3.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO sandbox_overrides (\n crate_name, max_memory_bytes, max_targets, timeout_seconds\n )\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (crate_name) DO UPDATE\n SET\n max_memory_bytes = $2,\n max_targets = $3,\n timeout_seconds = $4\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Int8", + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "73ff86cdb5b9d0ab312493690d4108803ce04531d497d6dd8d67ad05a844eab3" +} diff --git a/crates/lib/docs_rs_context/.sqlx/query-a3920d6701d1a80f23562ee83682d82ff35a52eeaa93ed45a97adc5e559d3538.json b/crates/lib/docs_rs_context/.sqlx/query-a3920d6701d1a80f23562ee83682d82ff35a52eeaa93ed45a97adc5e559d3538.json new file mode 100644 index 000000000..87fe73890 --- /dev/null +++ b/crates/lib/docs_rs_context/.sqlx/query-a3920d6701d1a80f23562ee83682d82ff35a52eeaa93ed45a97adc5e559d3538.json @@ -0,0 +1,40 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM sandbox_overrides WHERE crate_name = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "crate_name", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "max_memory_bytes", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "timeout_seconds", + "type_info": "Int4" + }, + { + "ordinal": 3, + "name": "max_targets", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + true, + true, + true + ] + }, + "hash": "a3920d6701d1a80f23562ee83682d82ff35a52eeaa93ed45a97adc5e559d3538" +} diff --git a/crates/lib/docs_rs_context/.sqlx/query-de4ba149a561c4bb467bcea081bdedff233398cddf4996734a64536b6a8c6579.json b/crates/lib/docs_rs_context/.sqlx/query-de4ba149a561c4bb467bcea081bdedff233398cddf4996734a64536b6a8c6579.json new file mode 100644 index 000000000..945d619af --- /dev/null +++ b/crates/lib/docs_rs_context/.sqlx/query-de4ba149a561c4bb467bcea081bdedff233398cddf4996734a64536b6a8c6579.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM sandbox_overrides WHERE crate_name = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "de4ba149a561c4bb467bcea081bdedff233398cddf4996734a64536b6a8c6579" +} diff --git a/crates/lib/docs_rs_context/.sqlx/query-fe36361977b1d8857f1bbd4d1c30ef29516987d053d35a9afc0a09fee31cd1c8.json b/crates/lib/docs_rs_context/.sqlx/query-fe36361977b1d8857f1bbd4d1c30ef29516987d053d35a9afc0a09fee31cd1c8.json new file mode 100644 index 000000000..4223b877d --- /dev/null +++ b/crates/lib/docs_rs_context/.sqlx/query-fe36361977b1d8857f1bbd4d1c30ef29516987d053d35a9afc0a09fee31cd1c8.json @@ -0,0 +1,38 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n crate_name as \"crate_name: KrateName\",\n max_memory_bytes,\n timeout_seconds,\n max_targets\n FROM sandbox_overrides\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "crate_name: KrateName", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "max_memory_bytes", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "timeout_seconds", + "type_info": "Int4" + }, + { + "ordinal": 3, + "name": "max_targets", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + true, + true, + true + ] + }, + "hash": "fe36361977b1d8857f1bbd4d1c30ef29516987d053d35a9afc0a09fee31cd1c8" +} diff --git a/crates/lib/docs_rs_context/Cargo.toml b/crates/lib/docs_rs_context/Cargo.toml index 19ee32a38..4460fca93 100644 --- a/crates/lib/docs_rs_context/Cargo.toml +++ b/crates/lib/docs_rs_context/Cargo.toml @@ -6,6 +6,7 @@ edition = "2024" [dependencies] anyhow = { workspace = true } bon = { workspace = true } +docs_rs_build_limits = { path = "../docs_rs_build_limits" } docs_rs_build_queue = { path = "../docs_rs_build_queue" } docs_rs_database = { path = "../docs_rs_database" } docs_rs_fastly = { path = "../docs_rs_fastly" } @@ -14,3 +15,6 @@ docs_rs_registry_api = { path = "../docs_rs_registry_api" } docs_rs_repository_stats = { path = "../docs_rs_repository_stats" } docs_rs_storage = { path = "../docs_rs_storage" } tokio = { workspace = true } + +[features] +testing = [] diff --git a/crates/lib/docs_rs_context/src/config.rs b/crates/lib/docs_rs_context/src/config.rs index 9d76d120a..84c32d9d9 100644 --- a/crates/lib/docs_rs_context/src/config.rs +++ b/crates/lib/docs_rs_context/src/config.rs @@ -9,6 +9,7 @@ pub struct Config { pub registry_api: Option>, pub cdn: Option>, pub repository_stats: Option>, + pub build_limits: Option>, } impl Config { @@ -52,6 +53,14 @@ impl Config { } } + pub fn build_limits(&self) -> Result<&Arc> { + if let Some(ref build_limits) = self.build_limits { + Ok(build_limits) + } else { + Err(anyhow!("build limits config is missing")) + } + } + pub fn repository_stats(&self) -> Result<&Arc> { if let Some(ref repository_stats) = self.repository_stats { Ok(repository_stats) diff --git a/crates/lib/docs_rs_context/src/context.rs b/crates/lib/docs_rs_context/src/context.rs index 45435a5ef..b02e93396 100644 --- a/crates/lib/docs_rs_context/src/context.rs +++ b/crates/lib/docs_rs_context/src/context.rs @@ -12,20 +12,19 @@ use tokio::runtime; #[derive(bon::Builder)] #[builder( - start_fn(name = builder_internal, vis = "",), finish_fn(name = build_internal, vis = "",), on(_, into) )] pub struct Context { - #[builder(start_fn)] + #[builder(field)] + pub config: Config, + + #[builder(getter)] pub runtime: runtime::Handle, - #[builder(start_fn)] + #[builder(getter)] pub meter_provider: AnyMeterProvider, - #[builder(field)] - pub config: Config, - #[builder(getter, setters(vis = "", name = pool_internal))] pub pool: Option, @@ -49,25 +48,9 @@ pub struct Context { pub repository_stats: Option>, } -// builder -impl Context { - pub async fn builder() -> Result { - // this method is async to make it clear to the caller that - // it needs the runtime context. - Context::builder_with_runtime(runtime::Handle::try_current()?) - } - - pub fn builder_with_runtime(runtime: runtime::Handle) -> Result { - Ok(Context::builder_internal( - runtime, - get_meter_provider(&docs_rs_opentelemetry::Config::from_environment()?)?, - )) - } -} - use context_builder::{ IsComplete, IsSet, IsUnset, SetBlockingBuildQueue, SetBlockingStorage, SetBuildQueue, SetCdn, - SetPool, SetRegistryApi, SetRepositoryStats, SetStorage, State, + SetMeterProvider, SetPool, SetRegistryApi, SetRepositoryStats, SetRuntime, SetStorage, State, }; impl ContextBuilder { @@ -111,8 +94,20 @@ impl ContextBuilder { Ok(ctx) } - fn meter_provider(&self) -> &AnyMeterProvider { - &self.meter_provider + pub async fn with_runtime(self) -> Result>> + where + S::Runtime: IsUnset, + { + Ok(self.runtime(runtime::Handle::try_current()?)) + } + + pub fn with_meter_provider(self) -> Result>> + where + S::MeterProvider: IsUnset, + { + Ok(self.meter_provider(get_meter_provider( + &docs_rs_opentelemetry::Config::from_environment()?, + )?)) } pub fn pool( @@ -129,10 +124,11 @@ impl ContextBuilder { pub async fn with_pool(self) -> Result>> where + S::MeterProvider: IsSet, S::Pool: IsUnset, { let config = Arc::new(docs_rs_database::Config::from_environment()?); - let pool = Pool::new(&config, self.meter_provider()).await?; + let pool = Pool::new(&config, self.get_meter_provider()).await?; Ok(self.pool(config, pool)) } @@ -142,22 +138,25 @@ impl ContextBuilder { storage: Arc, ) -> ContextBuilder>> where + S::Runtime: IsSet, S::Storage: IsUnset, S::BlockingStorage: IsUnset, { self.config.storage = Some(config); - let blocking_storage = Arc::new(Storage::new(storage.clone(), self.runtime.clone())); + let blocking_storage = Arc::new(Storage::new(storage.clone(), self.get_runtime().clone())); self.storage_internal(storage.clone()) .blocking_storage_internal(blocking_storage) } pub async fn with_storage(self) -> Result>>> where + S::Runtime: IsSet, + S::MeterProvider: IsSet, S::Storage: IsUnset, S::BlockingStorage: IsUnset, { let config = Arc::new(docs_rs_storage::Config::from_environment()?); - let storage = Arc::new(AsyncStorage::new(config.clone(), self.meter_provider()).await?); + let storage = Arc::new(AsyncStorage::new(config.clone(), self.get_meter_provider()).await?); Ok(self.storage(config, storage)) } @@ -173,14 +172,18 @@ impl ContextBuilder { self.maybe_cdn_internal(cdn) } - pub async fn with_cdn(self) -> Result>> + pub fn with_cdn(self) -> Result>> where + S::MeterProvider: IsSet, S::Cdn: IsUnset, { let config = Arc::new(docs_rs_fastly::Config::from_environment()?); let cdn = if config.is_valid() { - Some(Arc::new(Cdn::from_config(&config, self.meter_provider())?)) + Some(Arc::new(Cdn::from_config( + &config, + self.get_meter_provider(), + )?)) } else { None }; @@ -194,19 +197,20 @@ impl ContextBuilder { build_queue: Arc, ) -> ContextBuilder>> where + S::Runtime: IsSet, S::BuildQueue: IsUnset, S::BlockingBuildQueue: IsUnset, { self.config.build_queue = Some(config); - let blocking_build_queue = BuildQueue::new(self.runtime.clone(), build_queue.clone()); + let blocking_build_queue = BuildQueue::new(self.get_runtime().clone(), build_queue.clone()); self.build_queue_internal(build_queue.clone()) .blocking_build_queue_internal(Arc::new(blocking_build_queue)) } - pub async fn with_build_queue( - self, - ) -> Result>>> + pub fn with_build_queue(self) -> Result>>> where + S::Runtime: IsSet, + S::MeterProvider: IsSet, S::Pool: IsSet, S::BuildQueue: IsUnset, S::BlockingBuildQueue: IsUnset, @@ -217,7 +221,7 @@ impl ContextBuilder { let build_queue = Arc::new(AsyncBuildQueue::new( pool.clone(), config.clone(), - self.meter_provider(), + self.get_meter_provider(), )); Ok(self.build_queue(config, build_queue)) @@ -235,7 +239,7 @@ impl ContextBuilder { self.registry_api_internal(registry_api) } - pub async fn with_registry_api(self) -> Result>> + pub fn with_registry_api(self) -> Result>> where S::RegistryApi: IsUnset, { @@ -257,7 +261,7 @@ impl ContextBuilder { self.repository_stats_internal(repository_stats) } - pub async fn with_repository_stats(self) -> Result>> + pub fn with_repository_stats(self) -> Result>> where S::Pool: IsSet, S::RepositoryStats: IsUnset, @@ -269,6 +273,16 @@ impl ContextBuilder { Ok(self.repository_stats(config, updater.into())) } + + pub fn build_limits(mut self, config: Arc) -> ContextBuilder { + self.config.build_limits = Some(config); + self + } + + pub fn with_build_limits(self) -> Result> { + let config = docs_rs_build_limits::Config::from_environment()?; + Ok(self.build_limits(config.into())) + } } // accessors diff --git a/crates/lib/docs_rs_registry_api/Cargo.toml b/crates/lib/docs_rs_registry_api/Cargo.toml index fe117ac2e..eb137fa54 100644 --- a/crates/lib/docs_rs_registry_api/Cargo.toml +++ b/crates/lib/docs_rs_registry_api/Cargo.toml @@ -5,6 +5,7 @@ edition = "2024" [dependencies] anyhow = { workspace = true } +bon = { workspace = true } chrono = { workspace = true } docs_rs_env_vars = { path = "../docs_rs_env_vars" } docs_rs_types = { path = "../docs_rs_types" } diff --git a/crates/lib/docs_rs_registry_api/src/config.rs b/crates/lib/docs_rs_registry_api/src/config.rs index c93d22ba4..1044eed03 100644 --- a/crates/lib/docs_rs_registry_api/src/config.rs +++ b/crates/lib/docs_rs_registry_api/src/config.rs @@ -1,35 +1,22 @@ +use anyhow::Result; use docs_rs_env_vars::maybe_env; use url::Url; -#[derive(Debug)] +#[derive(Debug, bon::Builder)] pub struct Config { + #[builder(default = "https://crates.io".parse().unwrap())] pub registry_api_host: Url, // amount of retries for external API calls, mostly crates.io + #[builder(default = 3)] pub crates_io_api_call_retries: u32, } -impl Default for Config { - fn default() -> Self { - Self { - crates_io_api_call_retries: 3, - registry_api_host: "https://crates.io".parse().unwrap(), - } - } -} - impl Config { - pub fn from_environment() -> anyhow::Result { - let mut config = Self::default(); - - if let Some(api_call_retries) = maybe_env::("DOCSRS_CRATESIO_API_CALL_RETRIES")? { - config.crates_io_api_call_retries = api_call_retries; - } - - if let Some(registry_api_host) = maybe_env::("DOCSRS_REGISTRY_API_HOST")? { - config.registry_api_host = registry_api_host; - } - - Ok(config) + pub fn from_environment() -> Result { + Ok(Self::builder() + .maybe_crates_io_api_call_retries(maybe_env("DOCSRS_CRATESIO_API_CALL_RETRIES")?) + .maybe_registry_api_host(maybe_env("DOCSRS_REGISTRY_API_HOST")?) + .build()) } } diff --git a/dockerfiles/Dockerfile b/dockerfiles/Dockerfile index c0b9ae773..de68beadb 100644 --- a/dockerfiles/Dockerfile +++ b/dockerfiles/Dockerfile @@ -97,12 +97,20 @@ RUN apt-get update \ WORKDIR /srv/docsrs -ENTRYPOINT ["/usr/bin/tini", "/usr/local/bin/cratesfyi", "--"] -CMD ["start-web-server", "0.0.0.0:3000"] +# copy the new binary, will also be used as default entrypoint. +COPY --from=build /artifacts/docs_rs_web /usr/local/bin/ + +# also copy the old legacy binary, so we can fall back to using it +# by just overwriting the entrypoint & CMD when running this container. +COPY --from=build /artifacts/cratesfyi /usr/local/bin/ + +# copy necessary assets +COPY crates/bin/docs_rs_web/static /srv/docsrs/static +COPY crates/bin/docs_rs_web/vendor /srv/docsrs/vendor + +ENTRYPOINT ["/usr/bin/tini"] +CMD ["/usr/local/bin/docs_rs_web", "--", "0.0.0.0:3000"] -COPY --from=build /artifacts/cratesfyi /usr/local/bin -COPY static /srv/docsrs/static -COPY vendor /srv/docsrs/vendor ######################## # Build server stage # diff --git a/eslint.config.js b/eslint.config.js index 79ad431d7..ee4e4829a 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -15,10 +15,13 @@ export default [ "comma-dangle": ["error", "always-multiline"], "comma-style": ["error", "last"], "eol-last": ["error", "always"], - "eqeqeq": "error", + eqeqeq: "error", "func-call-spacing": ["error", "never"], "guard-for-in": "error", - "key-spacing": ["error", { beforeColon: false, afterColon: true, mode: "strict" }], + "key-spacing": [ + "error", + { beforeColon: false, afterColon: true, mode: "strict" }, + ], "keyword-spacing": ["error", { before: true, after: true }], "linebreak-style": ["error", "unix"], "max-len": ["error", { code: 100, tabWidth: 4 }], @@ -48,19 +51,25 @@ export default [ "no-sequences": "error", "no-template-curly-in-string": "error", "no-trailing-spaces": "error", - "no-unused-vars": ["error", { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }], + "no-unused-vars": [ + "error", + { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }, + ], "no-var": ["error"], "prefer-arrow-callback": ["error"], "prefer-const": ["error"], - "quotes": ["error", "double"], - "semi": ["error", "always"], + quotes: ["error", "double"], + semi: ["error", "always"], "space-before-blocks": "error", "space-before-function-paren": ["error", "never"], "space-infix-ops": "error", }, }, { - files: ["static/**/*", "templates/**/*"], + files: [ + "crates/bin/docs_rs_web/static/**/*", + "crates/bin/docs_rs_web/templates/**/*", + ], languageOptions: { globals: globals.browser, }, diff --git a/justfiles/testing.just b/justfiles/testing.just index 195cbb680..7d83bf8e1 100644 --- a/justfiles/testing.just +++ b/justfiles/testing.just @@ -122,7 +122,12 @@ lint-dependencies udeps="false": [group('testing')] lint-js *args: - deno run -A npm:eslint@9 static templates gui-tests eslint.config.js {{ args }} + deno run -A npm:eslint@9 \ + crates/bin/docs_rs_web/static \ + crates/bin/docs_rs_web/templates \ + eslint.config.js \ + gui-tests \ + {{ args }} [group('testing')] run-gui-tests: _ensure_db_and_s3_are_running cli-db-migrate compose-up-web diff --git a/src/bin/cratesfyi.rs b/src/bin/cratesfyi.rs index 84db48801..73a4bf489 100644 --- a/src/bin/cratesfyi.rs +++ b/src/bin/cratesfyi.rs @@ -1,7 +1,7 @@ use anyhow::{Context as _, Result}; use chrono::NaiveDate; use clap::{Parser, Subcommand, ValueEnum}; -use docs_rs::{Config, Context, start_web_server}; +use docs_rs::{Config, Context}; use docs_rs_build_limits::Overrides; use docs_rs_build_queue::priority::{ get_crate_pattern_and_priority, list_crate_priorities, remove_crate_priority, @@ -16,6 +16,7 @@ use docs_rs_database::{ use docs_rs_storage::add_path_into_database; use docs_rs_types::{CrateId, KrateName, Version}; use docs_rs_watcher::{queue_rebuilds_faulty_rustdoc, start_background_service_metric_collector}; +use docs_rs_web::run_web_server; use futures_util::StreamExt; use std::{env, fmt::Write, net::SocketAddr, path::PathBuf, sync::Arc}; use tokio::runtime; @@ -146,7 +147,11 @@ impl CommandLine { } Self::StartWebServer { socket_addr } => { // Blocks indefinitely - start_web_server(Some(socket_addr), &ctx)?; + ctx.runtime.block_on(run_web_server( + Some(socket_addr), + ctx.config.web.clone(), + new_context, + ))?; } Self::Daemon { registry_watcher } => { docs_rs::utils::start_daemon(ctx, registry_watcher == Toggle::Enabled)?; @@ -441,7 +446,7 @@ impl DatabaseSubcommand { ctx.runtime .block_on(add_path_into_database( &ctx.async_storage, - &ctx.config.prefix, + &ctx.config.builder.prefix, directory, )) .context("Failed to add directory into database")?; diff --git a/src/config.rs b/src/config.rs index 6e62c953c..b747b5396 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,49 +1,10 @@ -use anyhow::{Context as _, Result, bail}; +use anyhow::{Context as _, Result}; use docs_rs_context::Config as NewConfig; -use docs_rs_env_vars::{env, maybe_env, require_env}; -use std::{path::PathBuf, sync::Arc, time::Duration}; +use std::sync::Arc; #[derive(Debug, derive_builder::Builder)] #[builder(pattern = "owned")] pub struct Config { - pub prefix: PathBuf, - - // Access token for APIs for crates.io (careful: use - // constant_time_eq for comparisons!) - pub(crate) cratesio_token: Option, - - // request timeout in seconds - pub(crate) request_timeout: Option, - pub(crate) report_request_timeouts: bool, - - // The most memory that can be used to parse an HTML file - pub(crate) max_parse_memory: usize, - - /// amount of threads for CPU intensive rendering - pub(crate) render_threads: usize, - - // random crate search generates a number of random IDs to - // efficiently find a random crate with > 100 GH stars. - // The amount depends on the ratio of crates with >100 stars - // to the count of all crates. - // At the time of creating this setting, it is set to - // `500` for a ratio of 7249 over 54k crates. - // For unit-tests the number has to be higher. - pub(crate) random_crate_search_view_size: u32, - - // Content Security Policy - pub(crate) csp_report_only: bool, - - // Cache-Control header, for versioned URLs. - // If both are absent, don't generate the header. If only one is present, - // generate just that directive. Values are in seconds. - pub(crate) cache_control_stale_while_revalidate: Option, - - // Activate full page caching. - // When disabled, we still cache static assets. - // This only affects pages that depend on invalidations to work. - pub(crate) cache_invalidatable_responses: bool, - pub(crate) fastly: Arc, pub(crate) opentelemetry: Arc, pub(crate) registry_api: Arc, @@ -54,6 +15,7 @@ pub struct Config { pub(crate) build_limits: Arc, pub builder: Arc, pub watcher: Arc, + pub web: Arc, } impl From<&Config> for NewConfig { @@ -65,48 +27,14 @@ impl From<&Config> for NewConfig { registry_api: Some(value.registry_api.clone()), cdn: value.fastly.is_valid().then(|| value.fastly.clone()), repository_stats: Some(value.repository_stats.clone()), + build_limits: Some(value.build_limits.clone()), } } } impl Config { pub fn from_env() -> Result { - let old_vars = [ - ("CRATESFYI_PREFIX", "DOCSRS_PREFIX"), - ("CRATESFYI_DATABASE_URL", "DOCSRS_DATABASE_URL"), - ("CRATESFYI_GITHUB_ACCESSTOKEN", "DOCSRS_GITHUB_ACCESSTOKEN"), - ("CRATESFYI_RUSTWIDE_WORKSPACE", "DOCSRS_RUSTWIDE_WORKSPACE"), - ("DOCS_RS_DOCKER", "DOCSRS_DOCKER"), - ("DOCS_RS_LOCAL_DOCKER_IMAGE", "DOCSRS_DOCKER_IMAGE"), - ("DOCS_RS_BUILD_CPU_LIMIT", "DOCSRS_BUILD_CPU_LIMIT"), - ]; - for (old_var, new_var) in old_vars { - if std::env::var(old_var).is_ok() { - bail!( - "env variable {} is no longer accepted; use {} instead", - old_var, - new_var - ); - } - } - - let prefix: PathBuf = require_env("DOCSRS_PREFIX")?; - Ok(ConfigBuilder::default() - .prefix(prefix.clone()) - .cratesio_token(maybe_env("DOCSRS_CRATESIO_TOKEN")?) - // LOL HTML only uses as much memory as the size of the start tag! - // https://github.com/rust-lang/docs.rs/pull/930#issuecomment-667729380 - .max_parse_memory(env("DOCSRS_MAX_PARSE_MEMORY", 5 * 1024 * 1024)?) - .render_threads(env("DOCSRS_RENDER_THREADS", num_cpus::get())?) - .request_timeout(maybe_env::("DOCSRS_REQUEST_TIMEOUT")?.map(Duration::from_secs)) - .report_request_timeouts(env("DOCSRS_REPORT_REQUEST_TIMEOUTS", false)?) - .random_crate_search_view_size(env("DOCSRS_RANDOM_CRATE_SEARCH_VIEW_SIZE", 500)?) - .csp_report_only(env("DOCSRS_CSP_REPORT_ONLY", false)?) - .cache_control_stale_while_revalidate(maybe_env( - "CACHE_CONTROL_STALE_WHILE_REVALIDATE", - )?) - .cache_invalidatable_responses(env("DOCSRS_CACHE_INVALIDATEABLE_RESPONSES", true)?) .fastly(Arc::new( docs_rs_fastly::Config::from_environment() .context("error reading fastly config from environment")?, @@ -121,6 +49,7 @@ impl Config { .build_queue(Arc::new(docs_rs_build_queue::Config::from_environment()?)) .build_limits(Arc::new(docs_rs_build_limits::Config::from_environment()?)) .builder(Arc::new(docs_rs_builder::Config::from_environment()?)) - .watcher(Arc::new(docs_rs_watcher::Config::from_environment()?))) + .watcher(Arc::new(docs_rs_watcher::Config::from_environment()?)) + .web(Arc::new(docs_rs_web::Config::from_environment()?))) } } diff --git a/src/error.rs b/src/error.rs deleted file mode 100644 index a99978b28..000000000 --- a/src/error.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) use anyhow::Result; diff --git a/src/lib.rs b/src/lib.rs index 647481e0f..3fe0de1df 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,30 +8,10 @@ pub use self::config::Config; pub use self::context::Context; -pub use self::web::start_web_server; pub use docs_rs_build_limits::DEFAULT_MAX_TARGETS; pub use docs_rs_utils::{APP_USER_AGENT, BUILD_VERSION, RUSTDOC_STATIC_STORAGE_PREFIX}; -pub use font_awesome_as_a_crate::icons; mod config; mod context; -mod error; -pub mod metrics; -#[cfg(test)] -mod test; pub mod utils; -mod web; - -use web::page::GlobalAlert; - -// Warning message shown in the navigation bar of every page. Set to `None` to hide it. -pub(crate) static GLOBAL_ALERT: Option = None; -/* -pub(crate) static GLOBAL_ALERT: Option = Some(GlobalAlert { - url: "https://blog.rust-lang.org/2019/09/18/upcoming-docsrs-changes.html", - text: "Upcoming docs.rs breaking changes!", - css_class: "error", - fa_icon: "exclamation-triangle", -}); -*/ diff --git a/src/metrics/mod.rs b/src/metrics/mod.rs deleted file mode 100644 index 9dc671572..000000000 --- a/src/metrics/mod.rs +++ /dev/null @@ -1,11 +0,0 @@ -/// response time histogram buckets from the opentelemetry semantiv conventions -/// https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverrequestduration -/// -/// These are the default prometheus bucket sizes, -/// https://docs.rs/prometheus/0.14.0/src/prometheus/histogram.rs.html#25-27 -/// tailored to broadly measure the response time (in seconds) of a network service. -/// -/// Otel default buckets are not suited for that. -pub const RESPONSE_TIME_HISTOGRAM_BUCKETS: &[f64] = &[ - 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0, -]; diff --git a/src/utils/daemon.rs b/src/utils/daemon.rs index 8b29faaeb..d06abbed6 100644 --- a/src/utils/daemon.rs +++ b/src/utils/daemon.rs @@ -2,7 +2,7 @@ //! //! This daemon will start web server, track new packages and build them -use crate::{Context, web::start_web_server}; +use crate::Context; use anyhow::{Error, anyhow}; use docs_rs_builder::{RustwideBuilder, queue_builder}; use docs_rs_context::Context as NewContext; @@ -10,6 +10,7 @@ use docs_rs_watcher::{ start_background_queue_rebuild, start_background_repository_stats_updater, start_background_service_metric_collector, watch_registry, }; +use docs_rs_web::run_web_server; use std::sync::Arc; use std::thread; use std::time::Duration; @@ -39,8 +40,15 @@ pub fn start_daemon(context: Context, enable_registry_watcher: bool) -> Result<( // Please check with an administrator before changing this (see #1172 for context). info!("Starting web server"); let webserver_thread = thread::spawn({ + let new_context = new_context.clone(); let context = context.clone(); - move || start_web_server(None, &context) + move || { + context.runtime.block_on(run_web_server( + None, + context.config.web.clone(), + new_context, + )) + } }); if enable_registry_watcher { diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 208d44535..cb3a194d3 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1,19 +1,5 @@ //! Various utilities for docs.rs pub use self::daemon::start_daemon; -pub(crate) use self::html::rewrite_rustdoc_html_stream; pub mod daemon; -mod html; - -use tracing::error; - -pub(crate) fn report_error(err: &anyhow::Error) { - // Debug-format for anyhow errors includes context & backtrace - if std::env::var("SENTRY_DSN").is_ok() { - sentry::integrations::anyhow::capture_anyhow(err); - error!(reported_to_sentry = true, "{err:?}"); - } else { - error!("{err:?}"); - } -} diff --git a/src/web/mod.rs b/src/web/mod.rs deleted file mode 100644 index 2b0508a5c..000000000 --- a/src/web/mod.rs +++ /dev/null @@ -1,1216 +0,0 @@ -//! Web interface of docs.rs - -mod build_details; -mod builds; -pub(crate) mod cache; -pub(crate) mod crate_details; -mod csp; -pub(crate) mod error; -pub(crate) mod extractors; -mod features; -mod file; -mod highlight; -mod licenses; -mod markdown; -pub(crate) mod metrics; -pub mod page; -mod releases; -mod routes; -pub(crate) mod rustdoc; -mod security; -mod sitemap; -mod source; -mod statics; -mod status; - -use crate::{ - Context, impl_axum_webpage, - web::{ - metrics::WebMetrics, - page::templates::{RenderBrands, RenderSolid, filters}, - }, -}; -use anyhow::{Context as _, Error, Result, anyhow, bail}; -use askama::Template; -use axum::{ - Router as AxumRouter, - extract::{Extension, MatchedPath, Request as AxumRequest}, - http::StatusCode, - middleware, - middleware::Next, - response::{IntoResponse, Response as AxumResponse}, -}; -use axum_extra::middleware::option_layer; -use chrono::{DateTime, NaiveDate, Utc}; -use docs_rs_database::crate_details::{Release, parse_doc_targets}; -use docs_rs_types::{BuildStatus, CrateId, KrateName, ReqVersion, Version, VersionReq}; -use docs_rs_utils::rustc_version::parse_rustc_date; -use error::AxumNope; -use page::TemplateData; -use sentry::integrations::tower as sentry_tower; -use serde::Serialize; -use std::{ - borrow::Cow, - net::{IpAddr, Ipv4Addr, SocketAddr}, - sync::Arc, -}; -use tower::ServiceBuilder; -use tower_http::{catch_panic::CatchPanicLayer, timeout::TimeoutLayer, trace::TraceLayer}; -use tracing::{info, instrument}; - -/// Picks the correct "rustdoc.css" static file depending on which rustdoc version was used to -/// generate this version of this crate. -pub fn get_correct_docsrs_style_file(version: &str) -> Result { - let date = parse_rustc_date(version)?; - // This is the date where https://github.com/rust-lang/rust/pull/144476 was merged. - if NaiveDate::from_ymd_opt(2025, 8, 20).unwrap() < date { - Ok("rustdoc-2025-08-20.css".to_owned()) - // This is the date where https://github.com/rust-lang/rust/pull/91356 was merged. - } else if NaiveDate::from_ymd_opt(2021, 12, 5).unwrap() < date { - // If this is the new rustdoc layout, we need the newer docs.rs CSS file. - Ok("rustdoc-2021-12-05.css".to_owned()) - } else { - // By default, we return the old docs.rs CSS file. - Ok("rustdoc.css".to_owned()) - } -} - -const DEFAULT_BIND: SocketAddr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 3000); - -#[derive(Debug)] -pub(crate) struct MatchedRelease { - /// crate name - pub name: KrateName, - - /// The crate name that was found when attempting to load a crate release. - /// `match_version` will attempt to match a provided crate name against similar crate names with - /// dashes (`-`) replaced with underscores (`_`) and vice versa. - pub corrected_name: Option, - - /// what kind of version did we get in the request? ("latest", semver, exact) - pub req_version: ReqVersion, - - /// the matched release - pub release: Release, - - /// all releases since we have them anyways and so we can pass them to CrateDetails - pub(crate) all_releases: Vec, -} - -impl MatchedRelease { - fn assume_exact_name(self) -> Result { - if self.corrected_name.is_none() { - Ok(self) - } else { - Err(AxumNope::CrateNotFound) - } - } - - fn into_exactly_named(self) -> Self { - if let Some(corrected_name) = self.corrected_name { - Self { - name: corrected_name.to_owned(), - corrected_name: None, - ..self - } - } else { - self - } - } - - fn into_exactly_named_or_else(self, f: F) -> Result - where - F: FnOnce(&KrateName, &ReqVersion) -> AxumNope, - { - if let Some(corrected_name) = self.corrected_name { - Err(f(&corrected_name, &self.req_version)) - } else { - Ok(self) - } - } - - /// Canonicalize the version from the request - /// - /// Mainly: - /// * "newest"/"*" or empty -> "latest" in the URL - /// * any other semver requirement -> specific version in the URL - fn into_canonical_req_version(self) -> Self { - match self.req_version { - ReqVersion::Exact(_) | ReqVersion::Latest => self, - ReqVersion::Semver(version_req) => { - if version_req == VersionReq::STAR { - Self { - req_version: ReqVersion::Latest, - ..self - } - } else { - Self { - req_version: ReqVersion::Exact(self.release.version.clone()), - ..self - } - } - } - } - } - - /// translate this MatchRelease into a specific semver::Version while canonicalizing the - /// version specification. - fn into_canonical_req_version_or_else(self, f: F) -> Result - where - F: FnOnce(&KrateName, &ReqVersion) -> AxumNope, - { - let original_req_version = self.req_version.clone(); - let canonicalized = self.into_canonical_req_version(); - - if canonicalized.req_version == original_req_version { - Ok(canonicalized) - } else { - Err(f(&canonicalized.name, &canonicalized.req_version)) - } - } - - fn into_version(self) -> Version { - self.release.version - } - - fn build_status(&self) -> BuildStatus { - self.release.build_status - } - - fn rustdoc_status(&self) -> bool { - self.release.rustdoc_status.unwrap_or(false) - } - - fn is_latest_url(&self) -> bool { - matches!(self.req_version, ReqVersion::Latest) - } -} - -fn semver_match<'a, F: Fn(&Release) -> bool>( - releases: &'a [Release], - req: &VersionReq, - filter: F, -) -> Option<&'a Release> { - // first try standard semver match using `VersionReq::match`, should handle most cases. - if let Some(release) = releases - .iter() - .filter(|release| filter(release)) - .find(|release| req.matches(&release.version)) - { - Some(release) - } else if req == &VersionReq::STAR { - // semver `*` does not match pre-releases. - // So when we only have pre-releases, `VersionReq::STAR` would lead to an - // empty result. - // In this case we just return the latest prerelease instead of nothing. - releases.iter().find(|release| filter(release)) - } else { - None - } -} - -/// Checks the database for crate releases that match the given name and version. -/// -/// `version` may be an exact version number or loose semver version requirement. The return value -/// will indicate whether the given version exactly matched a version number from the database. -/// -/// This function will also check for crates where dashes in the name (`-`) have been replaced with -/// underscores (`_`) and vice-versa. The return value will indicate whether the crate name has -/// been matched exactly, or if there has been a "correction" in the name that matched instead. -#[instrument(skip(conn))] -async fn match_version( - conn: &mut sqlx::PgConnection, - name: &str, - input_version: &ReqVersion, -) -> Result { - let (crate_id, name, corrected_name) = { - let row = sqlx::query!( - r#" - SELECT - id as "id: CrateId", - name as "name: KrateName" - FROM crates - WHERE normalize_crate_name(name) = normalize_crate_name($1)"#, - name, - ) - .fetch_optional(&mut *conn) - .await - .context("error fetching crate")? - .ok_or(AxumNope::CrateNotFound)?; - - let name: KrateName = name - .parse() - .expect("here we know it's valid, because we found it after normalizing"); - - if row.name != name { - (row.id, name, Some(row.name)) - } else { - (row.id, name, None) - } - }; - - // first load and parse all versions of this crate, - // `releases_for_crate` is already sorted, newest version first. - let releases = docs_rs_database::crate_details::releases_for_crate(conn, crate_id) - .await - .context("error fetching releases for crate")?; - - if releases.is_empty() { - return Err(AxumNope::CrateNotFound); - } - - let req_semver: VersionReq = match input_version { - ReqVersion::Exact(parsed_req_version) => { - if let Some(release) = releases - .iter() - .find(|release| &release.version == parsed_req_version) - { - return Ok(MatchedRelease { - name, - corrected_name, - req_version: input_version.clone(), - release: release.clone(), - all_releases: releases, - }); - } - - if let Ok(version_req) = VersionReq::parse(&parsed_req_version.to_string()) { - // when we don't find a release with exact version, - // we try to interpret it as a semver requirement. - // A normal semver version ("1.2.3") is equivalent to a caret semver requirement. - version_req - } else { - return Err(AxumNope::VersionNotFound); - } - } - ReqVersion::Latest => VersionReq::STAR, - ReqVersion::Semver(version_req) => version_req.clone(), - }; - - // when matching semver requirements, - // we generally only want to look at non-yanked releases, - // excluding releases which just contain in-progress builds - if let Some(release) = semver_match(&releases, &req_semver, |r: &Release| { - r.build_status != BuildStatus::InProgress && (r.yanked.is_none() || r.yanked == Some(false)) - }) { - return Ok(MatchedRelease { - name: name.to_owned(), - corrected_name, - req_version: input_version.clone(), - release: release.clone(), - all_releases: releases, - }); - } - - // when we don't find any match with "normal" releases, we also look into in-progress releases - if let Some(release) = semver_match(&releases, &req_semver, |r: &Release| { - r.yanked.is_none() || r.yanked == Some(false) - }) { - return Ok(MatchedRelease { - name: name.to_owned(), - corrected_name, - req_version: input_version.clone(), - release: release.clone(), - all_releases: releases, - }); - } - - // Since we return with a CrateNotFound earlier if the db reply is empty, - // we know that versions were returned but none satisfied the version requirement. - // This can only happen when all versions are yanked. - Err(AxumNope::VersionNotFound) -} - -async fn log_timeouts_to_sentry(req: AxumRequest, next: Next) -> AxumResponse { - let uri = req.uri().clone(); - - let response = next.run(req).await; - - if response.status() == StatusCode::REQUEST_TIMEOUT { - tracing::error!(?uri, "request timeout"); - } - - response -} - -async fn set_sentry_transaction_name_from_axum_route( - request: AxumRequest, - next: Next, -) -> AxumResponse { - let route_name = if let Some(path) = request.extensions().get::() { - path.as_str() - } else { - request.uri().path() - }; - - sentry::configure_scope(|scope| { - scope.set_transaction(Some(route_name)); - }); - - next.run(request).await -} - -async fn apply_middleware( - router: AxumRouter, - context: &Context, - template_data: Option>, -) -> Result { - let has_templates = template_data.is_some(); - - let web_metrics = Arc::new(WebMetrics::new(&context.meter_provider)); - - Ok(router.layer( - ServiceBuilder::new() - .layer(TraceLayer::new_for_http()) - .layer(sentry_tower::NewSentryLayer::new_from_top()) - .layer(sentry_tower::SentryHttpLayer::new().enable_transaction()) - .layer(middleware::from_fn( - set_sentry_transaction_name_from_axum_route, - )) - .layer(CatchPanicLayer::new()) - .layer(middleware::from_fn(security::security_middleware)) - .layer(option_layer( - context - .config - .report_request_timeouts - .then_some(middleware::from_fn(log_timeouts_to_sentry)), - )) - .layer(option_layer(context.config.request_timeout.map(|to| { - TimeoutLayer::with_status_code(StatusCode::REQUEST_TIMEOUT, to) - }))) - .layer(Extension(context.pool.clone())) - .layer(Extension(context.async_build_queue.clone())) - .layer(Extension(web_metrics)) - .layer(Extension(context.config.clone())) - .layer(Extension(context.registry_api.clone())) - .layer(Extension(context.async_storage.clone())) - .layer(option_layer(template_data.map(Extension))) - .layer(middleware::from_fn(csp::csp_middleware)) - .layer(option_layer(has_templates.then_some(middleware::from_fn( - page::web_page::render_templates_middleware, - )))) - .layer(middleware::from_fn(cache::cache_middleware)), - )) -} - -pub(crate) async fn build_axum_app( - context: &Context, - template_data: Arc, -) -> Result { - apply_middleware(routes::build_axum_routes(), context, Some(template_data)).await -} - -#[instrument(skip_all)] -pub fn start_web_server(addr: Option, context: &Context) -> Result<(), Error> { - let template_data = Arc::new(TemplateData::new(context.config.render_threads)?); - - let axum_addr = addr.unwrap_or(DEFAULT_BIND); - - tracing::info!( - "Starting web server on `{}:{}`", - axum_addr.ip(), - axum_addr.port() - ); - - context.runtime.block_on(async { - let app = build_axum_app(context, template_data) - .await? - .into_make_service(); - let listener = tokio::net::TcpListener::bind(axum_addr) - .await - .context("error binding socket for web server")?; - - axum::serve(listener, app) - .with_graceful_shutdown(shutdown_signal()) - .await?; - Ok::<(), Error>(()) - })?; - - Ok(()) -} - -async fn shutdown_signal() { - let ctrl_c = async { - tokio::signal::ctrl_c() - .await - .expect("failed to install Ctrl+C handler"); - }; - - #[cfg(unix)] - let terminate = async { - tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()) - .expect("failed to install signal handler") - .recv() - .await; - }; - - #[cfg(not(unix))] - let terminate = std::future::pending::<()>(); - - tokio::select! { - _ = ctrl_c => {}, - _ = terminate => {}, - } - - info!("signal received, starting graceful shutdown"); -} - -/// Converts Timespec to nice readable relative time string -fn duration_to_str(init: DateTime) -> String { - let now = Utc::now(); - let delta = now.signed_duration_since(init); - - let delta = ( - delta.num_days(), - delta.num_hours(), - delta.num_minutes(), - delta.num_seconds(), - ); - - match delta { - (days, ..) if days > 5 => format!("{}", init.format("%b %d, %Y")), - (days @ 2..=5, ..) => format!("{days} days ago"), - (1, ..) => "one day ago".to_string(), - - (_, hours, ..) if hours > 1 => format!("{hours} hours ago"), - (_, 1, ..) => "an hour ago".to_string(), - - (_, _, minutes, _) if minutes > 1 => format!("{minutes} minutes ago"), - (_, _, 1, _) => "one minute ago".to_string(), - - (_, _, _, seconds) if seconds > 0 => format!("{seconds} seconds ago"), - _ => "just now".to_string(), - } -} - -#[instrument] -fn axum_redirect(uri: U) -> Result -where - U: TryInto + std::fmt::Debug, - >::Error: std::fmt::Debug, -{ - let uri: http::Uri = uri - .try_into() - .map_err(|err| anyhow!("invalid URI: {:?}", err))?; - - if let Some(path_and_query) = uri.path_and_query() { - if path_and_query.as_str().starts_with("//") { - bail!("protocol relative redirects are forbidden"); - } - } else { - // we always want a path to redirect to, even when it's just `/` - bail!("missing path in URI"); - } - - Ok(( - StatusCode::FOUND, - [( - http::header::LOCATION, - http::HeaderValue::try_from(uri.to_string()).context("invalid uri for redirect")?, - )], - )) -} - -#[instrument] -fn axum_cached_redirect( - uri: U, - cache_policy: cache::CachePolicy, -) -> Result -where - U: TryInto + std::fmt::Debug, - >::Error: std::fmt::Debug, -{ - let mut resp = axum_redirect(uri)?.into_response(); - resp.extensions_mut().insert(cache_policy); - Ok(resp) -} - -/// MetaData used in header -#[derive(Debug, Clone, PartialEq, Eq, Serialize)] -pub(crate) struct MetaData { - pub(crate) name: KrateName, - /// The exact version of the release being shown. - pub(crate) version: Version, - /// The version identifier in the request that was used to request this page. - /// This might be any of the variants of `ReqVersion`, but - /// due to a canonicalization step, it is either an Exact version, or `/latest/` - /// most of the time. - pub(crate) req_version: ReqVersion, - pub(crate) description: Option, - pub(crate) target_name: Option, - pub(crate) rustdoc_status: Option, - pub(crate) default_target: Option, - pub(crate) doc_targets: Option>, - pub(crate) yanked: Option, - /// CSS file to use depending on the rustdoc version used to generate this version of this - /// crate. - pub(crate) rustdoc_css_file: Option, -} - -impl MetaData { - #[fn_error_context::context("getting metadata for {name} {version}")] - async fn from_crate( - conn: &mut sqlx::PgConnection, - name: &str, - version: &Version, - req_version: Option, - ) -> Result { - let row = sqlx::query!( - r#"SELECT - crates.name as "name: KrateName", - releases.version, - releases.description, - releases.target_name, - releases.rustdoc_status, - releases.default_target, - releases.doc_targets, - releases.yanked, - builds.rustc_version as "rustc_version?" - FROM releases - INNER JOIN crates ON crates.id = releases.crate_id - LEFT JOIN LATERAL ( - SELECT * FROM builds - WHERE builds.rid = releases.id - ORDER BY builds.build_finished - DESC LIMIT 1 - ) AS builds ON true - WHERE crates.name = $1 AND releases.version = $2"#, - name, - version.to_string(), - ) - .fetch_one(&mut *conn) - .await - .context("error fetching crate metadata")?; - - Ok(MetaData { - name: row.name, - version: version.clone(), - req_version: req_version.unwrap_or_else(|| ReqVersion::Exact(version.clone())), - description: row.description, - target_name: row.target_name, - rustdoc_status: row.rustdoc_status, - default_target: row.default_target, - doc_targets: row.doc_targets.map(parse_doc_targets), - yanked: row.yanked, - rustdoc_css_file: row - .rustc_version - .as_deref() - .map(get_correct_docsrs_style_file) - .transpose()?, - }) - } -} - -#[derive(Template)] -#[template(path = "error.html")] -#[derive(Debug, Clone, PartialEq)] -pub(crate) struct AxumErrorPage { - /// The title of the page - pub title: &'static str, - /// The error message, displayed as a description - pub message: Cow<'static, str>, - pub status: StatusCode, -} - -impl_axum_webpage! { - AxumErrorPage, - status = |err| err.status, - -} - -#[cfg(test)] -mod test { - use super::*; - use crate::test::{ - AxumResponseTestExt, AxumRouterTestExt, FakeBuild, TestEnvironment, async_wrapper, - }; - use docs_rs_database::testing::TestDatabase; - use docs_rs_types::{DocCoverage, ReleaseId}; - use kuchikiki::traits::TendrilSink; - use pretty_assertions::assert_eq; - use serde_json::json; - use std::str::FromStr as _; - use test_case::test_case; - - async fn release(version: &str, env: &TestEnvironment) -> ReleaseId { - let version = Version::parse(version).unwrap(); - env.fake_release() - .await - .name("foo") - .version(version) - .create() - .await - .unwrap() - } - - async fn version(v: Option<&str>, db: &TestDatabase) -> Option { - let mut conn = db.async_conn().await.unwrap(); - let version = match_version( - &mut conn, - "foo", - &ReqVersion::from_str(v.unwrap_or_default()).unwrap(), - ) - .await - .ok()? - .assume_exact_name() - .ok()? - .into_version(); - Some(version) - } - - #[allow(clippy::unnecessary_wraps)] - fn semver(version: &'static str) -> Option { - version.parse().ok() - } - - #[allow(clippy::unnecessary_wraps)] - fn exact(version: &'static str) -> Option { - version.parse().ok() - } - - async fn clipboard_is_present_for_path(path: &str, web: &axum::Router) -> bool { - let data = web.get(path).await.unwrap().text().await.unwrap(); - let node = kuchikiki::parse_html().one(data); - node.select("#clipboard").unwrap().count() == 1 - } - - #[test] - fn test_get_correct_docsrs_style_file() { - assert_eq!( - get_correct_docsrs_style_file("rustc 1.10.0-nightly (57ef01513 2016-05-23)").unwrap(), - "rustdoc.css" - ); - assert_eq!( - get_correct_docsrs_style_file("docsrs 0.2.0 (ba9ae23 2022-05-26)").unwrap(), - "rustdoc-2021-12-05.css" - ); - assert!(get_correct_docsrs_style_file("docsrs 0.2.0").is_err(),); - } - - #[test] - fn test_index_returns_success() { - async_wrapper(|env| async move { - let web = env.web_app().await; - assert!(web.get("/").await?.status().is_success()); - Ok(()) - }); - } - - #[test] - fn test_doc_coverage_for_crate_pages() { - async_wrapper(|env| async move { - env.fake_release() - .await - .name("foo") - .version("0.0.1") - .source_file("test.rs", &[]) - .doc_coverage(DocCoverage { - total_items: 10, - documented_items: 6, - total_items_needing_examples: 2, - items_with_examples: 1, - }) - .create() - .await?; - let web = env.web_app().await; - - let foo_crate = kuchikiki::parse_html() - .one(web.assert_success("/crate/foo/0.0.1").await?.text().await?); - - for (idx, value) in ["60%", "6", "10", "2", "1"].iter().enumerate() { - let mut menu_items = foo_crate.select(".pure-menu-item b").unwrap(); - assert!( - menu_items.any(|e| e.text_contents().contains(value)), - "({idx}, {value:?})" - ); - } - - let foo_doc = kuchikiki::parse_html() - .one(web.assert_success("/foo/0.0.1/foo/").await?.text().await?); - assert!( - foo_doc - .select(".pure-menu-link b") - .unwrap() - .any(|e| e.text_contents().contains("60%")) - ); - - Ok(()) - }); - } - - #[test] - fn test_show_clipboard_for_crate_pages() { - async_wrapper(|env| async move { - env.fake_release() - .await - .name("fake_crate") - .version("0.0.1") - .source_file("test.rs", &[]) - .create() - .await?; - let web = env.web_app().await; - assert!(clipboard_is_present_for_path("/crate/fake_crate/0.0.1", &web).await); - assert!(clipboard_is_present_for_path("/crate/fake_crate/0.0.1/source/", &web).await); - assert!(clipboard_is_present_for_path("/fake_crate/0.0.1/fake_crate/", &web).await); - Ok(()) - }); - } - - #[test] - fn test_hide_clipboard_for_non_crate_pages() { - async_wrapper(|env| async move { - env.fake_release() - .await - .name("fake_crate") - .version("0.0.1") - .create() - .await?; - let web = env.web_app().await; - assert!(!clipboard_is_present_for_path("/about", &web).await); - assert!(!clipboard_is_present_for_path("/releases", &web).await); - assert!(!clipboard_is_present_for_path("/", &web).await); - assert!(!clipboard_is_present_for_path("/not/a/real/path", &web).await); - Ok(()) - }); - } - - #[test] - fn standard_library_redirects() { - async fn assert_external_redirect_success( - web: &axum::Router, - path: &str, - expected_target: &str, - ) -> Result<()> { - let redirect_response = web.assert_redirect_unchecked(path, expected_target).await?; - - let external_target_url = redirect_response.redirect_target().unwrap(); - - let response = reqwest::get(external_target_url).await?; - let status = response.status(); - assert!( - status.is_success(), - "failed to GET {external_target_url}: {status}" - ); - Ok(()) - } - - async_wrapper(|env| async move { - let web = env.web_app().await; - for krate in &["std", "alloc", "core", "proc_macro", "test"] { - let target = format!("https://doc.rust-lang.org/stable/{krate}/"); - - // with or without slash - assert_external_redirect_success(&web, &format!("/{krate}"), &target).await?; - assert_external_redirect_success(&web, &format!("/{krate}/"), &target).await?; - } - - let target = "https://doc.rust-lang.org/stable/proc_macro/"; - // with or without slash - assert_external_redirect_success(&web, "/proc-macro", target).await?; - assert_external_redirect_success(&web, "/proc-macro/", target).await?; - - let target = "https://doc.rust-lang.org/nightly/nightly-rustc/"; - // with or without slash - assert_external_redirect_success(&web, "/rustc", target).await?; - assert_external_redirect_success(&web, "/rustc/", target).await?; - - let target = "https://doc.rust-lang.org/nightly/nightly-rustc/rustdoc/"; - // with or without slash - assert_external_redirect_success(&web, "/rustdoc", target).await?; - assert_external_redirect_success(&web, "/rustdoc/", target).await?; - - // queries are supported - assert_external_redirect_success( - &web, - "/std?search=foobar", - "https://doc.rust-lang.org/stable/std/?search=foobar", - ) - .await?; - - Ok(()) - }) - } - - #[test] - fn double_slash_does_redirect_to_latest_version() { - async_wrapper(|env| async move { - env.fake_release() - .await - .name("bat") - .version("0.2.0") - .create() - .await?; - let web = env.web_app().await; - web.assert_redirect("/bat//", "/bat/latest/bat/").await?; - Ok(()) - }) - } - - #[test] - fn binary_docs_redirect_to_crate() { - async_wrapper(|env| async move { - env.fake_release() - .await - .name("bat") - .version("0.2.0") - .binary(true) - .create() - .await?; - let web = env.web_app().await; - web.assert_redirect("/bat/0.2.0", "/crate/bat/0.2.0") - .await?; - web.assert_redirect("/bat/0.2.0/aarch64-unknown-linux-gnu", "/crate/bat/0.2.0") - .await?; - /* TODO: this should work (https://github.com/rust-lang/docs.rs/issues/603) - assert_redirect("/bat/0.2.0/aarch64-unknown-linux-gnu/bat", "/crate/bat/0.2.0", web)?; - assert_redirect("/bat/0.2.0/aarch64-unknown-linux-gnu/bat/", "/crate/bat/0.2.0/", web)?; - */ - Ok(()) - }) - } - - #[test] - fn can_view_source() { - async_wrapper(|env| async move { - env.fake_release() - .await - .name("regex") - .version("0.3.0") - .source_file("src/main.rs", br#"println!("definitely valid rust")"#) - .create() - .await?; - - let web = env.web_app().await; - web.assert_success("/crate/regex/0.3.0/source/src/main.rs") - .await?; - web.assert_success("/crate/regex/0.3.0/source/").await?; - web.assert_success("/crate/regex/0.3.0/source/src").await?; - web.assert_success("/regex/0.3.0/src/regex/main.rs.html") - .await?; - Ok(()) - }) - } - - #[test] - // https://github.com/rust-lang/docs.rs/issues/223 - fn prereleases_are_not_considered_for_semver() { - async_wrapper(|env| async move { - let db = env.async_db(); - let version = |v| version(v, db); - let release = |v| release(v, &env); - - release("0.3.1-pre").await; - for search in &["*", "newest", "latest"] { - assert_eq!(version(Some(search)).await, semver("0.3.1-pre")); - } - - release("0.3.1-alpha").await; - assert_eq!(version(Some("0.3.1-alpha")).await, exact("0.3.1-alpha")); - - release("0.3.0").await; - let three = semver("0.3.0"); - assert_eq!(version(None).await, three); - // same thing but with "*" - assert_eq!(version(Some("*")).await, three); - // make sure exact matches still work - assert_eq!(version(Some("0.3.0")).await, exact("0.3.0")); - - Ok(()) - }); - } - - #[test] - fn platform_dropdown_not_shown_with_no_targets() { - async_wrapper(|env| async move { - release("0.1.0", &env).await; - let web = env.web_app().await; - let text = web.get("/foo/0.1.0/foo").await?.text().await?; - let platform = kuchikiki::parse_html() - .one(text) - .select(r#"ul > li > a[aria-label="Platform"]"#) - .unwrap() - .count(); - assert_eq!(platform, 0); - - // sanity check the test is doing something - env.fake_release() - .await - .name("foo") - .version("0.2.0") - .add_platform("x86_64-unknown-linux-musl") - .create() - .await?; - let text = web.assert_success("/foo/0.2.0/foo/").await?.text().await?; - let platform = kuchikiki::parse_html() - .one(text) - .select(r#"ul > li > a[aria-label="Platform"]"#) - .unwrap() - .count(); - assert_eq!(platform, 1); - Ok(()) - }); - } - - #[test] - // https://github.com/rust-lang/docs.rs/issues/221 - fn yanked_crates_are_not_considered() { - async_wrapper(|env| async move { - let db = env.async_db(); - - let release_id = release("0.3.0", &env).await; - - sqlx::query!( - "UPDATE releases SET yanked = true WHERE id = $1 AND version = '0.3.0'", - release_id.0 - ) - .execute(&mut *db.async_conn().await?) - .await?; - - assert_eq!(version(None, db).await, None); - assert_eq!(version(Some("0.3"), db).await, None); - - release("0.1.0+4.1", &env).await; - assert_eq!(version(Some("0.1.0+4.1"), db).await, exact("0.1.0+4.1")); - assert_eq!(version(None, db).await, semver("0.1.0+4.1")); - - Ok(()) - }); - } - - #[test] - fn in_progress_releases_are_ignored_when_others_match() { - async_wrapper(|env| async move { - let db = env.async_db(); - - // normal release - release("1.0.0", &env).await; - - // in progress release - env.fake_release() - .await - .name("foo") - .version("1.1.0") - .builds(vec![ - FakeBuild::default().build_status(BuildStatus::InProgress), - ]) - .create() - .await?; - - // STAR gives me the prod release - assert_eq!(version(Some("*"), db).await, exact("1.0.0")); - - // exact-match query gives me the in progress release - assert_eq!(version(Some("=1.1.0"), db).await, exact("1.1.0")); - - Ok(()) - }) - } - - #[test] - // https://github.com/rust-lang/docs.rs/issues/1682 - fn prereleases_are_considered_when_others_dont_match() { - async_wrapper(|env| async move { - let db = env.async_db(); - - // normal release - release("1.0.0", &env).await; - // prereleases - release("2.0.0-alpha.1", &env).await; - release("2.0.0-alpha.2", &env).await; - - // STAR gives me the prod release - assert_eq!(version(Some("*"), db).await, exact("1.0.0")); - - // prerelease query gives me the latest prerelease - assert_eq!( - version(Some(">=2.0.0-alpha"), db).await, - exact("2.0.0-alpha.2") - ); - - Ok(()) - }) - } - - #[test] - // vaguely related to https://github.com/rust-lang/docs.rs/issues/395 - fn metadata_has_no_effect() { - async_wrapper(|env| async move { - let db = env.async_db(); - - release("0.1.0+4.1", &env).await; - release("0.1.1", &env).await; - assert_eq!(version(None, db).await, semver("0.1.1")); - release("0.5.1+zstd.1.4.4", &env).await; - assert_eq!(version(None, db).await, semver("0.5.1+zstd.1.4.4")); - assert_eq!(version(Some("0.5"), db).await, semver("0.5.1+zstd.1.4.4")); - assert_eq!( - version(Some("0.5.1+zstd.1.4.4"), db).await, - exact("0.5.1+zstd.1.4.4") - ); - - Ok(()) - }); - } - - #[test] - fn serialize_metadata() { - let mut metadata = MetaData { - name: "serde".parse().unwrap(), - version: "1.0.0".parse().unwrap(), - req_version: ReqVersion::Latest, - description: Some("serde does stuff".to_string()), - target_name: None, - rustdoc_status: Some(true), - default_target: Some("x86_64-unknown-linux-gnu".to_string()), - doc_targets: Some(vec![ - "x86_64-unknown-linux-gnu".to_string(), - "arm64-unknown-linux-gnu".to_string(), - ]), - yanked: Some(false), - rustdoc_css_file: Some("rustdoc.css".to_string()), - }; - - let correct_json = json!({ - "name": "serde", - "version": "1.0.0", - "req_version": "latest", - "description": "serde does stuff", - "target_name": null, - "rustdoc_status": true, - "default_target": "x86_64-unknown-linux-gnu", - "doc_targets": [ - "x86_64-unknown-linux-gnu", - "arm64-unknown-linux-gnu", - ], - "yanked": false, - "rustdoc_css_file": "rustdoc.css", - }); - - assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap()); - - metadata.target_name = Some("serde_lib_name".to_string()); - let correct_json = json!({ - "name": "serde", - "version": "1.0.0", - "req_version": "latest", - "description": "serde does stuff", - "target_name": "serde_lib_name", - "rustdoc_status": true, - "default_target": "x86_64-unknown-linux-gnu", - "doc_targets": [ - "x86_64-unknown-linux-gnu", - "arm64-unknown-linux-gnu", - ], - "yanked": false, - "rustdoc_css_file": "rustdoc.css", - }); - - assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap()); - - metadata.description = None; - let correct_json = json!({ - "name": "serde", - "version": "1.0.0", - "req_version": "latest", - "description": null, - "target_name": "serde_lib_name", - "rustdoc_status": true, - "default_target": "x86_64-unknown-linux-gnu", - "doc_targets": [ - "x86_64-unknown-linux-gnu", - "arm64-unknown-linux-gnu", - ], - "yanked": false, - "rustdoc_css_file": "rustdoc.css", - }); - - assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap()); - } - - #[test] - fn metadata_from_crate() { - async_wrapper(|env| async move { - release("0.1.0", &env).await; - let mut conn = env.async_db().async_conn().await?; - let metadata = MetaData::from_crate( - &mut conn, - "foo", - &"0.1.0".parse().unwrap(), - Some(ReqVersion::Latest), - ) - .await; - assert_eq!( - metadata.unwrap(), - MetaData { - name: "foo".parse().unwrap(), - version: "0.1.0".parse().unwrap(), - req_version: ReqVersion::Latest, - description: Some("Fake package".to_string()), - target_name: Some("foo".to_string()), - rustdoc_status: Some(true), - default_target: Some("x86_64-unknown-linux-gnu".to_string()), - doc_targets: Some(vec!["x86_64-unknown-linux-gnu".to_string()]), - yanked: Some(false), - rustdoc_css_file: Some("rustdoc.css".to_string()), - }, - ); - Ok(()) - }) - } - - #[test] - fn test_tabindex_is_present_on_topbar_crate_search_input() { - async_wrapper(|env| async move { - release("0.1.0", &env).await; - let web = env.web_app().await; - let text = web.assert_success("/foo/0.1.0/foo/").await?.text().await?; - let tabindex = kuchikiki::parse_html() - .one(text) - .select(r#"#nav-search[tabindex="-1"]"#) - .unwrap() - .count(); - assert_eq!(tabindex, 1); - Ok(()) - }); - } - - #[test] - fn test_axum_redirect() { - let response = axum_redirect("/something").unwrap().into_response(); - assert_eq!(response.status(), StatusCode::FOUND); - assert_eq!( - response.headers().get(http::header::LOCATION).unwrap(), - "/something" - ); - assert!( - response - .headers() - .get(http::header::CACHE_CONTROL) - .is_none() - ); - assert!(response.extensions().get::().is_none()); - } - - #[test] - fn test_axum_redirect_cached() { - let response = axum_cached_redirect("/something", cache::CachePolicy::NoCaching) - .unwrap() - .into_response(); - assert_eq!(response.status(), StatusCode::FOUND); - assert_eq!( - response.headers().get(http::header::LOCATION).unwrap(), - "/something" - ); - assert!(matches!( - response.extensions().get::().unwrap(), - cache::CachePolicy::NoCaching, - )) - } - - #[test_case("without_leading_slash")] - #[test_case("//with_double_leading_slash")] - fn test_axum_redirect_failure(path: &str) { - assert!(axum_redirect(path).is_err()); - assert!(axum_cached_redirect(path, cache::CachePolicy::NoCaching).is_err()); - } -} diff --git a/tests/regex/body.html b/tests/regex/body.html deleted file mode 100644 index 64a141dbc..000000000 --- a/tests/regex/body.html +++ /dev/null @@ -1,86 +0,0 @@ -

[][src]Struct regex::CaptureMatches

pub struct CaptureMatches<'r, 't>(_);

An iterator that yields all non-overlapping capture groups matching a -particular regular expression.

-

The iterator stops when no more matches can be found.

-

'r is the lifetime of the compiled regular expression and 't is the -lifetime of the matched string.

-

Trait Implementations

impl<'r, 't> Iterator for CaptureMatches<'r, 't>[src]

type Item = Captures<'t>

The type of the elements being iterated over.

-

Auto Trait Implementations

impl<'r, 't> !Sync for CaptureMatches<'r, 't>

impl<'r, 't> !Send for CaptureMatches<'r, 't>

impl<'r, 't> Unpin for CaptureMatches<'r, 't>

impl<'r, 't> !UnwindSafe for CaptureMatches<'r, 't>

impl<'r, 't> !RefUnwindSafe for CaptureMatches<'r, 't>

Blanket Implementations

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<I> IntoIterator for I where
    I: Iterator
[src]

type Item = <I as Iterator>::Item

The type of the elements being iterated over.

-

type IntoIter = I

Which kind of iterator are we turning this into?

-

impl<T> From<T> for T[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/tests/regex/head.html b/tests/regex/head.html deleted file mode 100644 index 29115c2a3..000000000 --- a/tests/regex/head.html +++ /dev/null @@ -1 +0,0 @@ -regex::CaptureMatches - Rust \ No newline at end of file