From d7cf433bb03f34a661e68c373ced80193843452e Mon Sep 17 00:00:00 2001 From: Olive Date: Sun, 4 Jan 2026 04:08:32 -0500 Subject: [PATCH] Initial commit --- Cargo.lock | 1796 ++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 12 + Makefile | 14 + Rocket.toml | 2 + build.sh | 10 + db/01-primary/down.sql | 8 + db/01-primary/up.sql | 234 ++++++ diesel.toml | 9 + gen/404.md | 2 + gen/about.md | 2 + gen/contact.md | 6 + gen/foot.html | 4 + gen/form.html | 736 ++++++++++++++++ gen/future.md | 10 + gen/hamburger.svg | 2 + gen/head.html | 32 + gen/index.md | 5 + gen/logo.webp | Bin 0 -> 12688 bytes gen/script.js | 58 ++ gen/style.css | 208 +++++ gen/thanks.md | 2 + md.py | 149 ++++ src/form.rs | 99 +++ src/main.rs | 50 ++ src/models.rs | 202 +++++ src/schema.rs | 207 +++++ 26 files changed, 3859 insertions(+) create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 Makefile create mode 100644 Rocket.toml create mode 100755 build.sh create mode 100644 db/01-primary/down.sql create mode 100644 db/01-primary/up.sql create mode 100644 diesel.toml create mode 100644 gen/404.md create mode 100644 gen/about.md create mode 100644 gen/contact.md create mode 100644 gen/foot.html create mode 100644 gen/form.html create mode 100644 gen/future.md create mode 100644 gen/hamburger.svg create mode 100644 gen/head.html create mode 100644 gen/index.md create mode 100644 gen/logo.webp create mode 100644 gen/script.js create mode 100644 gen/style.css create mode 100644 gen/thanks.md create mode 100755 md.py create mode 100644 src/form.rs create mode 100644 src/main.rs create mode 100644 src/models.rs create mode 100644 src/schema.rs diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..f641db1 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1796 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + +[[package]] +name = "atomic" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "binascii" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bytemuck" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "devise" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1d90b0c4c777a2cad215e3c7be59ac7c15adf45cf76317009b7d096d46f651d" +dependencies = [ + "devise_codegen", + "devise_core", +] + +[[package]] +name = "devise_codegen" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71b28680d8be17a570a2334922518be6adc3f58ecc880cbb404eaeb8624fd867" +dependencies = [ + "devise_core", + "quote", +] + +[[package]] +name = "devise_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b035a542cf7abf01f2e3c4d5a7acbaebfefe120ae4efc7bde3df98186e4b8af7" +dependencies = [ + "bitflags", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn", +] + +[[package]] +name = "diesel" +version = "2.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34d3950690ba3a6910126162b47e775e203006d4242a15de912bec6c0a695153" +dependencies = [ + "diesel_derives", + "libsqlite3-sys", + "r2d2", + "time", +] + +[[package]] +name = "diesel_derives" +version = "2.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a93958254b70bea63b4187ff73d10180599d9d8d177071b7f91e6da4e0c0ad55" +dependencies = [ + "diesel_table_macro_syntax", + "dsl_auto_type", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "diesel_table_macro_syntax" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" +dependencies = [ + "syn", +] + +[[package]] +name = "dsl_auto_type" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ae9aca7527f85f26dd76483eb38533fd84bd571065da1739656ef71c5ff5b" +dependencies = [ + "darling", + "either", + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "figment" +version = "0.10.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" +dependencies = [ + "atomic 0.6.0", + "pear", + "serde", + "toml", + "uncased", + "version_check", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generator" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" + +[[package]] +name = "hrtime" +version = "0.1.0" +dependencies = [ + "diesel", + "rocket", + "rocket_sync_db_pools", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", + "serde", +] + +[[package]] +name = "inlinable_string" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" + +[[package]] +name = "is-terminal" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +dependencies = [ + "hermit-abi 0.5.0", + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libsqlite3-sys" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbb8270bb4060bd76c6e96f20c52d80620f1d82a3470885694e41e0f81ef6fe7" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "multer" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http 1.3.1", + "httparse", + "memchr", + "mime", + "spin", + "tokio", + "tokio-util", + "version_check", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "pear" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467" +dependencies = [ + "inlinable_string", + "pear_codegen", + "yansi", +] + +[[package]] +name = "pear_codegen" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147" +dependencies = [ + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "version_check", + "yansi", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "r2d2" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" +dependencies = [ + "log", + "parking_lot", + "scheduled-thread-pool", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "redox_syscall" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rocket" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a516907296a31df7dc04310e7043b61d71954d703b603cc6867a026d7e72d73f" +dependencies = [ + "async-stream", + "async-trait", + "atomic 0.5.3", + "binascii", + "bytes", + "either", + "figment", + "futures", + "indexmap", + "log", + "memchr", + "multer", + "num_cpus", + "parking_lot", + "pin-project-lite", + "rand", + "ref-cast", + "rocket_codegen", + "rocket_http", + "serde", + "state", + "tempfile", + "time", + "tokio", + "tokio-stream", + "tokio-util", + "ubyte", + "version_check", + "yansi", +] + +[[package]] +name = "rocket_codegen" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575d32d7ec1a9770108c879fc7c47815a80073f96ca07ff9525a94fcede1dd46" +dependencies = [ + "devise", + "glob", + "indexmap", + "proc-macro2", + "quote", + "rocket_http", + "syn", + "unicode-xid", + "version_check", +] + +[[package]] +name = "rocket_http" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e274915a20ee3065f611c044bd63c40757396b6dbc057d6046aec27f14f882b9" +dependencies = [ + "cookie", + "either", + "futures", + "http 0.2.12", + "hyper", + "indexmap", + "log", + "memchr", + "pear", + "percent-encoding", + "pin-project-lite", + "ref-cast", + "serde", + "smallvec", + "stable-pattern", + "state", + "time", + "tokio", + "uncased", +] + +[[package]] +name = "rocket_sync_db_pools" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83f32721ed79509adac4328e97f817a8f55a47c4b64799f6fd6cc3adb6e42ff" +dependencies = [ + "diesel", + "r2d2", + "rocket", + "rocket_sync_db_pools_codegen", + "serde", + "tokio", + "version_check", +] + +[[package]] +name = "rocket_sync_db_pools_codegen" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc890925dc79370c28eb15c9957677093fdb7e8c44966d189f38cedb995ee68" +dependencies = [ + "devise", + "quote", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustix" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scheduled-thread-pool" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "stable-pattern" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" +dependencies = [ + "memchr", +] + +[[package]] +name = "state" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" +dependencies = [ + "loom", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand", + "getrandom 0.3.2", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tokio" +version = "1.44.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ubyte" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea" +dependencies = [ + "serde", +] + +[[package]] +name = "uncased" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" +dependencies = [ + "serde", + "version_check", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +dependencies = [ + "is-terminal", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..7579a7b --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "hrtime" +version = "0.1.0" +edition = "2024" + +[dependencies] +diesel = { version = "2.2.9", features = ["sqlite", "64-column-tables", "returning_clauses_for_sqlite_3_35"] } +rocket = "0.5.1" + +[dependencies.rocket_sync_db_pools] +version = "0.1.0" +features = ["diesel_sqlite_pool"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..28d1580 --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +.SUFFIXES: .md .html + +MD = index.md contact.md about.md 404.md thanks.md +HTML = $(MD:.md=.html) +COPY = form.html style.css script.js logo.webp hamburger.svg + +all: static $(MD) + copy $(COPY) static + +static: + mkdir -p static + +.md.html: + ./md.py gen/$< >static/$@ diff --git a/Rocket.toml b/Rocket.toml new file mode 100644 index 0000000..a85d3ef --- /dev/null +++ b/Rocket.toml @@ -0,0 +1,2 @@ +[global.databases] +db = { url = "db/db.sql" } diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..06e695e --- /dev/null +++ b/build.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +mkdir -p static + +cd gen +cp form.html style.css script.js logo.webp hamburger.svg ../static + +for md in index.md about.md future.md contact.md thanks.md 404.md ; do + ../md.py $md >../static/${md%.*}.html +done diff --git a/db/01-primary/down.sql b/db/01-primary/down.sql new file mode 100644 index 0000000..ac75a8b --- /dev/null +++ b/db/01-primary/down.sql @@ -0,0 +1,8 @@ +DROP TABLE gender; +DROP TABLE ethnicity; +DROP TABLE medication; +DROP TABLE masculine; +DROP TABLE masculine_sex; +DROP TABLE feminine; +DROP TABLE feminine_sex; +DROP TABLE entry; diff --git a/db/01-primary/up.sql b/db/01-primary/up.sql new file mode 100644 index 0000000..06bbe5f --- /dev/null +++ b/db/01-primary/up.sql @@ -0,0 +1,234 @@ +-- hrtime - transgender survey website +-- Copyright (C) 2025 Olive +-- see LICENCE file for licensing information + +CREATE TABLE IF NOT EXISTS entry ( + id INTEGER PRIMARY KEY, + timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, + + birthdate DATETIME NOT NULL, + country TEXT NOT NULL, + + medication TEXT NOT NULL, + conditions TEXT NOT NULL, + other TEXT NOT NULL, + blood_test BOOLEAN NOT NULL, + + feedback TEXT NOT NULL, + heard TEXT NOT NULL +); + +CREATE TABLE IF NOT EXISTS gender ( + id INTEGER PRIMARY KEY, + entry INTEGER NOT NULL, + + male BOOLEAN NOT NULL, + female BOOLEAN NOT NULL, + nonbinary BOOLEAN NOT NULL, + agender BOOLEAN NOT NULL, + genderfluid BOOLEAN NOT NULL, + genderqueer BOOLEAN NOT NULL, + demigender BOOLEAN NOT NULL, + questioning BOOLEAN NOT NULL, + other BOOLEAN NOT NULL, + + FOREIGN KEY(entry) REFERENCES entry(id) +); + +CREATE TABLE IF NOT EXISTS ethnicity ( + id INTEGER PRIMARY KEY, + entry INTEGER NOT NULL, + + african_american BOOLEAN NOT NULL, + east_asian BOOLEAN NOT NULL, + south_asian BOOLEAN NOT NULL, + southeast_asian BOOLEAN NOT NULL, + hispanic BOOLEAN NOT NULL, + middle_eastern_north_african BOOLEAN NOT NULL, + subsaharan_african BOOLEAN NOT NULL, + white BOOLEAN NOT NULL, + native_american BOOLEAN NOT NULL, + pacific_islander BOOLEAN NOT NULL, + other BOOLEAN NULL, + + FOREIGN KEY(entry) REFERENCES entry(id) +); + +CREATE TABLE IF NOT EXISTS medication ( + id INTEGER PRIMARY KEY, + entry INTEGER NOT NULL, + + med TEXT NOT NULL, + method TEXT NOT NULL, + amount TEXT NOT NULL, + frequency TEXT NOT NULL, + start DATETIME NOT NULL, + end DATETIME NOT NULL, + ongoing BOOLEAN NOT NULL, + stop_reason TEXT NOT NULL, + + FOREIGN KEY(entry) REFERENCES entry(id) +); + +CREATE TABLE IF NOT EXISTS masculine ( + id INTEGER PRIMARY KEY, + entry INTEGER NOT NULL, + +-- skin + thicker_skin BOOLEAN NOT NULL, + acne_oily_skin BOOLEAN NOT NULL, + stronger_nails BOOLEAN NOT NULL, + increased_perspiration BOOLEAN NOT NULL, + decreased_perspiration BOOLEAN NOT NULL, + body_odour BOOLEAN NOT NULL, + +-- hair + facial_body_hair_growth BOOLEAN NOT NULL, + male_pattern_baldness BOOLEAN NOT NULL, + +-- body shape + weight_gain BOOLEAN NOT NULL, + pelvic_bone_structure BOOLEAN NOT NULL, + fat_redistribution BOOLEAN NOT NULL, + increased_muscle_mass BOOLEAN NOT NULL, + face BOOLEAN NOT NULL, + +-- emotions + increased_irritability BOOLEAN NOT NULL, + sex_orientation BOOLEAN NOT NULL, + +-- sensation + improved_smell BOOLEAN NOT NULL, + worsened_smell BOOLEAN NOT NULL, + dulled_taste_smell BOOLEAN NOT NULL, + +-- miscellaneous + deeper_voice BOOLEAN NOT NULL, + cessation_of_menstruation BOOLEAN NOT NULL, + sleep_apnea BOOLEAN NOT NULL, + rise_in_cholesterol BOOLEAN NOT NULL, + high_blood_pressure BOOLEAN NOT NULL, + polycythemia BOOLEAN NOT NULL, + cramps BOOLEAN NOT NULL, + + increased_appetite BOOLEAN NOT NULL, + decreased_appetite BOOLEAN NOT NULL, + increased_drug_tolerance BOOLEAN NOT NULL, + decreased_drug_tolerance BOOLEAN NOT NULL, + improved_sleep BOOLEAN NOT NULL, + worsened_sleep BOOLEAN NOT NULL, + feeling_warmer BOOLEAN NOT NULL, + feeling_colder BOOLEAN NOT NULL, + other TEXT NOT NULL, + + FOREIGN KEY(entry) REFERENCES entry(id) +); + +CREATE TABLE IF NOT EXISTS masculine_sex ( + id INTEGER PRIMARY KEY, + entry INTEGER NOT NULL, + + genital_moisture_odour BOOLEAN NOT NULL, + + clitoral_growth BOOLEAN NOT NULL, + vaginal_atrophy BOOLEAN NOT NULL, + vaginal_dryness BOOLEAN NOT NULL, + vaginal_discharge BOOLEAN NOT NULL, + + genital_sensitivity BOOLEAN NOT NULL, + + orgasm BOOLEAN NOT NULL, + increased_libido BOOLEAN NOT NULL, + decreased_libido BOOLEAN NOT NULL, + + other TEXT NOT NULL, + + FOREIGN KEY(entry) REFERENCES entry(id) +); + +CREATE TABLE IF NOT EXISTS feminine ( + id INTEGER PRIMARY KEY, + entry INTEGER NOT NULL, + +-- skin + softer_skin BOOLEAN NOT NULL, + less_oily_skin BOOLEAN NOT NULL, + thinner_softer_fingernails BOOLEAN NOT NULL, + increased_perspiration BOOLEAN NOT NULL, + decreased_perspiration BOOLEAN NOT NULL, + body_odour BOOLEAN NOT NULL, + +-- hair + reduced_body_hair BOOLEAN NOT NULL, + hairline BOOLEAN NOT NULL, + +-- body shape + slimmer_hands_wrists BOOLEAN NOT NULL, + smaller_feet BOOLEAN NOT NULL, + breast_growth BOOLEAN NOT NULL, + fat_redistribution BOOLEAN NOT NULL, + reduced_muscle_mass BOOLEAN NOT NULL, + face BOOLEAN NOT NULL, + +-- emotions + increased_emotionality_sensitivity BOOLEAN NOT NULL, + sex_orientation BOOLEAN NOT NULL, + +-- sensation + improved_smell BOOLEAN NOT NULL, + worsened_smell BOOLEAN NOT NULL, + taste BOOLEAN NOT NULL, + +-- miscellaneous + increased_flexibility BOOLEAN NOT NULL, + + increased_appetite BOOLEAN NOT NULL, + decreased_appetite BOOLEAN NOT NULL, + increased_drug_tolerance BOOLEAN NOT NULL, + decreased_drug_tolerance BOOLEAN NOT NULL, + feeling_warmer BOOLEAN NOT NULL, + feeling_colder BOOLEAN NOT NULL, + improved_sleep BOOLEAN NOT NULL, + worsened_sleep BOOLEAN NOT NULL, + + other TEXT NOT NULL, + +-- cyclical + cramping BOOLEAN NOT NULL, + bloating BOOLEAN NOT NULL, + gas BOOLEAN NOT NULL, + unstable_emotions BOOLEAN NOT NULL, + pains BOOLEAN NOT NULL, + breast_tenderness BOOLEAN NOT NULL, + acne BOOLEAN NOT NULL, + fatigue BOOLEAN NOT NULL, + appetite_cravings BOOLEAN NOT NULL, + migranes BOOLEAN NOT NULL, + + cycle TEXT NOT NULL, + + FOREIGN KEY(entry) REFERENCES entry(id) +); + +CREATE TABLE IF NOT EXISTS feminine_sex ( + id INTEGER PRIMARY KEY, + entry INTEGER NOT NULL, + + genital_moisture_odour BOOLEAN NOT NULL, + genital_color_texture BOOLEAN NOT NULL, + + fewer_erections BOOLEAN NOT NULL, + clear_ejaculate BOOLEAN NOT NULL, + testicular_atrophy BOOLEAN NOT NULL, + + increased_genital_sensitivity BOOLEAN NOT NULL, + genital_response BOOLEAN NOT NULL, + + orgasm BOOLEAN NOT NULL, + increased_libido BOOLEAN NOT NULL, + decreased_libido BOOLEAN NOT NULL, + + other TEXT NOT NULL, + + FOREIGN KEY(entry) REFERENCES entry(id) +); diff --git a/diesel.toml b/diesel.toml new file mode 100644 index 0000000..1ad890b --- /dev/null +++ b/diesel.toml @@ -0,0 +1,9 @@ +# For documentation on how to configure this file, +# see https://diesel.rs/guides/configuring-diesel-cli + +[print_schema] +file = "src/schema.rs" +custom_type_derives = ["diesel::query_builder::QueryId", "Clone"] + +[migrations_directory] +dir = "db" diff --git a/gen/404.md b/gen/404.md new file mode 100644 index 0000000..46369b1 --- /dev/null +++ b/gen/404.md @@ -0,0 +1,2 @@ +404 Not Found +The content specified by the address sent could not be found on this server. If you manually entered the link, please check your spelling and try again. diff --git a/gen/about.md b/gen/about.md new file mode 100644 index 0000000..e0e148c --- /dev/null +++ b/gen/about.md @@ -0,0 +1,2 @@ +About Us +Hi! My name is Lucas (he/they). I founded HRTimelines with my collaborator back in December, 2022. As two trans engineering students, we saw a gap in trans healthcare information and decided to make a difference in a field we know from experience. We are not doctors, but we are motivated to help other trans people hoping to start HRT and medical professionals looking to work with trans patients. Since we started, our team has grown with other trans researchers and students assisting in our website development and data analysis. diff --git a/gen/contact.md b/gen/contact.md new file mode 100644 index 0000000..790fe1a --- /dev/null +++ b/gen/contact.md @@ -0,0 +1,6 @@ +Contact Us +If you have any questions, feedback, or just want to chat, please reach out! Feel free to use the form below, email us, or reach out on Instagram. +- [Instagram](https://instagram.com/hrtimelines?igshid=MzMyNGUyNmU2YQ%3D%3D&utm_source=qr) +- [Email](mailto:hrtimelines@gmail.com) +- [Feedback Form](https://forms.gle/eZRGF7BgagHJ668H7) +- [Join Our Mailing List](https://forms.gle/dgiUmjaUQG8mNyJP7) diff --git a/gen/foot.html b/gen/foot.html new file mode 100644 index 0000000..7507f55 --- /dev/null +++ b/gen/foot.html @@ -0,0 +1,4 @@ + + + + diff --git a/gen/form.html b/gen/form.html new file mode 100644 index 0000000..0e428e5 --- /dev/null +++ b/gen/form.html @@ -0,0 +1,736 @@ + + + + + + + + + + +HRTimelines — Form + + + +
+
+
+logo +

HRTimelines

+
+ +
+
+

The following survey inquires about the type and physical effects of the HRT you use. Responses will be used to draw conclusions about the physical effects of HRT and to possibly correlate the timeline of effects with age, ethnicity, types of medications, medication dosage, the use of other medications, or medical conditions.

+

Data is encrypted and stored in the eastern United States. We do not collect identifying information (such as name or email). Data is retained for future HRTimelines projects, but will not be shared outside of the research team or for any other research or commercial purposes.

+

The survey takes around ten minutes to complete, and you must be eighteen years of age to participate in our research. For some questions, exact dates are helpful, but a best guess is acceptable. The form will not save your responses over different sessions; it is recommended that you fill the form in one sitting.

+
+
+
+

Consent

+ + +
+ + +
+
+

Demographics

+ + +
+ + +

How would you label your gender? Select all that apply.

+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +

How would you label your ethnicity? Select all that apply.

+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +

Which type of hormone replacement therapy do you use?

+ + +
+ + +
+
+

Masculinizing

+

Feminizing

+

Please input your medication history according to the format seen in the first table below. If you take injections, please specify the volume and concentration in the amount column and specify whether you take intramuscular or subcutaneous injections in the method column. For each change in dosage, please add a new entry. You do not need to fill in a reason for termination for a change in dosage.

+
+
+ + +
+ + +
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ +

+

General Effects

+

Please check any of these possible effects you have experienced while taking hormone replacement therapy.

+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +

Please mention if you have experienced any other changes, specifically non-sexual and not related to genitalia, than those listed above and/or further explain the effects you have experienced below.

+ +

+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +

Please mention if you have experienced any other changes, specifically non-sexual and not related to genitalia, than those listed above and/or further explain the effects you have experienced below.

+ +

+
+
+

Cyclical Effects

+

Please check any of these possible effects you have experienced while taking hormone replacement therapy.

+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +

Please mention if you have experienced any other changes, specifically cyclical, than those listed above and/or further explain the effects you have experienced below.

+ +

+
+

Sexual Effects

+

The following effects pertain to sexuality and genitalia. If you are comfortable answering these questions, please check the following box.

+ + +
+

Please check any of these possible effects you have experienced while taking hormone replacement therapy.

+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +

Please mention if you have experienced any other changes, specifically sexual or related to genitalia, than those listed above and/or further explain the effects you have experienced below.

+ +

+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +

Please mention if you have experienced any other changes, specifically sexual or related to genitalia, than those listed above and/or further explain the effects you have experienced below.

+ +

+
+
+
+
+

General

+

Are you taking or have you taken medications not classified as a part of hormone replacement therapy which may affect, cause, or interfere with any of the effects listed above?

+ +

Do you have any medical conditions which may affect, cause, or interfere with any of the effects listed above?

+ +
+
+ + +
+
+

Final Thoughts

+

How did you hear about this survey?

+ +

Is there anything related to your hormone replacement therapy that you would like us to know?

+ +

Do you have any other feedback for HRTimelines?

+ +
+
+ +
+
+ + diff --git a/gen/future.md b/gen/future.md new file mode 100644 index 0000000..78a1c18 --- /dev/null +++ b/gen/future.md @@ -0,0 +1,10 @@ +Future Plans +Our primary goal is to provide trans people with evidence-based expectations for their medical transition. Currently, we run surveys asking healthcare questions and present that data to reach our goal. We also want to inform trans health decision-making and answer key questions about trans healthcare with evidence. These questions could include the effectiveness of progesterone or the impacts different injection techniques have on physical effects. +Our short term goals include: +- Designing data visualization for our website +- Developing longitudinal research to gain a better resolution of changes over time +- Collecting more information on specific parts of transition +- Increasing our outreach into different trans communities +- Building a community of volunteers to support HRTimelines +We are interested in creating better documentation of our findings, including reports and detailed reviews. We look forward to seeing where this project is going, and we are always looking for feedback and good ideas. If you would like to get in touch, check out our [contacts page](https://hrtimelines.com/contact)! + diff --git a/gen/hamburger.svg b/gen/hamburger.svg new file mode 100644 index 0000000..5ccc696 --- /dev/null +++ b/gen/hamburger.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/gen/head.html b/gen/head.html new file mode 100644 index 0000000..5bda9f0 --- /dev/null +++ b/gen/head.html @@ -0,0 +1,32 @@ + + + + + + + + + + +HRTimelinesTITLE + + + +
+
+
+logo +

HRTimelines

+
+ +
+
diff --git a/gen/index.md b/gen/index.md new file mode 100644 index 0000000..4bc13d5 --- /dev/null +++ b/gen/index.md @@ -0,0 +1,5 @@ + +HRTimelines is a trans healthcare research project by trans people for trans people. We study the physical effects of Hormone Replacement Therapy (HRT) in transgender individuals through survey based research. Our goal is to create better timelines for the effects of HRT while taking into account other factors including application method, dosage, age, and ethnicity. +Our first survey was built in Google Forms and launched in early January, 2023. We received over 150 responses from trans people all around the world, and we have found many interesting insights. The data is still being analyzed, and we hope to share results on our website soon. +Currently, we are collecting responses for the second version of our survey and working on developing longitudinal studies. These will collect more data on individuals, gaining a better understanding of how HRT affects people over time. We are also getting ready to start a project studying the effects of progesterone in transfeminine people. If you are interested in participating and on HRT, follow us on [Instagram](https://instagram.com/hrtimelines?igshid=MzMyNGUyNmU2YQ%3D%3D&utm_source=qr) and shoot us an [email](mailto:hrtimelines@gmail.com). If you have other questions or feedback, check out our [contacts page](https://hrtimelines.com/contact)! +We are currently collecting data on when trans people start HRT, what medications they use, and what physical effects they have experienced. If you are interested in participating, please fill out [this form](https://hrtimelines.com/form). diff --git a/gen/logo.webp b/gen/logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..eb17315ae0666390af7667f1ac583bea22740898 GIT binary patch literal 12688 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 K7aRZp00029zT~O^ literal 0 HcmV?d00001 diff --git a/gen/script.js b/gen/script.js new file mode 100644 index 0000000..d718582 --- /dev/null +++ b/gen/script.js @@ -0,0 +1,58 @@ +function con() { + if ($('input[class=con]:checked').length == 2) { + $('.all').show(); + hrt(); + } else { + $('.all').hide(); + } +} + +function hrt() { + const val = $('input[name=hrt]:checked').attr('id'); + var chk = ''; + if (val == 't1') + chk = 'masc'; + else if (val == 't2') + chk = 'fem'; + + if (chk == 'masc' || chk == 'fem') { + $('.some').show(); + $('.' + chk).show(); + const not = chk == 'masc' ? 'fem' : 'masc'; + $('.' + not).hide(); + } else { + $('.some').hide(); + } +} + +function sex() { + if ($('input[name=sex]:checked').length == 1) { + $('.hide').show(); + hrt(); + } else { + $('.hide').hide(); + } +} + +$(document).ready(function() { con(); hrt(); sex(); }); +$(document).on('change', 'input[class=con]', con); +$(document).on('change', 'input[name=hrt]', hrt); +$(document).on('change', 'input[name=sex]', sex); + +var num = 1; +function row() { + let text = $('.medication div:first').html() + let newtext = text.replace(/\[0\]/g, '[' + num + ']'); + $('.medication').append('
' + newtext + '
'); +} + +var opened = false; +$(document).on('click', function(event) { + if (event.target.id == 'hamburger' && !opened) { + $('nav').css('display', 'block'); + opened = true; + } else { + $('nav').css('display', 'none'); + opened = false; + } +}); diff --git a/gen/style.css b/gen/style.css new file mode 100644 index 0000000..046000b --- /dev/null +++ b/gen/style.css @@ -0,0 +1,208 @@ +:root { + --w: #F6F7F7; + --d: #000000; + --b: #2BD2FF; + --p: #FC9DB8; + --g: #545454; + --h: #54545450; +} + +::selection { + background-color: var(--h); +} + +html { + color: var(--d); + background-color: var(--w); + + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; + font-feature-settings:normal; + font-variation-settings:normal + + font-size: 12pt; + line-height: 1.5em; + word-spacing: 0.04ch; + + overflow-x: hidden; + + height: 100%; +} + +body { + margin: 0; + padding: 0 0.75em; + overflow-x: hidden; + + height: 100%; +} + +body > * { + width: 100%; + max-width: max(70ch, 60%); + margin: 0 auto; + margin-bottom: 1em; +} + +header { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + + border-image: repeating-linear-gradient(to right, + var(--b), var(--b) 5px, transparent 5px, transparent 10px, + var(--p) 10px, var(--p) 15px, transparent 15px, transparent 20px); + border-image-width: 0 0 3px 0; + border-image-slice: 1; + + margin-bottom: 1rem; +} + +header img { + margin: 0.5rem 1rem 0.5rem 0; +} + +header div { + display: flex; + flex-direction: row; + align-items: center; +} + +#nav { + position: relative; +} + +#hamburger:hover, #hamburger:focus, #hamburger:active { + cursor: pointer; +} + +#nav img { + padding: 0; + margin: 0; +} + +nav { + position: absolute; + display: none; + + z-index: 1; + background-color: var(--w); + right: 0px; + top: 35px; + min-width: 160px; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); +} + +nav a { + display: block; + + text-align: right; + + border-image: repeating-linear-gradient(to right, + var(--b), var(--b) 5px, transparent 5px, transparent 10px, + var(--p) 10px, var(--p) 15px, transparent 15px, transparent 20px); + border-image-width: 2px 0 0 0; + border-image-slice: 1; + + padding: 4px 4px 4px 0; + margin: 0; +} + +nav a:last-child { + border-image-width: 2px 0 2px 0; +} + +a { + color: var(--d); + text-decoration: none; + + transition-property: color; + transition-duration: 0.5s; +} + +a:not(header a) { + border-image: repeating-linear-gradient(to right, + var(--b), var(--b) 5px, transparent 5px, transparent 10px, + var(--p) 10px, var(--p) 15px, transparent 15px, transparent 20px); + border-image-width: 0 0 2px 0; + border-image-slice: 1; +} + +a:hover, a:focus, a:active { + color: var(--g); +} + +h1 { + font-size: 24pt; + font-weight: 700; +} + +h1:not(header h1), h2 { + margin: 0; + padding-bottom: 0.5em; + + border-image: repeating-linear-gradient(to right, + var(--b), var(--b) 5px, transparent 5px, transparent 10px, + var(--p) 10px, var(--p) 15px, transparent 15px, transparent 20px); + border-image-width: 0 0 3px 0; + border-image-slice: 1; +} + +section + section { + margin-top: 2.5em; +} + +.medication div { + border-image: repeating-linear-gradient(to right, + var(--b), var(--b) 5px, transparent 5px, transparent 10px, + var(--p) 10px, var(--p) 15px, transparent 15px, transparent 20px); + border-image-width: 2px 0 0 0; + border-image-slice: 1; + + padding: 1em; +} + +.medication div:last-child { + border-image-width: 2px 0 2px 0; +} + +ul { + list-style: none; + padding: 0; + margin: 0; +} + +ul li::before { + content: "–"; + margin: 0.25em 0; + padding-right: 1em; +} + +ul li { + position: relative; + left: 1.5em; + margin: 0.25em 1.5em 0.25em 0; + text-indent: -1.5em; +} + +table { + overflow: scroll; + display: inline-block; + max-width: 70ch; + padding-bottom: 10px; +} + +td { + white-space: nowrap; + padding: 0 5px; +} + +div:not(header div) { + padding: 0; + margin: 0; + border: 0; +} + +textarea { + max-width: calc(100% - 0.75em); +} diff --git a/gen/thanks.md b/gen/thanks.md new file mode 100644 index 0000000..47b523b --- /dev/null +++ b/gen/thanks.md @@ -0,0 +1,2 @@ +Thanks! +Thank you for submitting the form. Your response has been received. diff --git a/md.py b/md.py new file mode 100755 index 0000000..d2a472d --- /dev/null +++ b/md.py @@ -0,0 +1,149 @@ +#!/bin/python3 +# hrtime - transgender research website +# Copyright (C) 2025 Olive +# see LICENCE file for licensing information + +import re +import sys + + +def ch(st: str) -> str: + st = re.sub(r'&', r'&', st) + st = re.sub(r'>', r'>', st) + st = re.sub(r'<', r'<', st) + return st + + +def qch(st: str) -> str: + return re.sub('\'', r''', ch(st)) + + +def mdh(line: str) -> str: + ret = '' + while len(line) > 0: + match = re.match(r'!\[(.*?)\]\((.*?)\)', line) + if match != None: + line = line[match.span()[1]:] + ret += f"" + \ + f'{ch(match.group(1))}' + continue + + match = re.match(r'\[(.*?)\]\(([^ ]*)\)', line) + if match != None: + line = line[match.span()[1]:] + ret += f"{ch(match.group(1))}' + continue + + match = re.match(r'`(.)(.*?)`', line) + if match != None: + line = line[match.span()[1]:] + ret += r"{ch(match.group(2))}' + continue + + ret += ch(line[0]) + line = line[1:] + + ret = re.sub(r'NOBREAK', r'⁠', ret) + return ret + + +def md(line: str) -> str: + # allows '|' and '||' escaping to work + ret, do = '', True + for sec in line.strip().split('|'): + if len(sec) == 0: + ret += '|' + else: + ret += mdh(sec) if do else sec + do = not do + return ret + + +def media(line: str): + file, alt = tuple(line.strip().split('|')) + file = qch(file) + if file[-5:] in ('.webp'): + print(f"{qch(alt)}") + if file[-4:] in ('.mp4'): + print('') + if file[-4:] in ('.pdf'): + print(f"") + print(f"{ch(alt)}") + print('') + + +def doc(lines: list[str]): + head = '' + with open('head.html', 'r') as file: + head = file.read() + + lines[0] = lines[0].strip() + if len(lines[0]) > 0: + lines[0] = ' — ' + lines[0] + head = re.sub(r'TITLE', lines[0], head, count=2) + print(head, end='') + lines = lines[1:] + + mode='' + for line in lines: + if line[1:4] == ' ': + if mode != '': + if line[0] != '/': + cls = f" class='{line[0]}'" + print(f'
', end='')
+                mode = '
' + print(ch(line[4:].rstrip())) + continue + elif line[:2] == ' ': + if mode != '': + print("
    ") + mode = '
' + print(f'
  • {md(line[2:])}
  • ') + continue + elif line[:2] == '- ': + if mode != '': + print('
      ') + mode = '
    ' + print(f'
  • {md(line[2:])}
  • ') + continue + + if mode != '': + print(mode) + mode = '' + + if len(line) == 1: + print('
    \n
    ') + elif line[:2] == '# ': + print(f'

    {md(line[2:])}

    ') + elif line[:3] == '## ': + print(f'

    {md(line[3:])}

    ') + elif line[:2] == '! ': + media(line[2:]) + elif line[:2] == '@ ': + title, link, desc, date = tuple(line[2:].split('|')) + print('
    \n
    ') + print(f"

    {md(title)}

    ") + print('
    \n
    ') + print(f'

    {md(desc)}

    ') + print(f'

    ()

    ') + print('
    \n
    ') + else: + print('

    ' + md(line) + '

    ') + + if mode != '': + print(mode) + + with open('foot.html', 'r') as file: + print(file.read(), end='') + + +if __name__ == '__main__': + if len(sys.argv) != 2: + print('usage: md [file]') + else: + with open(sys.argv[1], 'r') as file: + doc(list(file)) diff --git a/src/form.rs b/src/form.rs new file mode 100644 index 0000000..7511f47 --- /dev/null +++ b/src/form.rs @@ -0,0 +1,99 @@ +/* hrtime - transgender survey website + * Copyright (C) 2025 Olive + * see LICENCE file for licensing information */ + +use std::path::Path; + +use diesel::insert_into; +use diesel::RunQueryDsl; + +use rocket::form::{Form, FromForm}; +use rocket::fs::NamedFile; + +use crate::Database; +use crate::models; +use crate::schema::*; + +#[derive(FromForm, Debug)] +pub struct Primary { + hrt: String, + sex: bool, + + entry: models::Entry, + gender: models::Gender, + ethnicity: models::Ethnicity, + meds: Vec, + masc: models::Masculine, + mascsex: models::MasculineSex, + fem: models::Feminine, + femsex: models::FeminineSex, +} + +#[rocket::post("/", data="")] +pub async fn form( + mut form: Form, + conn: Database, +) -> Option { + let entry = form.entry.clone(); + let id = conn.run(|conn| insert_into(entry::table) + .values(entry) + .returning(entry::dsl::id) + .get_result::>(conn) + .unwrap()).await.unwrap(); + + form.gender.entry = id; + form.ethnicity.entry = id; + for med in form.meds.iter_mut() { + med.entry = id; + } + + let gender = form.gender.clone(); + conn.run(|conn| insert_into(gender::table) + .values(gender) + .execute(conn) + .unwrap()).await; + let ethnicity = form.ethnicity.clone(); + conn.run(|conn| insert_into(ethnicity::table) + .values(ethnicity) + .execute(conn) + .unwrap()).await; + let meds = form.meds.clone(); + conn.run(|conn| insert_into(medication::table) + .values(meds) + .execute(conn) + .unwrap()).await; + + if form.hrt == "Masculinizing" { + form.masc.entry = id; + let masc = form.masc.clone(); + conn.run(|conn| insert_into(masculine::table) + .values(masc) + .execute(conn) + .unwrap()).await; + if form.sex { + form.mascsex.entry = id; + let mascsex = form.mascsex.clone(); + conn.run(|conn| insert_into(masculine_sex::table) + .values(mascsex) + .execute(conn) + .unwrap()).await; + } + } else { + form.fem.entry = id; + let fem = form.fem.clone(); + conn.run(|conn| insert_into(feminine::table) + .values(fem) + .execute(conn) + .unwrap()).await; + if form.sex { + form.femsex.entry = id; + let femsex = form.femsex.clone(); + conn.run(|conn| insert_into(feminine_sex::table) + .values(femsex) + .execute(conn) + .unwrap()).await; + } + } + + return NamedFile::open(Path::new("/var/www/thanks.html")).await.ok(); +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..43d69c6 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,50 @@ +/* hrtime - transgender survey website + * Copyright (C) 2025 Olive + * see LICENCE file for licensing information */ + +pub mod schema; +pub mod models; +pub mod form; + +use std::path::{Path, PathBuf}; + +use rocket::Request; +use rocket::fs::NamedFile; +use rocket_sync_db_pools::{database, diesel}; + +#[database("db")] +pub struct Database(diesel::SqliteConnection); + +#[rocket::get("/")] +async fn files(file: PathBuf) -> Option { + let pages = vec!["about", "future", "contact", "form", "thanks"]; + let other = vec!["hamburger.svg", "logo.webp", "script.js", "style.css"]; + + let mut path = match file.to_str() { + Some(path) => path.to_owned(), + None => return NamedFile::open(Path::new("/var/www/404.html")).await.ok(), + }; + + if path == "" { + path = "index.html".to_string(); + } else if pages.contains(&path.as_str()) { + path += ".html"; + } else if !other.contains(&path.as_str()) { + path = "404.html".to_string(); + } + NamedFile::open(Path::new("/var/www/").join(path)).await.ok() +} + +#[rocket::catch(404)] +async fn not_found(_: &Request<'_>) -> Option { + NamedFile::open(Path::new("/var/www/404.html")).await.ok() +} + +#[rocket::launch] +fn rocket() -> _ { + rocket::build() + .attach(Database::fairing()) + .mount("/form", rocket::routes![form::form]) + .mount("/", rocket::routes![files]) + .register("/", rocket::catchers![not_found]) +} diff --git a/src/models.rs b/src/models.rs new file mode 100644 index 0000000..f18a94a --- /dev/null +++ b/src/models.rs @@ -0,0 +1,202 @@ +/* hrtime - transgender survey website + * Copyright (C) 2025 Olive + * see LICENCE file for licensing information */ + +use diesel::prelude::*; + +use rocket::form::FromForm; + +use crate::schema::*; + +#[derive(Insertable, FromForm, Clone, Debug)] +#[diesel(table_name = entry)] +pub struct Entry { + birthdate: String, + country: String, + medication: String, + conditions: String, + other: String, + blood_test: bool, + feedback: String, + heard: String, +} + +#[derive(Insertable, FromForm, Clone, Debug)] +#[diesel(table_name = gender)] +pub struct Gender { + #[field(default = 0)] + pub entry: i32, + + male: bool, + female: bool, + nonbinary: bool, + agender: bool, + genderfluid: bool, + genderqueer: bool, + demigender: bool, + questioning: bool, + other: bool, +} + +#[derive(Insertable, FromForm, Clone, Debug)] +#[diesel(table_name = ethnicity)] +pub struct Ethnicity { + #[field(default = 0)] + pub entry: i32, + + african_american: bool, + east_asian: bool, + south_asian: bool, + southeast_asian: bool, + hispanic: bool, + middle_eastern_north_african: bool, + subsaharan_african: bool, + white: bool, + native_american: bool, + pacific_islander: bool, + other: bool, +} + +#[derive(Insertable, FromForm, Clone, Debug)] +#[diesel(table_name = medication)] +pub struct Medication { + #[field(default = 0)] + pub entry: i32, + + med: String, + method: String, + amount: String, + frequency: String, + start: String, + end: String, + ongoing: bool, + stop_reason: String, +} + +#[derive(Insertable, FromForm, Clone, Debug)] +#[diesel(table_name = masculine)] +pub struct Masculine { + #[field(default = 0)] + pub entry: i32, + + thicker_skin: bool, + acne_oily_skin: bool, + stronger_nails: bool, + increased_perspiration: bool, + decreased_perspiration: bool, + body_odour: bool, + facial_body_hair_growth: bool, + male_pattern_baldness: bool, + weight_gain: bool, + pelvic_bone_structure: bool, + fat_redistribution: bool, + increased_muscle_mass: bool, + face: bool, + increased_irritability: bool, + sex_orientation: bool, + improved_smell: bool, + worsened_smell: bool, + dulled_taste_smell: bool, + deeper_voice: bool, + cessation_of_menstruation: bool, + sleep_apnea: bool, + rise_in_cholesterol: bool, + high_blood_pressure: bool, + polycythemia: bool, + cramps: bool, + increased_appetite: bool, + decreased_appetite: bool, + increased_drug_tolerance: bool, + decreased_drug_tolerance: bool, + improved_sleep: bool, + worsened_sleep: bool, + feeling_warmer: bool, + feeling_colder: bool, + other: String, +} + +#[derive(Insertable, FromForm, Clone, Debug)] +#[diesel(table_name = masculine_sex)] +pub struct MasculineSex { + #[field(default = 0)] + pub entry: i32, + + genital_moisture_odour: bool, + clitoral_growth: bool, + vaginal_atrophy: bool, + vaginal_dryness: bool, + vaginal_discharge: bool, + genital_sensitivity: bool, + orgasm: bool, + increased_libido: bool, + decreased_libido: bool, + other: String, +} + +#[derive(Insertable, FromForm, Clone, Debug)] +#[diesel(table_name = feminine)] +pub struct Feminine { + #[field(default = 0)] + pub entry: i32, + + softer_skin: bool, + less_oily_skin: bool, + thinner_softer_fingernails: bool, + increased_perspiration: bool, + decreased_perspiration: bool, + body_odour: bool, + reduced_body_hair: bool, + hairline: bool, + slimmer_hands_wrists: bool, + smaller_feet: bool, + breast_growth: bool, + fat_redistribution: bool, + reduced_muscle_mass: bool, + face: bool, + increased_emotionality_sensitivity: bool, + sex_orientation: bool, + improved_smell: bool, + worsened_smell: bool, + taste: bool, + increased_flexibility: bool, + increased_appetite: bool, + decreased_appetite: bool, + increased_drug_tolerance: bool, + decreased_drug_tolerance: bool, + feeling_warmer: bool, + feeling_colder: bool, + improved_sleep: bool, + worsened_sleep: bool, + other: String, + + cramping: bool, + bloating: bool, + gas: bool, + unstable_emotions: bool, + pains: bool, + breast_tenderness: bool, + acne: bool, + fatigue: bool, + appetite_cravings: bool, + migranes: bool, + cycle: String, +} + +#[derive(Insertable, FromForm, Clone, Debug)] +#[diesel(table_name = feminine_sex)] +pub struct FeminineSex { + #[field(default = 0)] + pub entry: i32, + + genital_moisture_odour: bool, + genital_color_texture: bool, + fewer_erections: bool, + clear_ejaculate: bool, + testicular_atrophy: bool, + increased_genital_sensitivity: bool, + genital_response: bool, + orgasm: bool, + increased_libido: bool, + decreased_libido: bool, + other: String, +} diff --git a/src/schema.rs b/src/schema.rs new file mode 100644 index 0000000..9f7a983 --- /dev/null +++ b/src/schema.rs @@ -0,0 +1,207 @@ +// @generated automatically by Diesel CLI. + +diesel::table! { + entry (id) { + id -> Nullable, + timestamp -> Nullable, + birthdate -> Timestamp, + country -> Text, + medication -> Text, + conditions -> Text, + other -> Text, + blood_test -> Bool, + feedback -> Text, + heard -> Text, + } +} + +diesel::table! { + ethnicity (id) { + id -> Nullable, + entry -> Integer, + african_american -> Bool, + east_asian -> Bool, + south_asian -> Bool, + southeast_asian -> Bool, + hispanic -> Bool, + middle_eastern_north_african -> Bool, + subsaharan_african -> Bool, + white -> Bool, + native_american -> Bool, + pacific_islander -> Bool, + other -> Nullable, + } +} + +diesel::table! { + feminine (id) { + id -> Nullable, + entry -> Integer, + softer_skin -> Bool, + less_oily_skin -> Bool, + thinner_softer_fingernails -> Bool, + increased_perspiration -> Bool, + decreased_perspiration -> Bool, + body_odour -> Bool, + reduced_body_hair -> Bool, + hairline -> Bool, + slimmer_hands_wrists -> Bool, + smaller_feet -> Bool, + breast_growth -> Bool, + fat_redistribution -> Bool, + reduced_muscle_mass -> Bool, + face -> Bool, + increased_emotionality_sensitivity -> Bool, + sex_orientation -> Bool, + improved_smell -> Bool, + worsened_smell -> Bool, + taste -> Bool, + increased_flexibility -> Bool, + increased_appetite -> Bool, + decreased_appetite -> Bool, + increased_drug_tolerance -> Bool, + decreased_drug_tolerance -> Bool, + feeling_warmer -> Bool, + feeling_colder -> Bool, + improved_sleep -> Bool, + worsened_sleep -> Bool, + other -> Text, + cramping -> Bool, + bloating -> Bool, + gas -> Bool, + unstable_emotions -> Bool, + pains -> Bool, + breast_tenderness -> Bool, + acne -> Bool, + fatigue -> Bool, + appetite_cravings -> Bool, + migranes -> Bool, + cycle -> Text, + } +} + +diesel::table! { + feminine_sex (id) { + id -> Nullable, + entry -> Integer, + genital_moisture_odour -> Bool, + genital_color_texture -> Bool, + fewer_erections -> Bool, + clear_ejaculate -> Bool, + testicular_atrophy -> Bool, + increased_genital_sensitivity -> Bool, + genital_response -> Bool, + orgasm -> Bool, + increased_libido -> Bool, + decreased_libido -> Bool, + other -> Text, + } +} + +diesel::table! { + gender (id) { + id -> Nullable, + entry -> Integer, + male -> Bool, + female -> Bool, + nonbinary -> Bool, + agender -> Bool, + genderfluid -> Bool, + genderqueer -> Bool, + demigender -> Bool, + questioning -> Bool, + other -> Bool, + } +} + +diesel::table! { + masculine (id) { + id -> Nullable, + entry -> Integer, + thicker_skin -> Bool, + acne_oily_skin -> Bool, + stronger_nails -> Bool, + increased_perspiration -> Bool, + decreased_perspiration -> Bool, + body_odour -> Bool, + facial_body_hair_growth -> Bool, + male_pattern_baldness -> Bool, + weight_gain -> Bool, + pelvic_bone_structure -> Bool, + fat_redistribution -> Bool, + increased_muscle_mass -> Bool, + face -> Bool, + increased_irritability -> Bool, + sex_orientation -> Bool, + improved_smell -> Bool, + worsened_smell -> Bool, + dulled_taste_smell -> Bool, + deeper_voice -> Bool, + cessation_of_menstruation -> Bool, + sleep_apnea -> Bool, + rise_in_cholesterol -> Bool, + high_blood_pressure -> Bool, + polycythemia -> Bool, + cramps -> Bool, + increased_appetite -> Bool, + decreased_appetite -> Bool, + increased_drug_tolerance -> Bool, + decreased_drug_tolerance -> Bool, + improved_sleep -> Bool, + worsened_sleep -> Bool, + feeling_warmer -> Bool, + feeling_colder -> Bool, + other -> Text, + } +} + +diesel::table! { + masculine_sex (id) { + id -> Nullable, + entry -> Integer, + genital_moisture_odour -> Bool, + clitoral_growth -> Bool, + vaginal_atrophy -> Bool, + vaginal_dryness -> Bool, + vaginal_discharge -> Bool, + genital_sensitivity -> Bool, + orgasm -> Bool, + increased_libido -> Bool, + decreased_libido -> Bool, + other -> Text, + } +} + +diesel::table! { + medication (id) { + id -> Nullable, + entry -> Integer, + med -> Text, + method -> Text, + amount -> Text, + frequency -> Text, + start -> Timestamp, + end -> Timestamp, + ongoing -> Bool, + stop_reason -> Text, + } +} + +diesel::joinable!(ethnicity -> entry (entry)); +diesel::joinable!(feminine -> entry (entry)); +diesel::joinable!(feminine_sex -> entry (entry)); +diesel::joinable!(gender -> entry (entry)); +diesel::joinable!(masculine -> entry (entry)); +diesel::joinable!(masculine_sex -> entry (entry)); +diesel::joinable!(medication -> entry (entry)); + +diesel::allow_tables_to_appear_in_same_query!( + entry, + ethnicity, + feminine, + feminine_sex, + gender, + masculine, + masculine_sex, + medication, +);