From 3f89ff59f9830229ed4537dd89644c6636444fe6 Mon Sep 17 00:00:00 2001 From: Garen Tyler Date: Sat, 8 Jul 2023 19:54:24 -0600 Subject: [PATCH] Project structure --- .gitattributes | 2 + .github/workflows/clippy.yml | 12 + .gitignore | 7 + Cargo.lock | 656 +++++++++++++++++++++++++++ Cargo.toml | 24 + crates/inferno-protocol/Cargo.toml | 13 + crates/inferno-protocol/build.rs | 24 + crates/inferno-protocol/src/error.rs | 7 + crates/inferno-protocol/src/lib.rs | 4 + crates/inferno-protocol/src/util.rs | 13 + crates/inferno-server/Cargo.toml | 23 + crates/inferno-server/build.rs | 24 + crates/inferno-server/src/config.rs | 207 +++++++++ crates/inferno-server/src/error.rs | 10 + crates/inferno-server/src/lib.rs | 12 + crates/inferno-server/src/main.rs | 48 ++ inferno.toml | 1 + version | 2 + 18 files changed, 1089 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/workflows/clippy.yml create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 crates/inferno-protocol/Cargo.toml create mode 100644 crates/inferno-protocol/build.rs create mode 100644 crates/inferno-protocol/src/error.rs create mode 100644 crates/inferno-protocol/src/lib.rs create mode 100644 crates/inferno-protocol/src/util.rs create mode 100644 crates/inferno-server/Cargo.toml create mode 100644 crates/inferno-server/build.rs create mode 100644 crates/inferno-server/src/config.rs create mode 100644 crates/inferno-server/src/error.rs create mode 100644 crates/inferno-server/src/lib.rs create mode 100644 crates/inferno-server/src/main.rs create mode 100644 inferno.toml create mode 100644 version diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml new file mode 100644 index 0000000..e6ae294 --- /dev/null +++ b/.github/workflows/clippy.yml @@ -0,0 +1,12 @@ +on: [push] +name: Clippy +# Fail on all warnings, including clippy lints. +env: + RUSTFLAGS: "-Dwarnings" +jobs: + clippy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Run Clippy + run: cargo clippy --all-targets --all-features diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2590eaa --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +target +/*.log +/logs +/world +/server-icon.png +/composition.toml diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..4890ac0 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,656 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" + +[[package]] +name = "anstyle-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1640e5cc7fb47dbb8338fd471b105e7ed6c3cb2aeb00c2e067127ffd3764a05d" +dependencies = [ + "clap_builder", + "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98c59138d527eeaf9b53f35a77fcc1fad9d883116070c63d5de1c7dc7b00c72b" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inferno-protocol" +version = "0.1.0" +dependencies = [ + "thiserror", +] + +[[package]] +name = "inferno-server" +version = "0.1.0" +dependencies = [ + "clap", + "inferno-protocol", + "once_cell", + "serde", + "thiserror", + "toml", + "tracing", + "tracing-appender", + "tracing-subscriber", +] + +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi", + "rustix", + "windows-sys", +] + +[[package]] +name = "itoa" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "linux-raw-sys" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[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 = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pin-project-lite" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" + +[[package]] +name = "proc-macro2" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustix" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac5ffa1efe7548069688cd7028f32591853cd7b5b756d41bcffd2353e4fc75b4" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "serde" +version = "1.0.168" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d614f89548720367ded108b3c843be93f3a341e22d5674ca0dd5cd57f34926af" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.168" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fe589678c688e44177da4f27152ee2d190757271dc7f1d5b6b9f68d869d641" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_spanned" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +dependencies = [ + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "smallvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "2.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" +dependencies = [ + "itoa", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "time-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +dependencies = [ + "time-core", +] + +[[package]] +name = "toml" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c500344a19072298cd05a7224b3c0c629348b78692bf48466c5238656e315a78" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-appender" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e" +dependencies = [ + "crossbeam-channel", + "time", + "tracing-subscriber", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "unicode-ident" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[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-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winnow" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81a2094c43cc94775293eaa0e499fbc30048a6d824ac82c0351a8c0bf9112529" +dependencies = [ + "memchr", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..c366098 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,24 @@ +[workspace] +members = ["crates/*"] + +[workspace.package] +version = "0.1.0" +authors = ["Garen Tyler "] +repository = "https://github.com/garentyler/inferno" +readme = "README.md" +license = "GPL" +edition = "2021" + +[workspace.dependencies] +anyhow = "1.0.71" +apecs = "0.7.0" +async-trait = "0.1.68" +byteorder = "1.4.3" +inferno-server.path = "./crates/inferno-server" +inferno-protocol.path = "./crates/inferno-protocol" +serde = { version = "1.0.160", features = ["serde_derive"] } +serde_json = "1.0.96" +thiserror = "1.0.40" +tokio = { version = "1.28.0", features = ["full"] } +tracing = { version = "0.1.37", features = ["log"] } + diff --git a/crates/inferno-protocol/Cargo.toml b/crates/inferno-protocol/Cargo.toml new file mode 100644 index 0000000..e437f99 --- /dev/null +++ b/crates/inferno-protocol/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "inferno-protocol" +description = "The Inferno protocol implemented in a network-agnostic way" +build = "build.rs" +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +version.workspace = true + +[dependencies] +thiserror.workspace = true + diff --git a/crates/inferno-protocol/build.rs b/crates/inferno-protocol/build.rs new file mode 100644 index 0000000..ac4068b --- /dev/null +++ b/crates/inferno-protocol/build.rs @@ -0,0 +1,24 @@ +use std::process::Command; +fn main() { + if let Ok(output) = Command::new("git").args(["rev-parse", "HEAD"]).output() { + let git_hash = String::from_utf8_lossy(&output.stdout).to_string(); + println!("cargo:rustc-env=GIT_HASH={}", git_hash); + } else { + println!("cargo:rustc-env=GIT_HASH=000000000"); + } + + if let Ok(output) = Command::new("git") + .args(["log", "-1", "--format=%cI"]) + .output() + { + let iso_date = String::from_utf8_lossy(&output.stdout).to_string(); + println!("cargo:rustc-env=GIT_DATE={}", iso_date); + } else { + println!("cargo:rustc-env=GIT_DATE=1970-01-01"); + } + + println!( + "cargo:rustc-env=BUILD_TARGET={}", + std::env::var("TARGET").unwrap() + ); +} diff --git a/crates/inferno-protocol/src/error.rs b/crates/inferno-protocol/src/error.rs new file mode 100644 index 0000000..39348a8 --- /dev/null +++ b/crates/inferno-protocol/src/error.rs @@ -0,0 +1,7 @@ +/// This type represents all possible errors that can occur when running the server. +#[allow(dead_code)] +#[derive(thiserror::Error, Clone, Debug, PartialEq)] +pub enum Error {} + +/// Alias for a Result with the error type `inferno_server::error::Error`. +pub type Result = std::result::Result; diff --git a/crates/inferno-protocol/src/lib.rs b/crates/inferno-protocol/src/lib.rs new file mode 100644 index 0000000..34cf0f1 --- /dev/null +++ b/crates/inferno-protocol/src/lib.rs @@ -0,0 +1,4 @@ +/// Protocol errors. +pub mod error; +/// Utility functions. +pub mod util; diff --git a/crates/inferno-protocol/src/util.rs b/crates/inferno-protocol/src/util.rs new file mode 100644 index 0000000..54eeb30 --- /dev/null +++ b/crates/inferno-protocol/src/util.rs @@ -0,0 +1,13 @@ +pub fn get_version(product: &str) -> String { + format!( + "inferno {}.{}.{}", + if cfg!(debug_assertions) { + format!("dev-{}", &env!("GIT_HASH")[0..9]) + } else { + env!("CARGO_PKG_VERSION").to_string() + }, + product, + &env!("GIT_DATE")[0..10] + ) +} + diff --git a/crates/inferno-server/Cargo.toml b/crates/inferno-server/Cargo.toml new file mode 100644 index 0000000..6c42d7f --- /dev/null +++ b/crates/inferno-server/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "inferno-server" +description = "A decentralized alternative to Discord" +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +version.workspace = true + +[[bin]] +name = "inferno-server" +path = "src/main.rs" + +[dependencies] +clap = { version = "4.2.7", features = ["derive"] } +inferno-protocol.workspace = true +once_cell = "1.17.1" +serde.workspace = true +thiserror.workspace = true +toml = "0.7.3" +tracing.workspace = true +tracing-subscriber = { version = "0.3.17", features = ["tracing-log"] } +tracing-appender = "0.2.2" diff --git a/crates/inferno-server/build.rs b/crates/inferno-server/build.rs new file mode 100644 index 0000000..ac4068b --- /dev/null +++ b/crates/inferno-server/build.rs @@ -0,0 +1,24 @@ +use std::process::Command; +fn main() { + if let Ok(output) = Command::new("git").args(["rev-parse", "HEAD"]).output() { + let git_hash = String::from_utf8_lossy(&output.stdout).to_string(); + println!("cargo:rustc-env=GIT_HASH={}", git_hash); + } else { + println!("cargo:rustc-env=GIT_HASH=000000000"); + } + + if let Ok(output) = Command::new("git") + .args(["log", "-1", "--format=%cI"]) + .output() + { + let iso_date = String::from_utf8_lossy(&output.stdout).to_string(); + println!("cargo:rustc-env=GIT_DATE={}", iso_date); + } else { + println!("cargo:rustc-env=GIT_DATE=1970-01-01"); + } + + println!( + "cargo:rustc-env=BUILD_TARGET={}", + std::env::var("TARGET").unwrap() + ); +} diff --git a/crates/inferno-server/src/config.rs b/crates/inferno-server/src/config.rs new file mode 100644 index 0000000..fbf260d --- /dev/null +++ b/crates/inferno-server/src/config.rs @@ -0,0 +1,207 @@ +use clap::Arg; +use once_cell::sync::{Lazy, OnceCell}; +use serde::{Deserialize, Serialize}; +use std::io::{Read, Write}; +use std::{fs::File, path::Path, path::PathBuf}; +use tracing::{error, trace, warn}; + +/// The globally-accessible static instance of Config. +/// On program startup, Config::load() should be called to initialize it. +pub static CONFIG: OnceCell = OnceCell::new(); + +/// The globablly-accessible static instance of Args. +/// On program startup, Args::load() should be called to initialize it. +pub static ARGS: OnceCell = OnceCell::new(); +static DEFAULT_ARGS: Lazy = Lazy::new(Args::default); + +/// Helper function to read a file from a `Path` +/// and return its bytes as a `Vec`. +#[tracing::instrument] +fn read_file(path: &Path) -> std::io::Result> { + trace!("{:?}", path); + let mut data = vec![]; + let mut file = File::open(path)?; + file.read_to_end(&mut data)?; + Ok(data) +} + +/// The main server configuration struct. +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +#[serde(default)] +pub struct Config { + pub port: u16, + #[serde(skip)] + pub server_version: String, +} +impl Default for Config { + fn default() -> Self { + Config { + port: 3000, + server_version: inferno_protocol::util::get_version("server"), + } + } +} +impl Config { + pub fn instance() -> &'static Self { + match CONFIG.get() { + Some(a) => a, + None => Self::load(), + } + } + #[tracing::instrument] + pub fn load() -> &'static Self { + trace!("Config::load()"); + let args = Args::instance(); + let mut config = Config::default(); + let config_path = Path::new(&args.config_file); + + if !config_path.exists() { + warn!( + "Configuration file does not exist, creating {}", + config_path.to_str().unwrap_or("") + ); + config.write(config_path); + } + + if let Ok(cfg) = read_file(config_path) { + let cfg: Result = toml::from_str(&String::from_utf8_lossy(&cfg)); + if let Ok(cfg) = cfg { + config = cfg; + } else { + error!("Could not parse configuration file, using default"); + } + } else { + error!("Could not read configuration file, using default"); + } + + CONFIG.set(config).expect("could not set CONFIG"); + Self::instance() + } + #[tracing::instrument] + fn write(&self, path: &Path) { + trace!("Config.write()"); + if let Ok(mut file) = File::options().write(true).create(true).open(path) { + if file + .write_all(toml::to_string(&self).unwrap().as_bytes()) + .is_ok() + { + return; + } + } + error!("Could not write configuration file"); + std::process::exit(1); + } +} + +/// All of the valid command line arguments for the inferno binary. +/// +/// Arguments will always override the config options specified in `inferno.toml` or `Config::default()`. +#[derive(Debug)] +pub struct Args { + config_file: PathBuf, + pub log_level: Option, + pub log_dir: PathBuf, +} +impl Default for Args { + fn default() -> Self { + let config = Config::default(); + Args { + config_file: PathBuf::from("inferno.toml"), + log_level: None, + log_dir: PathBuf::from("logs"), + } + } +} +impl Args { + pub fn instance() -> &'static Self { + match ARGS.get() { + Some(a) => a, + None => Self::load(), + } + } + pub fn load() -> &'static Self { + ARGS.set(Self::parse()).expect("could not set ARGS"); + Self::instance() + } + fn parse() -> Self { + use std::ffi::OsStr; + + let m = clap::Command::new("inferno-server") + .about(env!("CARGO_PKG_DESCRIPTION")) + .disable_version_flag(true) + .arg( + Arg::new("version") + .short('V') + .long("version") + .help("Print version") + .global(true) + .action(clap::ArgAction::SetTrue), + ) + .arg( + Arg::new("verbose") + .short('v') + .long("verbose") + .help("Set log level to debug") + .global(true) + .action(clap::ArgAction::SetTrue), + ) + .arg( + Arg::new("config-file") + .short('c') + .long("config-file") + .help("Configuration file path") + .value_hint(clap::ValueHint::FilePath) + .default_value(OsStr::new(&DEFAULT_ARGS.config_file)), + ) + .arg( + Arg::new("log-level") + .short('l') + .long("log-level") + .help("Set the log level") + .conflicts_with("verbose") + .value_name("level") + .value_parser(["trace", "debug", "info", "warn", "error"]), + ) + .arg( + Arg::new("log-dir") + .long("log-dir") + .help("Set the log output directory") + .value_name("dir") + .value_hint(clap::ValueHint::DirPath) + .default_value(OsStr::new(&DEFAULT_ARGS.log_dir)), + ) + .get_matches(); + + let mut args = Self::default(); + args.config_file = m + .get_one::("config-file") + .map_or(args.config_file, PathBuf::from); + args.log_dir = m + .get_one::("log-dir") + .map_or(args.log_dir, PathBuf::from); + + if m.get_flag("verbose") { + args.log_level = Some(tracing::Level::DEBUG); + } else { + args.log_level = m.get_one("log-level").map_or(args.log_level, |s: &String| { + Some(s.parse::().unwrap()) + }); + } + + if m.get_flag("version") { + println!("{}", Config::default().server_version); + if m.get_flag("verbose") { + println!("release: {}", env!("CARGO_PKG_VERSION")); + println!("commit-hash: {}", env!("GIT_HASH")); + println!("commit-date: {}", &env!("GIT_DATE")[0..10]); + println!("license: {}", env!("CARGO_PKG_LICENSE")); + println!("authors: {}", env!("CARGO_PKG_AUTHORS")); + println!("build-target: {}", env!("BUILD_TARGET")); + } + std::process::exit(0); + } + + args + } +} diff --git a/crates/inferno-server/src/error.rs b/crates/inferno-server/src/error.rs new file mode 100644 index 0000000..cd9fcd9 --- /dev/null +++ b/crates/inferno-server/src/error.rs @@ -0,0 +1,10 @@ +/// This type represents all possible errors that can occur when running the server. +#[allow(dead_code)] +#[derive(thiserror::Error, Clone, Debug, PartialEq)] +pub enum Error { + #[error("the server is not running")] + NotRunning, +} + +/// Alias for a Result with the error type `inferno_server::error::Error`. +pub type Result = std::result::Result; diff --git a/crates/inferno-server/src/lib.rs b/crates/inferno-server/src/lib.rs new file mode 100644 index 0000000..448689a --- /dev/null +++ b/crates/inferno-server/src/lib.rs @@ -0,0 +1,12 @@ +/// Server configuration and cli options. +pub mod config; +/// When managing the server encounters errors. +pub(crate) mod error; + +use once_cell::sync::OnceCell; +use std::time::Instant; + +/// A globally accessible instant of the server's start time. +/// +/// This should be set immediately on startup. +pub static START_TIME: OnceCell = OnceCell::new(); diff --git a/crates/inferno-server/src/main.rs b/crates/inferno-server/src/main.rs new file mode 100644 index 0000000..f3da1ac --- /dev/null +++ b/crates/inferno-server/src/main.rs @@ -0,0 +1,48 @@ +use tracing::{info, warn}; +use tracing_subscriber::prelude::*; + +#[tracing::instrument] +pub fn main() { + inferno_server::START_TIME + .set(std::time::Instant::now()) + .expect("could not set inferno_server::START_TIME"); + + // Set up logging. + let file_writer = + tracing_appender::rolling::daily(&inferno_server::config::Args::instance().log_dir, "log"); + let (file_writer, _guard) = tracing_appender::non_blocking(file_writer); + + tracing_subscriber::registry() + .with(tracing_subscriber::filter::LevelFilter::from_level( + inferno_server::config::Args::instance() + .log_level + .unwrap_or(if cfg!(debug_assertions) { + tracing::Level::DEBUG + } else { + tracing::Level::INFO + }), + )) + .with( + tracing_subscriber::fmt::layer() + .compact() + .with_ansi(false) + .with_writer(file_writer), + ) + .with( + tracing_subscriber::fmt::layer() + .compact() + .with_writer(std::io::stdout), + ) + .init(); + + // Load the config. + let config = inferno_server::config::Config::load(); + + info!("Starting {} on port {}", config.server_version, config.port); + info!("This software is licensed under GPLv3."); + // Start the server. + info!( + "Done! Start took {:?}", + inferno_server::START_TIME.get().unwrap().elapsed() + ); +} diff --git a/inferno.toml b/inferno.toml new file mode 100644 index 0000000..49032a2 --- /dev/null +++ b/inferno.toml @@ -0,0 +1 @@ +port = 3000 diff --git a/version b/version new file mode 100644 index 0000000..79049b0 --- /dev/null +++ b/version @@ -0,0 +1,2 @@ +Inferno dev-1234567.server.2023-07-08 +Inferno 2.1.3.server.2023-07-08