package main

import (
	fib "0dev.org/encoding/fibonacci"
	mtf "0dev.org/encoding/mtf"
	iou "0dev.org/ioutil"
	"flag"
	"io"
	"os"
)

func main() {
	d := flag.Bool("d", false, "Toggle decode mode.")
	flag.Parse()

	var (
		input  io.Reader = iou.SizedReader(os.Stdin, 4096)
		output io.Writer = iou.SizedWriter(os.Stdout, 4096)
		code   int
	)

	// Exit handler
	defer func() {
		os.Exit(code)
	}()

	// Flush the output buffer
	defer output.Write(nil)

	if *d {
		input = mtf.Decoder(fib.Decoder(input))
	} else {
		input = mtf.Encoder(input)

		// Encode output as fibonacci integers
		output = fib.Encoder(output)
		defer output.Write(nil)
	}

	if _, err := io.Copy(output, input); err != nil {
		os.Stderr.WriteString("Error while transforming data.\n" + err.Error())
		code = 1
	}
}
