« Back to Index

Go: prepend line to stop of a file that uses toml marshal

View original Gist on GitHub

Tags: #go #serialization

main.go

package main

import (
	"bufio"
	"fmt"
	"os"

	toml "github.com/pelletier/go-toml"
)

func main() {
	err := Write("fastly.toml")
	if err != nil {
		fmt.Printf("%+v\n", err)
	}
}

type Manifest struct {
	Foo string
	Bar int
}

func Write(filename string) error {
	m := Manifest{"foo", 123}

	fp, err := os.Create(filename)
	if err != nil {
		return err
	}

	if err := toml.NewEncoder(fp).Encode(&m); err != nil {
		return err
	}

	contents := make([]string, 0)

	if _, err := fp.Seek(0, 0); err == nil {
		scanner := bufio.NewScanner(fp)
		for scanner.Scan() {
			contents = append(contents, scanner.Text())
		}

		if _, err := fp.Seek(0, 0); err == nil {
			writer := bufio.NewWriter(fp)
			writer.WriteString("# my link here\n")

			for _, line := range contents {
				_, err := writer.WriteString(line + "\n")
				if err != nil {
					return err
				}
			}

			if err := writer.Flush(); err != nil {
				return err
			}
		}
	}

	if err := fp.Sync(); err != nil {
		return err
	}

	if err := fp.Close(); err != nil {
		return err
	}

	return nil
}