package main

import (
	"encoding/binary"
	"image/color"
	"io"
	"log"
	"os"
)

// GOPHER OMIT
type Gopher struct {
	Name     string
	Age      int32
	FurColor color.Color
}

// DUMP OMIT
func (g *Gopher) DumpBinary(w io.Writer) error {
	err := binary.Write(w, binary.LittleEndian, int32(len(g.Name)))
	if err == nil {
		_, err := w.Write([]byte(g.Name))
		if err == nil {
			err := binary.Write(w, binary.LittleEndian, g.Age)
			if err == nil {
				return binary.Write(w, binary.LittleEndian, g.FurColor)
			}
			return err
		}
		return err
	}
	return err
}

// MAIN OMIT
func main() {
	w := os.Stdout
	g := &Gopher{
		Name:     "Gophertiti",
		Age:      3383,
		FurColor: color.RGBA{B: 255},
	}

	if err := g.DumpBinary(w); err != nil {
		log.Fatal("DumpBinary: %v", err)
	}
}

func (g *Gopher) DumpToFile(f *os.File) error {
	return nil
}

func (g *Gopher) DumpToReadWriter(rw io.ReadWriter) error {
	return nil
}

func (g *Gopher) DumpToWriter(f io.Writer) error {
	return nil
}
