#!/usr/bin/env bash # Try to make sure we are in the zed repo root if [ ! -d "crates" ] || [ ! -d "script" ]; then echo "Error: Run from the \`zed\` repo root" exit 1 fi if [ ! -f "Cargo.toml" ]; then echo "Error: Run from the \`zed\` repo root" exit 1 fi if [ $# -eq 0 ]; then echo "Usage: $0 [optional_license_flag]" exit 1 fi CRATE_NAME="$1" LICENSE_FLAG=$(echo "${2}" | tr '[:upper:]' '[:lower:]') if [[ "$LICENSE_FLAG" == *"apache"* ]]; then LICENSE_MODE="Apache-2.0" LICENSE_FILE="LICENSE-APACHE" elif [[ "$LICENSE_FLAG" == *"agpl"* ]]; then LICENSE_MODE="AGPL-3.0-or-later" LICENSE_FILE="LICENSE-AGPL" else LICENSE_MODE="GPL-3.0-or-later" LICENSE_FILE="LICENSE-GPL" fi if [[ ! "$CRATE_NAME" =~ ^[a-z0-9_]+$ ]]; then echo "Error: Crate name must be lowercase and contain only alphanumeric characters and underscores" exit 1 fi CRATE_PATH="crates/$CRATE_NAME" mkdir -p "$CRATE_PATH/src" # Symlink the license ln -sf "../../$LICENSE_FILE" "$CRATE_PATH/$LICENSE_FILE" CARGO_TOML_TEMPLATE=$(cat << 'EOF' [package] name = "$CRATE_NAME" version = "0.1.0" edition.workspace = true publish.workspace = true license = "$LICENSE_MODE" [lints] workspace = true [lib] path = "src/$CRATE_NAME.rs" [features] default = [] [dependencies] anyhow.workspace = true gpui.workspace = true ui.workspace = true util.workspace = true # Uncomment other workspace dependencies as needed # assistant.workspace = true # client.workspace = true # project.workspace = true # settings.workspace = true EOF ) # Populate template CARGO_TOML_CONTENT=$(echo "$CARGO_TOML_TEMPLATE" | sed \ -e "s/\$CRATE_NAME/$CRATE_NAME/g" \ -e "s/\$LICENSE_MODE/$LICENSE_MODE/g") echo "$CARGO_TOML_CONTENT" > "$CRATE_PATH/Cargo.toml" echo "//! # $CRATE_NAME" > "$CRATE_PATH/src/$CRATE_NAME.rs" echo "Created new crate: $CRATE_NAME in $CRATE_PATH" echo "License: $LICENSE_MODE (symlinked from $LICENSE_FILE)" echo "Don't forget to add the new crate to the workspace!"