package head import ( "bbash/environment" "bbash/input_parser" "bufio" "fmt" "os" "slices" "strconv" "strings" ) func Head(in input_parser.Input, env *environment.Env) { flagsArray := []string{ "n", "help", } flagsDictionary := map[string]string{ "n": "-n displays the line numbers", "help": "-help shows this message", } if slices.Contains(in.Flags, "help") { fmt.Printf("Lists Sources in the current working directory\n") fmt.Printf("Supported flags are:\n") for _, flag := range flagsArray { fmt.Println(flag + flagsDictionary[flag]) } // Print flags and there description return } args := in.Args var file_path string var lines int if len(args) >= 1 { file_path = strings.TrimSpace(args[0]) lines = 10 } else { fmt.Print(fmt.Sprintf("No arguments provided")) return } if len(args) == 2 { lines1, err := strconv.Atoi(strings.TrimSpace(args[1])) lines = lines1 if err != nil { fmt.Print(fmt.Sprintf("Second argument must be a integer")) return } } file, err := os.Open(file_path) if err != nil { fmt.Println(fmt.Sprintf("Error opening file: %s", err.Error())) return } defer file.Close() scanner := bufio.NewScanner(file) if slices.Contains(in.Flags, "n") { var counter int for counter = 0; counter < lines-1; counter++ { if !scanner.Scan() { return } fmt.Println(fmt.Sprintf(strconv.FormatInt(int64(counter), 10) + scanner.Text())) } scanner.Scan() fmt.Print(fmt.Sprintf(strconv.FormatInt(int64(counter), 10) + scanner.Text())) } else { for i := 0; i < lines-1; i++ { if !scanner.Scan() { return } fmt.Println(scanner.Text()) } scanner.Scan() fmt.Print(scanner.Text()) } }