run (4558B)
1 #!/bin/bash 2 FILE_PATH=$1 3 shift # Remove the file path from the list of arguments 4 ARGS="$@" # Capture any additional arguments 5 6 BUILD_ONLY=false 7 TEST_PROJECT=false 8 REPL=false 9 MIX=false 10 C_FLAGS="" 11 12 for arg in "$@"; do 13 case $arg in 14 --build | -b) 15 BUILD_ONLY=true 16 shift 17 ;; 18 --test | -t) 19 TEST_PROJECT=true 20 shift 21 ;; 22 --repl | -r) 23 REPL=true 24 shift 25 ;; 26 --mix | -m) 27 MIX=true 28 shift 29 ;; 30 --cflags) 31 shift 32 C_FLAGS="$1" 33 shift 34 ;; 35 esac 36 done 37 38 # Ensure a file path is provided 39 if [[ -z "$FILE_PATH" ]]; then 40 echo "Usage: $0 <source_file> [program arguments if any] [--build-only(optional)]" 41 exit 1 42 fi 43 44 if [[ -f "build.zig" ]]; then 45 IS_ZIG_PROJECT=true 46 else 47 IS_ZIG_PROJECT=false 48 fi 49 50 EXT="${FILE_PATH##*.}" 51 FILE_NAME=$(basename "$FILE_PATH" ."$EXT") 52 53 case "$EXT" in 54 c) 55 echo "Compiling ${FILE_NAME}.c..." 56 # Ensure 'bin' directory exists for compiled binaries 57 mkdir -p "bin" 58 gcc -Wall -Wextra -lm $C_FLAGS "$FILE_PATH" -o "bin/${FILE_NAME}" 59 if [[ $? -ne 0 ]]; then 60 echo "Compilation failed." 61 exit 1 62 fi 63 if $BUILD_ONLY; then 64 echo "done" 65 exit 0 66 fi 67 echo "" 68 echo "Running bin/${FILE_NAME}..." 69 echo "" 70 ./bin/${FILE_NAME} $ARGS 71 ;; 72 go) 73 if $TEST_PROJECT; then 74 echo "Running tests..." 75 echo "" 76 go test $FILE_PATH 77 else 78 echo "Compiling ${FILE_NAME}.go..." 79 echo "" 80 # Ensure 'bin' directory exists for compiled binaries 81 mkdir -p "bin" 82 go build -o "bin/${FILE_NAME}" "$FILE_PATH" 83 if [[ $? -ne 0 ]]; then 84 echo "Compilation failed." 85 exit 1 86 fi 87 if $BUILD_ONLY; then 88 echo "Binary compiled at bin/${FILE_NAME}" 89 else 90 echo "Running bin/${FILE_NAME}..." 91 ./bin/${FILE_NAME} $ARGS 92 fi 93 fi 94 ;; 95 rs) 96 echo "Running ${FILE_NAME}.rs with rustc..." 97 echo "" 98 mkdir -p "target" 99 rustc "$FILE_PATH" -o ./target/$FILE_NAME 100 ./target/${FILE_NAME} $ARGS 101 ;; 102 exs | ex) 103 if $TEST_PROJECT; then 104 mix test 105 elif $MIX; then 106 echo "running script with mix..." 107 echo "" 108 mix run ${FILE_PATH} 109 elif $REPL; then 110 if [[ "$EXT" == "exs" ]] && [[ "$FILE_NAME" != "mix" ]]; then 111 echo "starting iex repl..." 112 echo "" 113 iex ${FILE_PATH} 114 else 115 echo "running app with iex..." 116 echo "" 117 iex -S mix 118 fi 119 else 120 if [[ "$EXT" == "exs" ]] && [[ "$FILE_NAME" != "mix" ]]; then 121 echo "Running ${FILE_NAME}.exs with elixir..." 122 echo "" 123 elixir "$FILE_PATH" $ARGS 124 else 125 if $BUILD_ONLY; then 126 echo "Compiling mix project..." 127 echo "" 128 mix escript.build 129 130 else 131 echo "Running mix project..." 132 echo "" 133 mix run 134 fi 135 fi 136 137 fi 138 ;; 139 zig) 140 if $IS_ZIG_PROJECT; then 141 # Project mode 142 if $TEST_PROJECT; then 143 echo "Running Zig project tests..." 144 echo "" 145 zig build test 146 147 elif $BUILD_ONLY; then 148 echo "Building Zig project..." 149 echo "" 150 zig build 151 152 else 153 echo "Running Zig project..." 154 echo "" 155 zig build run -- $ARGS 156 fi 157 158 else 159 # Single file mode 160 if $TEST_PROJECT; then 161 echo "Running tests for ${FILE_NAME}.zig..." 162 echo "" 163 zig test "$FILE_PATH" 164 165 elif $BUILD_ONLY; then 166 echo "Building ${FILE_NAME}.zig..." 167 echo "" 168 mkdir -p target 169 zig build-exe "$FILE_PATH" -o "target/${FILE_NAME}" 170 171 else 172 echo "Running ${FILE_NAME}.zig..." 173 echo "" 174 zig run "$FILE_PATH" -- $ARGS 175 fi 176 fi 177 ;; 178 ts | js) 179 if [[ "$EXT" == "js" ]]; then 180 echo "Running ${FILE_NAME}.js..." 181 else 182 183 echo "Running ${FILE_NAME}.ts..." 184 fi 185 echo "" 186 node $FILE_PATH 187 ;; 188 py) 189 echo "Running ${FILE_NAME}.py...." 190 echo "" 191 python3 $FILE_PATH 192 ;; 193 sh) 194 echo "Running ${FILE_NAME}.sh script...." 195 echo "" 196 bash $FILE_PATH 197 ;; 198 html) 199 echo "starting http server..." 200 echo "" 201 http-server --port 5173 202 ;; 203 *) 204 echo "Unsupported file type: .$EXT" 205 exit 1 206 ;; 207 esac 208 209 exit 0