diff --git a/web/06/eigene_loesungen/Aufgabe_02/book.go b/web/06/eigene_loesungen/Aufgabe_02/book.go new file mode 100644 index 0000000..95df54a --- /dev/null +++ b/web/06/eigene_loesungen/Aufgabe_02/book.go @@ -0,0 +1,137 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" +) + +type Book struct { + Title string `json:"title"` + Author string `json:"author"` + Read bool `json:"read"` + ID int `json:"id"` +} + +func addBook(title string, author string) error { + + fmt.Println("add...") + + books, err := readJson() + + if err != nil { + return err + } + + var newID int + if len(books) == 0 { + newID = 1 + } else { + last := books[len(books)-1] + newID = last.ID + 1 + } + + newBook := Book{Title: title, Author: author, Read: false, ID: newID} + + books = append(books, newBook) + + erro := writeJson(books) + + if erro != nil { + return erro + } + + return nil + +} + +func listBooks() error { + + fmt.Println("list...") + + books, err := readJson() + + if err != nil { + return err + } + + fmt.Println("Hier ist Ihre aktuelle Buchübersicht:\n") + + for _, book := range books { + fmt.Println("Titel:", book.Title) + fmt.Println("Author:", book.Author) + fmt.Println("Gelesen:", book.Read) + fmt.Println("ID:", book.ID) + fmt.Println("============================================") + } + + return nil +} + +func markBook(id int) error { + + books, err := readJson() + + if err != nil { + return err + } + + for i := 0; i < len(books); i++ { + if books[i].ID == id { + books[i].Read = true + + erro := writeJson(books) + + if erro != nil { + return erro + } + + return nil + } + } + + return fmt.Errorf("ID %d nicht gefunden!", id) +} + +func readJson() ([]Book, error) { + + fmt.Println("read json...") + + data, err := os.ReadFile("books.json") + + if err != nil { + return nil, err + } + + var books []Book + err = json.Unmarshal(data, &books) + if err != nil { + fmt.Println(err) + return nil, err + } + + return books, nil + +} + +func writeJson(books []Book) error { + data, err := json.MarshalIndent(books, "", " ") + if err != nil { + return err + } + + return os.WriteFile("books.json", data, 0644) +} + +func ensureFileExists() error { + _, err := os.Stat("books.json") + + if os.IsNotExist(err) { + // Initialer Inhalt: leeres JSON-Array + initialData := []byte("[]") + + return os.WriteFile("books.json", initialData, 0644) + } + + return err +} diff --git a/web/06/eigene_loesungen/Aufgabe_02/main.go b/web/06/eigene_loesungen/Aufgabe_02/main.go new file mode 100644 index 0000000..90bd63a --- /dev/null +++ b/web/06/eigene_loesungen/Aufgabe_02/main.go @@ -0,0 +1,55 @@ +package main + +import ( + "fmt" + "os" + "strconv" +) + +func main() { + + if len(os.Args) == 1 { + fmt.Println("Kein Befehl angegeben!") + return + } + + if err := ensureFileExists(); err != nil { + fmt.Println("Fehler beim prüfen der Datei:", err) + return + } + + switch args := os.Args; args[1] { + case "add", "Add": + if len(args) < 4 { + fmt.Println("Nutzung: add <author>") + return + } + if err := addBook(args[2], args[3]); err != nil { + fmt.Println("Fehler beim Hinzufügen:", err) + } + + case "list", "List": + if err := listBooks(); err != nil { + fmt.Println("Fehler beim Auflisten:", err) + } + + case "read", "Read": + if len(args) < 3 { + fmt.Println("Nutzung: read <id>") + return + } + convId, err := strconv.Atoi(args[2]) + if err != nil || convId <= 0 { + fmt.Println("ID ist keine positive Ganzzahl!") + return + } + + if err := markBook(convId); err != nil { + fmt.Println("Fehler beim Markieren:", err) + } + + default: + fmt.Println("Unknown command!") + fmt.Println("Nutzung: add|list|read") + } +}