package main

import (
	"bytes"
	"encoding/gob"
	"fmt"
)

type Pemesanan struct {
	ID     string
	Item   string
	Jumlah int
}

type Tagihan struct {
	ID     string
	Item   string
	Jumlah string // sengaja beda tipe dari Pemesanan.Jumlah
}

type Pengguna struct {
	Nama string
	nik  string // unexported: tidak pernah ikut ke gob
}

func main() {
	var buf bytes.Buffer
	if err := gob.NewEncoder(&buf).Encode(Pemesanan{ID: "P-001", Item: "Buku Go", Jumlah: 2}); err != nil {
		fmt.Println("encode gagal:", err)
		return
	}
	fmt.Printf("ukuran data biner: %d byte\n", buf.Len())

	var hasil Pemesanan
	if err := gob.NewDecoder(&buf).Decode(&hasil); err != nil {
		fmt.Println("decode gagal:", err)
		return
	}
	fmt.Printf("hasil decode: %+v\n", hasil)

	var bufP bytes.Buffer
	if err := gob.NewEncoder(&bufP).Encode(Pengguna{Nama: "Siti", nik: "3201010101010001"}); err != nil {
		fmt.Println("encode gagal:", err)
		return
	}
	var p2 Pengguna
	if err := gob.NewDecoder(&bufP).Decode(&p2); err != nil {
		fmt.Println("decode gagal:", err)
		return
	}
	fmt.Printf("pengguna: %+v\n", p2)

	var bufT bytes.Buffer
	if err := gob.NewEncoder(&bufT).Encode(Pemesanan{ID: "P-002", Item: "Kopi", Jumlah: 1}); err != nil {
		fmt.Println("encode gagal:", err)
		return
	}
	var t Tagihan
	err := gob.NewDecoder(&bufT).Decode(&t)
	fmt.Println("galat tipe beda:", err)
}
