package main
import (
"encoding/json"
"errors"
"fmt"
"io/fs"
"log"
"os"
"reflect"
"strings"
)
type Environtment struct {
Url string `json:"url" default:"https://devapi.klikbca.com/openapi/v1.0"`
ClientId string `json:"client_id" default:"abc123"`
ClientKey string `json:"client_key" default:"abc123"`
PublicKey string `json:"public_key" default:"MIGfMA0GCSqGSIb3DQEBAQUAA4GNAD"`
PrivateKey string `json:"private_key" default:"CBiQKBgQCny7nVqNIh+QhsplvWxsRZiJGQ"`
Path string `json:"path" default:"/openapi/v1.0"`
Env string `json:"go_env" default:"development"`
}
var env Environtment = Environtment{}
func main() {
if err := DotEnv(".env", &env); err != nil {
log.Fatalf(err.Error())
}
fmt.Println(env.Url)
}
func DotEnv(name string, config *Environtment) error {
envMetadataMap := make(map[string]string)
structElements := reflect.ValueOf(config).Elem()
for i := 0; i < structElements.NumField(); i++ {
structFieldsName := structElements.Type().Field(i).Name
strucFieldName, _ := reflect.TypeOf(env).FieldByName(structFieldsName)
keyStruct := strucFieldName.Tag.Get("json")
valueStruct := strings.TrimSpace(strucFieldName.Tag.Get("default"))
if err := os.Setenv(strings.ToUpper(keyStruct), valueStruct); err != nil {
return err
}
envMetadataMap[strings.ToLower(keyStruct)] = valueStruct
}
if name != "" {
cwd, err := os.Getwd()
if err != nil {
return err
}
fileExist, err := fs.Glob(os.DirFS(cwd), name)
if err != nil {
return err
}
if len(fileExist) <= 0 {
return errors.New(fmt.Sprintf("No such %s file", name))
}
readFile, err := fs.ReadFile(os.DirFS(cwd), name)
if err != nil {
return err
}
readFileBytes := string(readFile)
envMetadataSlice := strings.Split(readFileBytes, "\n")
for i := 0; i < len(envMetadataSlice); i++ {
metadatas := strings.Split(envMetadataSlice[i], "=")
key := ""
value := ""
if metadatas[0] != "" {
key = metadatas[0]
}
if metadatas[1] != "" {
value = metadatas[1]
}
if err := os.Setenv(strings.ToUpper(key), value); err != nil {
return err
}
envMetadataMap[strings.ToLower(key)] = strings.TrimSpace(value)
}
}
envMetadataBytes, err := json.Marshal(envMetadataMap)
if err != nil {
return err
}
if err := json.Unmarshal(envMetadataBytes, config); err != nil {
return err
}
return nil
}