-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
enhancementNew feature or requestNew feature or request
Description
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
Decodeperlu menerima kedua target (outStruct anydanoutMap *map[string]any), lalu memilih mana yang digunakan berdasarkanopts.Target.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request