package main

import (
	"errors"
	"fmt"
	"io"
	"strings"
)

// ErrTidakDitemukan adalah sentinel untuk data yang tidak ada.
var ErrTidakDitemukan = errors.New("data tidak ditemukan")

func cariPengguna(kunci string) (string, error) {
	pengguna := map[string]string{
		"budi": "Budi Santoso",
		"siti": "Siti Aminah",
	}
	if nama, ok := pengguna[kunci]; ok {
		return nama, nil
	}
	return "", ErrTidakDitemukan
}

func bacaPotongan(r io.Reader) {
	buf := make([]byte, 4)
	for {
		n, err := r.Read(buf)
		if n > 0 {
			fmt.Printf("terbaca %d byte: %q\n", n, buf[:n])
		}
		if err != nil {
			if errors.Is(err, io.EOF) {
				fmt.Println("akhir data tercapai")
			} else {
				fmt.Println("error pembacaan lain:", err)
			}
			return
		}
	}
}

func main() {
	nama, err := cariPengguna("budi")
	fmt.Printf("nama=%q err=%v\n", nama, err)

	nama, err = cariPengguna("rudi")
	fmt.Printf("nama=%q err=%v\n", nama, err)

	fmt.Println("errors.Is ErrTidakDitemukan:", errors.Is(err, ErrTidakDitemukan))
	fmt.Println("errors.Is io.ErrUnexpectedEOF:", errors.Is(err, io.ErrUnexpectedEOF))

	bacaPotongan(strings.NewReader("Golang"))
}
