Skip to content

Instantly share code, notes, and snippets.

@aasumitro
Last active December 30, 2022 08:45
Show Gist options
  • Save aasumitro/e538bf5a0e0c7937c7b0127a2267c296 to your computer and use it in GitHub Desktop.
Save aasumitro/e538bf5a0e0c7937c7b0127a2267c296 to your computer and use it in GitHub Desktop.
DATA TRANSFORMER

Data Transformer

@aasumitro
Copy link
Author

aasumitro commented Dec 29, 2022

GO IMPLEMENTATION

package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"io"
	"log"
	"os"
	"path/filepath"
	"strings"
)

var (
	fileDir, fileExt, fileOutDir = "", "json", "./storage"
	helpFlag                     = []string{"-h", "--h", "--help", "help"}
	fileFlag                     = []string{"-f", "--f", "--file", "file"}
	extensionFlag                = []string{"-t", "--t", "--transform", "transform"}
	outputFlag                   = []string{"-o", "--o", "--output", "output"}
)

func main() {
	args := os.Args

	if len(args) <= 1 {
		log.Println("show home")
		// TODO SHOW APP NAME & DESCRIPTION, ETC.
		return
	}

	if len(args) > 1 {
		lenReadFile := len(args) > 2
		lenWriteFile := len(args) > 4

		if contains(helpFlag, args[1]) {
			log.Println("show help flags")
			// TODO REGISTER NEW FUNCTION THAT SHOW HELP OPTIONS
			return
		}

		for i, arg := range args {
			switch {
			case contains(fileFlag, arg) && lenReadFile:
				fileDir = args[i+1]
			case contains(extensionFlag, arg) && lenWriteFile:
				fileExt = args[i+1]
			case contains(outputFlag, arg) && lenWriteFile:
				fileOutDir = args[i+1]
			}
		}

		if fileDir != "" {
			data := readFileContents(fileDir)
			if data == nil {
				log.Println("cannot proceed log data")
				return
			}

			err := writeFileContent(fileExt, fileOutDir, data)
			if err != nil {
				log.Println("failed to create file")
				return
			}

			log.Printf("new file created at %s/log.%s", fileOutDir, fileExt)
		}
	}
}

func contains(elements []string, element string) bool {
	for _, elem := range elements {
		if strings.Contains(element, elem) {
			return true
		}
	}
	return false
}

func readFileContents(path string) []string {
	filePath := filepath.Join(path)

	file, err := os.Open(filePath)
	if err != nil {
		log.Println(err)
		return nil
	}
	defer func(file *os.File) { _ = file.Close() }(file)

	scanner := bufio.NewScanner(file)

	var data []string
	for scanner.Scan() {
		line := scanner.Text()
		data = append(data, line)
	}

	if err := scanner.Err(); err != nil {
		log.Println(err)
		return nil
	}

	return data
}

func writeFileContent(extension, path string, data []string) error {
	// Open the file for writing
	filename := fmt.Sprintf("%s/log.%s", path, extension)
	file, err := os.Create(filename)
	if err != nil {
		return err
	}
	defer func(file *os.File) { _ = file.Close() }(file)

	if extension == "json" {
		// Marshal the values into a JSON object
		// TODO FORMAT DATA
		jsonData, err := json.MarshalIndent(data, "", "  ")
		if err != nil {
			return err
		}

		// Write the JSON object to a file
		_, err = io.WriteString(file, string(jsonData))
		if err != nil {
			return err
		}
	}

	if extension == "text" {
		for _, value := range data {
			_, err = io.WriteString(file, value+"\n")
			if err != nil {
				return err
			}
		}
	}

	return nil
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment