@@ -270,107 +270,100 @@ bootstrap module_name='' type='cli' *args='':
270270 mv " cmd/example/main.go" " cmd/${PROJECT_NAME}/main.go"
271271 else
272272 # Create minimal CLI main file
273- cat > " cmd/${PROJECT_NAME}/main.go" << EOF
274- package main
275-
276- import (
277- " fmt"
278- " os"
279- )
280-
281- func main() {
282- fmt.Println(" Hello from ${PROJECT_NAME}" )
283- os .Exit(0)
284- }
285- EOF
273+ echo ' package main' > " cmd/${PROJECT_NAME}/main.go"
274+ echo ' ' >> " cmd/${PROJECT_NAME}/main.go"
275+ echo ' import (' >> " cmd/${PROJECT_NAME}/main.go"
276+ echo ' "fmt"' >> " cmd/${PROJECT_NAME}/main.go"
277+ echo ' "os"' >> " cmd/${PROJECT_NAME}/main.go"
278+ echo ' )' >> " cmd/${PROJECT_NAME}/main.go"
279+ echo ' ' >> " cmd/${PROJECT_NAME}/main.go"
280+ echo ' func main() {' >> " cmd/${PROJECT_NAME}/main.go"
281+ echo ' fmt'" '.Println(\" Hello from ${PROJECT_NAME}\" )' >> " cmd/ ${PROJECT_NAME}/ main.go"
282+ echo ' os'" ' .Exit(0)' >> " cmd/${PROJECT_NAME}/main.go"
283+ echo ' }' >> " cmd/${PROJECT_NAME}/main.go"
286284 fi
287285 rm -rf " cmd/example"
288286 ;;
289287 library)
290288 echo -e " ${BLUE}Setting up library project structure...${NC}"
291289 mkdir -p " pkg/${PROJECT_NAME}"
292290 # Create minimal library file
293- cat > " pkg/${PROJECT_NAME}/${PROJECT_NAME}.go" << EOF
294- package ${PROJECT_NAME}
295-
296- // Version returns the library version
297- func Version() string {
298- return " 0.1.0"
299- }
300- EOF
291+ echo " package ${PROJECT_NAME}" > " pkg/${PROJECT_NAME}/${PROJECT_NAME}.go"
292+ echo " " >> " pkg/${PROJECT_NAME}/${PROJECT_NAME}.go"
293+ echo " // Version returns the library version" >> " pkg/${PROJECT_NAME}/${PROJECT_NAME}.go"
294+ echo " func Version() string {" >> " pkg/${PROJECT_NAME}/${PROJECT_NAME}.go"
295+ echo ' return "0.1.0"' >> " pkg/${PROJECT_NAME}/${PROJECT_NAME}.go"
296+ echo " }" >> " pkg/${PROJECT_NAME}/${PROJECT_NAME}.go"
301297 # Create minimal test file
302- cat > " pkg/${PROJECT_NAME}/${PROJECT_NAME}_test.go" << EOF
303- package ${PROJECT_NAME}
304-
305- import " testing"
306-
307- func TestVersion(t *testing.T) {
308- if v := Version(); v == " " {
309- t.Error(" Version() returned empty string" )
310- }
311- }
312- EOF
298+ echo " package ${PROJECT_NAME}" > " pkg/${PROJECT_NAME}/${PROJECT_NAME}_test.go"
299+ echo " " >> " pkg/${PROJECT_NAME}/${PROJECT_NAME}_test.go"
300+ echo ' import "testing"' >> " pkg/${PROJECT_NAME}/${PROJECT_NAME}_test.go"
301+ echo " " >> " pkg/${PROJECT_NAME}/${PROJECT_NAME}_test.go"
302+ echo " func TestVersion(t *testing.T) {" >> " pkg/${PROJECT_NAME}/${PROJECT_NAME}_test.go"
303+ echo ' if v := Version(); v == "" {' >> " pkg/${PROJECT_NAME}/${PROJECT_NAME}_test.go"
304+ echo ' t'" '.Error(\" Version() returned empty string\" )' >> " pkg/ ${PROJECT_NAME}/ ${PROJECT_NAME}_test.go"
305+ echo " }" >> " pkg/ ${PROJECT_NAME}/ ${PROJECT_NAME}_test.go"
306+ echo " }" >> " pkg/ ${PROJECT_NAME}/ ${PROJECT_NAME}_test.go"
313307 rm -rf " cmd/ example" " pkg/ example"
314308 ;;
315309 api)
316310 echo -e " ${BLUE }Setting up API project structure...${NC}"
317311 mkdir -p " cmd/ ${PROJECT_NAME}"
318- cat > " cmd/${PROJECT_NAME}/main.go" << EOF
319- package main
320-
321- import (
322- " context"
323- " fmt"
324- " log"
325- " net/http"
326- " os"
327- " os/signal"
328- " syscall"
329- " time"
330- )
331-
332- func main() {
333- ctx, cancel := context.WithCancel(context.Background())
334- defer cancel()
335-
336- sigChan := make(chan os .Signal, 1 )
337- signal.Notify(sigChan, os .Interrupt, syscall.SIGTERM)
338-
339- mux := http.NewServeMux()
340- mux.HandleFunc(" /health" , func(w http.ResponseWriter, r *http.Request) {
341- w.Header().Set(" Content-Type" , " application/json" )
342- w.WriteHeader(http.StatusOK)
343- fmt.Fprint(w, \` {" status" :" ok" }\ ` )
344- })
345-
346- srv := &http.Server{
347- Addr: " :8080" ,
348- Handler: mux,
349- ReadTimeout: 10 * time.Second,
350- WriteTimeout: 10 * time.Second,
351- IdleTimeout: 60 * time.Second,
352- }
353-
354- go func() {
355- log.Printf(" Starting server on %s" , srv.Addr)
356- if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
357- log.Fatalf(" Failed to start server: %v" , err)
358- }
359- }()
360-
361- <-sigChan
362- log.Println(" Shutting down server..." )
363-
364- shutdownCtx, shutdownCancel := context.WithTimeout(ctx, 30 *time.Second)
365- defer shutdownCancel()
366-
367- if err := srv.Shutdown(shutdownCtx); err != nil {
368- log.Printf(" Server shutdown error: %v" , err)
369- }
370-
371- log.Println(" Server stopped" )
372- }
373- EOF
312+ # Create API server file using printf to avoid just parser issues
313+ printf '%s\n ' 'package main' > " cmd/ ${PROJECT_NAME}/ main.go"
314+ printf '%s\n ' '' >> " cmd/ ${PROJECT_NAME}/ main.go"
315+ printf '%s\n ' 'import (' >> " cmd/ ${PROJECT_NAME}/ main.go"
316+ printf '%s\n ' ' " context" ' >> " cmd/ ${PROJECT_NAME}/ main.go"
317+ printf '%s\n ' ' " fmt" ' >> " cmd/ ${PROJECT_NAME}/ main.go"
318+ printf '%s\n ' ' " log" ' >> " cmd/ ${PROJECT_NAME}/ main.go"
319+ printf '%s\n ' ' " net/ http" ' >> " cmd/ ${PROJECT_NAME}/ main.go"
320+ printf '%s\n ' ' " os " ' >> " cmd/ ${PROJECT_NAME}/ main.go"
321+ printf '%s\n ' ' " os / signal" ' >> " cmd/ ${PROJECT_NAME}/ main.go"
322+ printf '%s\n ' ' " syscall" ' >> " cmd/ ${PROJECT_NAME}/ main.go"
323+ printf '%s\n ' ' " time" ' >> " cmd/ ${PROJECT_NAME}/ main.go"
324+ printf '%s\n ' ')' >> " cmd/ ${PROJECT_NAME}/ main.go"
325+ printf '%s\n ' '' >> " cmd/ ${PROJECT_NAME}/ main.go"
326+ printf '%s\n ' 'func main() {' >> " cmd/ ${PROJECT_NAME}/ main.go"
327+ printf '%s\n ' ' ctx, cancel := context'" ' .WithCancel(context.Background())' >> " cmd/${PROJECT_NAME}/main.go"
328+ printf ' %s\n' ' defer cancel()' >> " cmd/${PROJECT_NAME}/main.go"
329+ printf ' %s\n' ' ' >> " cmd/${PROJECT_NAME}/main.go"
330+ printf ' %s\n' ' sigChan := make(chan os'" '.Signal, 1)' >> " cmd/ ${PROJECT_NAME}/ main.go"
331+ printf '%s\n ' ' signal'" ' .Notify(sigChan, os.Interrupt, syscall.SIGTERM)' >> " cmd/${PROJECT_NAME}/main.go"
332+ printf ' %s\n' ' ' >> " cmd/${PROJECT_NAME}/main.go"
333+ printf ' %s\n' ' mux := http'" '.NewServeMux()' >> " cmd/ ${PROJECT_NAME}/ main.go"
334+ printf '%s\n ' ' mux'" ' .HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {' >> " cmd/${PROJECT_NAME}/main.go"
335+ printf ' %s\n' ' w'" '.Header().Set(" Content-Type" , " application/ json" )' >> " cmd/ ${PROJECT_NAME}/ main.go"
336+ printf '%s\n ' ' w'" ' .WriteHeader(http.StatusOK)' >> " cmd/${PROJECT_NAME}/main.go"
337+ printf ' %s\n' ' fmt'" '.Fprint(w, `{" status" :" ok" }`)' >> " cmd/ ${PROJECT_NAME}/ main.go"
338+ printf '%s\n ' ' })' >> " cmd/ ${PROJECT_NAME}/ main.go"
339+ printf '%s\n ' '' >> " cmd/ ${PROJECT_NAME}/ main.go"
340+ printf '%s\n ' ' srv := &http'" ' .Server{' >> " cmd/${PROJECT_NAME}/main.go"
341+ printf ' %s\n' ' Addr: ":8080",' >> " cmd/${PROJECT_NAME}/main.go"
342+ printf ' %s\n' ' Handler: mux,' >> " cmd/${PROJECT_NAME}/main.go"
343+ printf ' %s\n' ' ReadTimeout: 10 * time'" '.Second,' >> " cmd/ ${PROJECT_NAME}/ main.go"
344+ printf '%s\n ' ' WriteTimeout: 10 * time'" ' .Second,' >> " cmd/${PROJECT_NAME}/main.go"
345+ printf ' %s\n' ' IdleTimeout: 60 * time'" '.Second,' >> " cmd/ ${PROJECT_NAME}/ main.go"
346+ printf '%s\n ' ' }' >> " cmd/ ${PROJECT_NAME}/ main.go"
347+ printf '%s\n ' '' >> " cmd/ ${PROJECT_NAME}/ main.go"
348+ printf '%s\n ' ' go func() {' >> " cmd/ ${PROJECT_NAME}/ main.go"
349+ printf '%s\n ' ' log'" ' .Printf("Starting server on %s", srv.Addr)' >> " cmd/${PROJECT_NAME}/main.go"
350+ printf ' %s\n' ' if err := srv'" '.ListenAndServe(); err != nil && err != http.ErrServerClosed {' >> " cmd/ ${PROJECT_NAME}/ main.go"
351+ printf '%s\n ' ' log'" ' .Fatalf("Failed to start server: %v", err)' >> " cmd/${PROJECT_NAME}/main.go"
352+ printf ' %s\n' ' }' >> " cmd/${PROJECT_NAME}/main.go"
353+ printf ' %s\n' ' }()' >> " cmd/${PROJECT_NAME}/main.go"
354+ printf ' %s\n' ' ' >> " cmd/${PROJECT_NAME}/main.go"
355+ printf ' %s\n' ' <-sigChan' >> " cmd/${PROJECT_NAME}/main.go"
356+ printf ' %s\n' ' log'" '.Println(" Shutting down server..." )' >> " cmd/ ${PROJECT_NAME}/ main.go"
357+ printf '%s\n ' '' >> " cmd/ ${PROJECT_NAME}/ main.go"
358+ printf '%s\n ' ' shutdownCtx, shutdownCancel := context'" ' .WithTimeout(ctx, 30*time.Second)' >> " cmd/${PROJECT_NAME}/main.go"
359+ printf ' %s\n' ' defer shutdownCancel()' >> " cmd/${PROJECT_NAME}/main.go"
360+ printf ' %s\n' ' ' >> " cmd/${PROJECT_NAME}/main.go"
361+ printf ' %s\n' ' if err := srv'" '.Shutdown(shutdownCtx); err != nil {' >> " cmd/ ${PROJECT_NAME}/ main.go"
362+ printf '%s\n ' ' log'" ' .Printf("Server shutdown error: %v", err)' >> " cmd/${PROJECT_NAME}/main.go"
363+ printf ' %s\n' ' }' >> " cmd/${PROJECT_NAME}/main.go"
364+ printf ' %s\n' ' ' >> " cmd/${PROJECT_NAME}/main.go"
365+ printf ' %s\n' ' log'" '.Println(" Server stopped" )' >> " cmd/ ${PROJECT_NAME}/ main.go"
366+ printf '%s\n ' '}' >> " cmd/ ${PROJECT_NAME}/ main.go"
374367 rm -rf " cmd/ example"
375368 ;;
376369 sharedlib)
0 commit comments