Skip to content

add option decode #16

@ahyalfan

Description

@ahyalfan

Untuk menambahkan fleksibilitas dalam menentukan target decoding (apakah ke struct, ke map[string]any, atau keduanya), kamu bisa memperluas DecodeOption dengan sebuah field baru yang mengontrol perilaku tersebut.

Berikut pendekatan yang bersih dan mudah dipahami:

✅ Opsi: Tambahkan enum-style field dengan tipe kustom

// DecodeTarget menentukan ke mana hasil decoding akan ditujukan
type DecodeTarget int

const (
	DecodeToStruct DecodeTarget = iota // default: decode hanya ke struct
	DecodeToMap                        // decode hanya ke map[string]any
	DecodeToBoth                       // decode ke struct dan map
)

type DecodeOption struct {
	AutomaticEnv      bool
	PersistToOSEnv    bool
	PreferFileOverEnv bool
	Target            DecodeTarget // default: DecodeToStruct
}

Dengan ini, kamu bisa:

  • Menjaga default Target: DecodeToStruct (tidak breaking change).
  • Memberi fleksibilitas: user bisa memilih target decoding.
  • Menghindari ambiguitas dibandingkan hanya memakai boolean.

🛠 Contoh penggunaan:

opts := DecodeOption{
	Target:            DecodeToMap,
	AutomaticEnv:      true,
	PersistToOSEnv:    false,
	PreferFileOverEnv: true,
}

Lalu di dalam fungsi decoder:

func Decode(cfgFile string, outStruct any, outMap *map[string]any, opts DecodeOption) error {
	// ... parse config dari file/env/string ...

	switch opts.Target {
	case DecodeToStruct:
		if outStruct == nil {
			return errors.New("outStruct is required when Target is DecodeToStruct")
		}
		// decode ke outStruct

	case DecodeToMap:
		if outMap == nil {
			return errors.New("outMap is required when Target is DecodeToMap")
		}
		// decode ke *outMap

	case DecodeToBoth:
		if outStruct == nil || outMap == nil {
			return errors.New("both outStruct and outMap are required for DecodeToBoth")
		}
		// decode ke keduanya

	default:
		return errors.New("invalid DecodeTarget")
	}

	// ... lanjutkan dengan PersistToOSEnv, dll ...
}

Catatan: Parameter fungsi Decode perlu menerima kedua target (outStruct any dan outMap *map[string]any), lalu memilih mana yang digunakan berdasarkan opts.Target.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions