package main

import "fmt"

// SisaStokError membawa informasi stok yang masih tersedia.
type SisaStokError struct {
	Sisa int
}

// Error mengimplementasikan interface error.
func (e SisaStokError) Error() string {
	return fmt.Sprintf("stok tidak cukup, sisa %d", e.Sisa)
}

// ambilStok mengembalikan sisa stok dan error.
func ambilStok(diminta, tersedia int) (int, error) {
	if diminta > tersedia {
		return 0, SisaStokError{Sisa: tersedia}
	}
	return tersedia - diminta, nil
}

func main() {
	sisa, err := ambilStok(5, 12)
	fmt.Println("sisa:", sisa, "| err:", err)

	sisa, err = ambilStok(20, 12)
	fmt.Println("sisa:", sisa, "| err:", err)

	fmt.Printf("cetak dengan %%v: %v\n", err)

	if err == nil {
		fmt.Println("status: sukses")
	} else {
		fmt.Println("status: gagal, pesan:", err.Error())
	}
}
