1#!/usr/bin/env bash
2
3# Try to make sure we are in the zed repo root
4if [ ! -d "crates" ] || [ ! -d "script" ]; then
5 echo "Error: Run from the \`zed\` repo root"
6 exit 1
7fi
8
9if [ ! -f "Cargo.toml" ]; then
10 echo "Error: Run from the \`zed\` repo root"
11 exit 1
12fi
13
14if [ $# -eq 0 ]; then
15 echo "Usage: $0 <crate_name> [optional_license_flag]"
16 exit 1
17fi
18
19CRATE_NAME="$1"
20
21LICENSE_FLAG=$(echo "${2}" | tr '[:upper:]' '[:lower:]')
22if [[ "$LICENSE_FLAG" == *"apache"* ]]; then
23 LICENSE_MODE="Apache-2.0"
24 LICENSE_FILE="LICENSE-APACHE"
25elif [[ "$LICENSE_FLAG" == *"agpl"* ]]; then
26 LICENSE_MODE="AGPL-3.0-or-later"
27 LICENSE_FILE="LICENSE-AGPL"
28else
29 LICENSE_MODE="GPL-3.0-or-later"
30 LICENSE_FILE="LICENSE-GPL"
31fi
32
33if [[ ! "$CRATE_NAME" =~ ^[a-z0-9_]+$ ]]; then
34 echo "Error: Crate name must be lowercase and contain only alphanumeric characters and underscores"
35 exit 1
36fi
37
38CRATE_PATH="crates/$CRATE_NAME"
39mkdir -p "$CRATE_PATH/src"
40
41# Symlink the license
42ln -sf "../../$LICENSE_FILE" "$CRATE_PATH/$LICENSE_FILE"
43
44CARGO_TOML_TEMPLATE=$(cat << 'EOF'
45[package]
46name = "$CRATE_NAME"
47version = "0.1.0"
48edition.workspace = true
49publish.workspace = true
50license = "$LICENSE_MODE"
51
52[lints]
53workspace = true
54
55[lib]
56path = "src/$CRATE_NAME.rs"
57
58[features]
59default = []
60
61[dependencies]
62anyhow.workspace = true
63gpui.workspace = true
64ui.workspace = true
65util.workspace = true
66workspace-hack.workspace = true
67
68# Uncomment other workspace dependencies as needed
69# assistant.workspace = true
70# client.workspace = true
71# project.workspace = true
72# settings.workspace = true
73EOF
74)
75
76# Populate template
77CARGO_TOML_CONTENT=$(echo "$CARGO_TOML_TEMPLATE" | sed \
78 -e "s/\$CRATE_NAME/$CRATE_NAME/g" \
79 -e "s/\$LICENSE_MODE/$LICENSE_MODE/g")
80
81echo "$CARGO_TOML_CONTENT" > "$CRATE_PATH/Cargo.toml"
82
83echo "//! # $CRATE_NAME" > "$CRATE_PATH/src/$CRATE_NAME.rs"
84
85echo "Created new crate: $CRATE_NAME in $CRATE_PATH"
86echo "License: $LICENSE_MODE (symlinked from $LICENSE_FILE)"
87echo "Don't forget to add the new crate to the workspace!"