bbash/command/head/head.go
2025-01-14 17:05:53 +01:00

77 lines
1.7 KiB
Go

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())
}
}