package compiler

import (
	"bytes"
	"encoding/binary"
)

type WasmMacros struct {
	data   *bytes.Buffer
	Labels map[string]int
}

func NewWasmMacros() *WasmMacros {
	return &WasmMacros{
		data:   new(bytes.Buffer),
		Labels: map[string]int{},
	}
}

func (wm *WasmMacros) SetLabel(label string) string {
	wm.Labels[label] = wm.data.Len()
	return ""
}

func (wm *WasmMacros) GetLabel(label string) int {
	return wm.Labels[label]
}

func (wm *WasmMacros) DataB(value byte) string {
	binary.Write(wm.data, binary.LittleEndian, value)
	return ""
}

func (wm *WasmMacros) DataW(value uint16) string {
	binary.Write(wm.data, binary.LittleEndian, value)
	return ""
}

func (wm *WasmMacros) DataD(value uint32) string {
	binary.Write(wm.data, binary.LittleEndian, value)
	return ""
}

func (wm *WasmMacros) ToByte(value int) byte {
	return byte(value)
}

func (wm *WasmMacros) Data() []byte {
	return wm.data.Bytes()
}