89 lines
2.7 KiB
Go
89 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
// 🎯 TEILZIEL 1 (TODO 1): Definiere globale Sentinel Errors mit errors.New()
|
|
// - ErrInvalidAmount = "ungültiger betrag: muss positiv sein"
|
|
// - ErrInsufficientFunds = "nicht genügend guthaben verfügbar"
|
|
var (
|
|
ErrInvalidAmount = errors.New("ungültiger betrag: muss positiv sein")
|
|
ErrInsufficientFunds = errors.New("nicht genügend guthaben verfügbar")
|
|
)
|
|
|
|
// 🎯 TEILZIEL 2 (TODO 2): BankAccount Struct mit Methoden
|
|
type BankAccount struct {
|
|
Owner string
|
|
Balance float64
|
|
}
|
|
|
|
func NewBankAccount(owner string, initialBalance float64) *BankAccount {
|
|
return &BankAccount{
|
|
Owner: owner,
|
|
Balance: initialBalance,
|
|
}
|
|
}
|
|
|
|
// Deposit: Zahlt einen Betrag ein.
|
|
// Falls amount <= 0: gib ErrInvalidAmount zurück.
|
|
// Andernfalls: Balance erhöhen und nil zurückgeben.
|
|
func (b *BankAccount) Deposit(amount float64) error {
|
|
// TODO: Validierung und Einzahlung
|
|
return nil
|
|
}
|
|
|
|
// Withdraw: Hebt einen Betrag ab.
|
|
// Falls amount <= 0: gib ErrInvalidAmount zurück.
|
|
// Falls amount > b.Balance: gib ErrInsufficientFunds zurück.
|
|
// Andernfalls: Balance verringern und nil zurückgeben.
|
|
func (b *BankAccount) Withdraw(amount float64) error {
|
|
// TODO: Validierung und Auszahlung
|
|
return nil
|
|
}
|
|
|
|
// 🎯 TEILZIEL 3 (TODO 3): Custom Struct APIError
|
|
// Felder:
|
|
// - StatusCode (int)
|
|
// - Endpoint (string)
|
|
// - Details (string)
|
|
type APIError struct {
|
|
StatusCode int
|
|
Endpoint string
|
|
Details string
|
|
}
|
|
|
|
// Implementiere die Error() string Methode für *APIError
|
|
// Format: "HTTP [StatusCode] Fehler bei [Endpoint]: [Details]"
|
|
// Beispiel: "HTTP 401 Fehler bei /api/v1/auth: ungültiges token"
|
|
func (e *APIError) Error() string {
|
|
// TODO: String mit fmt.Sprintf formatieren
|
|
return ""
|
|
}
|
|
|
|
// 🎯 TEILZIEL 4 (TODO 4): ExecuteRequest mit Error Wrapping & Custom Errors
|
|
// Logik:
|
|
// 1. Wenn token != "valid-token-123":
|
|
// Gib ein APIError zurück: StatusCode = 401, Endpoint = endpoint, Details = "ungültiges token"
|
|
// 2. Wenn endpoint == "/error":
|
|
// Gib einen gewrappten Fehler mit fmt.Errorf("interner fehler: %w", errors.New("datenbank timeout")) zurück.
|
|
// 3. Sonst: Gib ("200 OK: Daten für " + endpoint, nil) zurück.
|
|
func ExecuteRequest(endpoint string, token string) (string, error) {
|
|
// TODO: Token prüfen, Fehler mit %w wrappen oder Erfolgsstring zurückgeben
|
|
return "", nil
|
|
}
|
|
|
|
func main() {
|
|
acc := NewBankAccount("Alice", 100.0)
|
|
if err := acc.Deposit(50); err != nil {
|
|
fmt.Println("Einzahlungsfehler:", err)
|
|
}
|
|
if err := acc.Withdraw(200); err != nil {
|
|
fmt.Println("Abhebungsfehler:", err)
|
|
}
|
|
fmt.Printf("Konto %s Stand: %.2f EUR\n", acc.Owner, acc.Balance)
|
|
|
|
res, err := ExecuteRequest("/api/v1/users", "valid-token-123")
|
|
fmt.Printf("API Response: %s (Err: %v)\n", res, err)
|
|
}
|