bevy_scaffolding/mkcrate
2025-08-24 09:42:18 -04:00

92 lines
2.2 KiB
Bash
Executable file

#!/bin/bash
# Exit on any error
set -e
# Check if a name was provided
if [ $# -ne 1 ]; then
echo "Usage: $0 <crate-name>"
exit 1
fi
CRATE_NAME=$1
# Create the PascalCase version of the name for the plugin
PLUGIN_NAME="$(echo $CRATE_NAME | sed -r 's/(^|_)(.)/\U\2/g')"
CRATE_PATH="crates/$CRATE_NAME"
# Step 2: Create a new library crate
echo "Creating new library crate: $CRATE_NAME"
cargo new --lib "$CRATE_PATH"
# Step 3 & 4: Modify the Cargo.toml file to add bevy dependency and lints
echo "Updating $CRATE_PATH/Cargo.toml"
# Create a temporary file
TMP_FILE=$(mktemp)
# Process the Cargo.toml file
cat "$CRATE_PATH/Cargo.toml" | awk -v name="$CRATE_NAME" '
BEGIN {print_mode=1}
/\[dependencies\]/ {
print $0;
print "bevy = { workspace = true }";
print_mode=0;
next;
}
{
if (print_mode) print $0;
}
END {
if (!print_mode) print "";
print "[lints]";
print "workspace = true";
}' > "$TMP_FILE"
# Replace the original file
mv "$TMP_FILE" "$CRATE_PATH/Cargo.toml"
# Step 5: Replace the default lib.rs file
echo "Updating $CRATE_PATH/src/lib.rs"
cat > "$CRATE_PATH/src/lib.rs" << EOF
//bevy system signatures often violate these rules
#![allow(clippy::type_complexity)]
#![allow(clippy::too_many_arguments)]
use bevy::prelude::*;
pub struct ${PLUGIN_NAME}Plugin;
impl Plugin for ${PLUGIN_NAME}Plugin {
fn build(&self, app: &mut App) {}
}
EOF
# Step 6: Add as a dependency to the main Cargo.toml
echo "Adding dependency to main Cargo.toml"
TMP_FILE=$(mktemp)
awk -v name="$CRATE_NAME" '
/^#new internal crates go here/ {
print name " = { path = \"crates/" name "\" }";
print $0;
next;
}
{ print $0; }
' Cargo.toml > "$TMP_FILE"
mv "$TMP_FILE" Cargo.toml
# Step 7: Add plugin to main.rs
echo "Adding plugin to main.rs"
TMP_FILE=$(mktemp)
awk -v name="$CRATE_NAME" -v plugin_name="$PLUGIN_NAME" '
/[[:space:]]*\/\/ new internal crates go here/ {
# Preserve the same indentation as the comment line
match($0, /^[[:space:]]*/);
indent = substr($0, RSTART, RLENGTH);
print indent name "::" plugin_name "Plugin,";
print $0;
next;
}
{ print $0; }
' src/main.rs > "$TMP_FILE"
mv "$TMP_FILE" src/main.rs
echo "Successfully created and integrated the $CRATE_NAME crate!"