From 9886f251b86e23120a0691bf290a56e504763038 Mon Sep 17 00:00:00 2001
From: ErrorNoInternet <errornointernet@envs.net>
Date: Sat, 15 Mar 2025 15:59:35 -0400
Subject: [PATCH] ci: check and build with features

---
 .github/workflows/build.yaml | 14 +++++++++-----
 .github/workflows/lint.yaml  | 24 ++++++++++++++++++------
 src/events.rs                |  8 +++++++-
 src/lua/mod.rs               |  4 +++-
 src/main.rs                  |  4 +++-
 5 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index ab10a52..46023e1 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -10,12 +10,17 @@ on:
 
 jobs:
     errornowatcher:
-        name: errornowatcher (${{ matrix.os }})
+        name: errornowatcher (${{ matrix.os }}, ${{ matrix.feature.name }})
         runs-on: ${{ matrix.os }}
 
         strategy:
             matrix:
                 os: [ubuntu-24.04, ubuntu-24.04-arm]
+                feature:
+                    - name: default
+
+                    - name: mimalloc
+                      flags: "-F mimalloc"
 
         steps:
             - name: Clone repository
@@ -33,16 +38,15 @@ jobs:
                       ~/.cargo/registry/cache/
                       ~/.cargo/git/db/
                       target/
-                  key: build-${{ matrix.os }}-${{ hashFiles('**.toml', 'Cargo.*') }}
+                  key: build_${{ matrix.os }}_${{ matrix.feature.name }}_${{ hashFiles('**.toml', 'Cargo.*') }}
 
             - name: Switch to nightly toolchain
               run: rustup default nightly
 
-            - name: Build in release mode
-              run: cargo build --release
+            - run: cargo build --release ${{ matrix.feature.flags }}
 
             - name: Upload build artifacts
               uses: actions/upload-artifact@v4
               with:
-                  name: errornowatcher_${{ matrix.os }}
+                  name: errornowatcher_${{ matrix.feature.name }}_${{ matrix.os }}
                   path: target/release/errornowatcher
diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml
index 366882b..cf154a8 100644
--- a/.github/workflows/lint.yaml
+++ b/.github/workflows/lint.yaml
@@ -28,9 +28,23 @@ jobs:
               run: taplo fmt --check Cargo.toml
 
     rust:
-        name: Rust
+        name: Rust (${{ matrix.feature.name }})
         runs-on: ubuntu-24.04
 
+        strategy:
+            matrix:
+                feature:
+                    - name: default
+
+                    - name: minimal-mimalloc
+                      flags: "--no-default-features -F mimalloc"
+
+                    - name: minimal
+                      flags: "--no-default-features"
+
+                    - name: mimalloc
+                      flags: "-F mimalloc"
+
         steps:
             - name: Clone repository
               uses: actions/checkout@v4
@@ -47,7 +61,7 @@ jobs:
                       ~/.cargo/registry/cache/
                       ~/.cargo/git/db/
                       target/
-                  key: build-${{ matrix.os }}-${{ hashFiles('**.toml', 'Cargo.*') }}
+                  key: build_${{ matrix.os }}_${{ matrix.feature.name }}_${{ hashFiles('**.toml', 'Cargo.*') }}
 
             - name: Switch to nightly toolchain
               run: rustup default nightly
@@ -55,9 +69,7 @@ jobs:
             - name: Install components
               run: rustup component add clippy rustfmt
 
-            - name: cargo clippy
-              run: cargo clippy -- -D clippy::pedantic
+            - run: cargo clippy ${{ matrix.feature.flags }} -- -D warnings -D clippy::pedantic
 
-            - name: cargo fmt
-              if: always()
+            - if: always()
               run: cargo fmt --check
diff --git a/src/events.rs b/src/events.rs
index 9257424..9f02cbb 100644
--- a/src/events.rs
+++ b/src/events.rs
@@ -3,7 +3,7 @@ use crate::{
     commands::CommandSource,
     http::serve,
     lua::{client, direction::Direction, player::Player, vec3::Vec3},
-    matrix, particle,
+    particle,
     replay::recorder::Recorder,
 };
 use anyhow::{Context, Result};
@@ -19,6 +19,9 @@ use ncr::utils::trim_header;
 use std::{net::SocketAddr, process::exit};
 use tokio::net::TcpListener;
 
+#[cfg(feature = "matrix")]
+use crate::matrix;
+
 #[allow(clippy::too_many_lines)]
 pub async fn handle_event(client: Client, event: Event, state: State) -> Result<()> {
     match event {
@@ -209,6 +212,8 @@ pub async fn handle_event(client: Client, event: Event, state: State) -> Result<
 
             let globals = state.lua.globals();
             lua_init(client, &state, &globals).await?;
+
+            #[cfg(feature = "matrix")]
             matrix_init(state.clone(), &globals);
 
             let Some(address): Option<SocketAddr> = globals
@@ -270,6 +275,7 @@ async fn lua_init(client: Client, state: &State, globals: &Table) -> Result<()>
     call_listeners(state, "init", || Ok(())).await
 }
 
+#[cfg(feature = "matrix")]
 fn matrix_init(state: State, globals: &Table) {
     if let Ok(homeserver_url) = globals.get::<String>("MatrixHomeserverUrl")
         && let Ok(username) = globals.get::<String>("MatrixUsername")
diff --git a/src/lua/mod.rs b/src/lua/mod.rs
index 07039db..bf95bfc 100644
--- a/src/lua/mod.rs
+++ b/src/lua/mod.rs
@@ -4,13 +4,15 @@ pub mod container;
 pub mod direction;
 pub mod events;
 pub mod logging;
-pub mod matrix;
 pub mod nochatreports;
 pub mod player;
 pub mod system;
 pub mod thread;
 pub mod vec3;
 
+#[cfg(feature = "matrix")]
+pub mod matrix;
+
 use crate::{ListenerMap, build_info::built};
 use mlua::{Lua, Table};
 use std::io;
diff --git a/src/main.rs b/src/main.rs
index 361c7e6..9d69321 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,10 +6,12 @@ mod commands;
 mod events;
 mod http;
 mod lua;
-mod matrix;
 mod particle;
 mod replay;
 
+#[cfg(feature = "matrix")]
+mod matrix;
+
 use anyhow::Context;
 use arguments::Arguments;
 use azalea::{