package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"strings"
)

type Barang struct {
	ID   string
	Nama string
	Stok int
}

func main() {
	sumber := `{"ID":"B-01","Nama":"Kopi","Stok":12}
{"ID":"B-02","Nama":"Teh","Stok":8}
{"ID":"B-03","Nama":"Gula","Stok":5}`

	dec := json.NewDecoder(strings.NewReader(sumber))
	for {
		var b Barang
		err := dec.Decode(&b)
		if err == io.EOF {
			break
		}
		if err != nil {
			fmt.Println("decode gagal:", err)
			return
		}
		fmt.Printf("baca stream: %+v\n", b)
	}

	var buf bytes.Buffer
	enc := json.NewEncoder(&buf)
	enc.SetIndent("", "  ")
	if err := enc.Encode(Barang{ID: "B-01", Nama: "Kopi", Stok: 12}); err != nil {
		fmt.Println("encode gagal:", err)
		return
	}
	if err := enc.Encode(Barang{ID: "B-02", Nama: "Teh", Stok: 8}); err != nil {
		fmt.Println("encode gagal:", err)
		return
	}
	fmt.Print(buf.String())

	dokumen := `{"id":"T-9","total":3,"detail":{"panjang":14,"lebar":6}}`
	var mentah map[string]json.RawMessage
	if err := json.Unmarshal([]byte(dokumen), &mentah); err != nil {
		fmt.Println("unmarshal gagal:", err)
		return
	}
	var id string
	json.Unmarshal(mentah["id"], &id)
	fmt.Println("id:", id)
	fmt.Printf("detail mentah: %s\n", mentah["detail"])
}
