I have a config file that looks like:
{
"auth": {
"client_id": "foo",
"client_secret": "bar",
"account": "foo@bar.com",
"secrets_type": "auto"
},
"jobs": [
{
"source_folder": "folder1",
"create_albums": "off",
"delete_after_upload": false,
"include": [
"*.jpg"
],
"exclude": []
},
{
"source_folder": "folder2",
"create_albums": "folderName",
"delete_after_upload": true,
"include": [
"*.jpg", "*.webp"
],
"exclude": [
"abc*"
]
}
]
}
And I'm reading it using the viper package in golang.
I'm having problems to get the jobs
settings:
type FolderUpload struct {
sourceFolder string `mapstructure:"source_folder"`
createAlbums string `mapstructure:"create_albums"`
deleteAfterUpload bool `mapstructure:"delete_after_upload"`
include []string `mapstructure:"include"`
exclude []string `mapstructure:"exclude"`
}
// Read the "jobsSettings" section as a slice of maps
jobsSettings := viper.Get("jobs").([]interface{})
// Iterate over each job item
for _, job := range jobsSettings {
jobMap := job.(map[string]interface{})
j := FolderUploadJob{
sourceFolder: jobMap["source_folder"].(string),
createAlbums: jobMap["create_albums"].(string),
deleteAfterUpload: jobMap["delete_after_upload"].(bool),
include: jobMap["include"].([]string),
exclude: jobMap["exclude"].([]string),
}
}
I've tried with viper.UnmarshalKey()
too, but I always receive a panic when trying to read the include
and exclude
.
Can anyone point me to the right way?
viper.UnmarshalKey
works and please note that the fields of FolderUpload
should be exported. See the demo below:
package main
import (
"fmt"
"strings"
"github.com/spf13/viper"
)
func main() {
viper.SetConfigType("json")
jsonConfig := `
{
"jobs": [
{
"source_folder": "folder1",
"create_albums": "off",
"delete_after_upload": false,
"include": [
"*.jpg"
],
"exclude": []
},
{
"source_folder": "folder2",
"create_albums": "folderName",
"delete_after_upload": true,
"include": [
"*.jpg", "*.webp"
],
"exclude": [
"abc*"
]
}
]
}`
type FolderUpload struct {
SourceFolder string `mapstructure:"source_folder"`
CreateAlbums string `mapstructure:"create_albums"`
DeleteAfterUpload bool `mapstructure:"delete_after_upload"`
Include []string `mapstructure:"include"`
Exclude []string `mapstructure:"exclude"`
}
if err := viper.ReadConfig(strings.NewReader(jsonConfig)); err != nil {
panic(err)
}
var jobs []FolderUpload
if err := viper.UnmarshalKey("jobs", &jobs); err != nil {
panic(err)
}
fmt.Printf("%+v\n", jobs)
}