@@ -3,6 +3,8 @@ package internal
33import (
44 _ "embed"
55 "errors"
6+ "flag"
7+ "fmt"
68 "log"
79 "os"
810 "os/exec"
@@ -20,7 +22,7 @@ const (
2022//go:embed templates/.gitignore.tmpl
2123var gitignoreTmpl string
2224
23- //go:embed templates/main.cpp. tmpl
25+ //go:embed templates/main.tmpl
2426var mainTmpl string
2527
2628//go:embed templates/Makefile.tmpl
@@ -35,6 +37,7 @@ var readmeTmpl string
3537type Project struct {
3638 ProjectName string
3739 AbsolutePath string
40+ Language string
3841}
3942
4043func (p * Project ) CreateProjectStructure () error {
@@ -86,15 +89,15 @@ func (p *Project) CreateProjectStructure() error {
8689 return err
8790 }
8891
89- // Create main.cpp file
92+ // Create main file
9093 mainPath := filepath .Join (projectPath , srcPath )
91- if err := p .CreateFileFromTemplate (mainTmpl , mainPath , "main.cpp" , nil ); err != nil {
92- log .Printf ("Error creating main.cpp file: %v\n " , err )
94+ if err := p .CreateFileFromTemplate (mainTmpl , mainPath , "main." + p . Language , map [ string ] string { "Language" : p . Language } ); err != nil {
95+ log .Printf ("Error creating main.%s file: %v\n " , p . Language , err )
9396 return err
9497 }
9598
9699 // Create Makefile
97- if err := p .CreateFileFromTemplate (makefileTmpl , projectPath , "Makefile" , nil ); err != nil {
100+ if err := p .CreateFileFromTemplate (makefileTmpl , projectPath , "Makefile" , map [ string ] string { "Language" : p . Language } ); err != nil {
98101 log .Printf ("Error creating Makefile: %v\n " , err )
99102 return err
100103 }
@@ -173,11 +176,43 @@ func ExecuteCmd(name string, args []string, dir string) error {
173176 return nil
174177}
175178
176- func CheckArgs () error {
177- // Check if there are enough arguments
178- if len (os .Args ) != 2 {
179- return errors .New ("Usage: bluecpprint <project_name>" )
179+ func usage () {
180+ fmt .Fprintf (os .Stderr , "Usage: bluecpprint --language=[LANGUAGE] [PROJECT_NAME]\n " )
181+ fmt .Fprintf (os .Stderr , "Options:" )
182+ fmt .Fprintf (os .Stderr , "\n --language=[LANG]" )
183+ fmt .Fprintf (os .Stderr , " Specify the programming language. Choose between 'c' for C or 'cpp' for C++. The project files will change accordingly.\n " )
184+ }
185+
186+ func valudateLanguage (lang string ) error {
187+ if lang == "" {
188+ return errors .New ("Language is required" )
189+ }
190+
191+ if lang != "c" && lang != "cpp" {
192+ return errors .New ("Invalid language. Allowed values are: c, cpp" )
180193 }
181194
182195 return nil
183196}
197+
198+ func printUsageAndError (msg string ) (string , string , error ) {
199+ flag .Usage ()
200+ return "" , "" , errors .New (msg )
201+ }
202+
203+ func CheckArgs () (string , string , error ) {
204+ language := flag .String ("language" , "" , "" )
205+ flag .Usage = usage
206+ flag .Parse ()
207+
208+ if len (flag .Args ()) < 1 {
209+ return printUsageAndError ("Language and Project Name are required" )
210+ }
211+ projectName := flag .Arg (0 )
212+
213+ if err := valudateLanguage (* language ); err != nil {
214+ return printUsageAndError (err .Error ())
215+ }
216+
217+ return * language , projectName , nil
218+ }
0 commit comments