package JsonSerialization
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"git.tovijaeschke.xyz/tovi/Envelope/Backend/Models"
|
|
|
|
schema "github.com/Kangaroux/go-map-schema"
|
|
)
|
|
|
|
func DeserializeUser(data []byte, allowMissing []string, allowAllMissing bool) (Models.User, error) {
|
|
var (
|
|
userData Models.User = Models.User{}
|
|
jsonStructureTest map[string]interface{} = make(map[string]interface{})
|
|
jsonStructureTestResults *schema.CompareResults
|
|
field schema.FieldMissing
|
|
allowed string
|
|
missingFields []string
|
|
i int
|
|
err error
|
|
)
|
|
|
|
// Verify the JSON has the correct structure
|
|
json.Unmarshal(data, &jsonStructureTest)
|
|
jsonStructureTestResults, err = schema.CompareMapToStruct(
|
|
&userData,
|
|
jsonStructureTest,
|
|
&schema.CompareOpts{
|
|
ConvertibleFunc: CanConvert,
|
|
TypeNameFunc: schema.DetailedTypeName,
|
|
})
|
|
if err != nil {
|
|
return userData, err
|
|
}
|
|
|
|
if len(jsonStructureTestResults.MismatchedFields) > 0 {
|
|
return userData, errors.New(fmt.Sprintf(
|
|
"MismatchedFields found when deserializing data: %s",
|
|
jsonStructureTestResults.Errors().Error(),
|
|
))
|
|
}
|
|
|
|
// Remove allowed missing fields from MissingFields
|
|
for _, allowed = range allowMissing {
|
|
for i, field = range jsonStructureTestResults.MissingFields {
|
|
if allowed == field.String() {
|
|
jsonStructureTestResults.MissingFields = append(
|
|
jsonStructureTestResults.MissingFields[:i],
|
|
jsonStructureTestResults.MissingFields[i+1:]...,
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
if !allowAllMissing && len(jsonStructureTestResults.MissingFields) > 0 {
|
|
for _, field = range jsonStructureTestResults.MissingFields {
|
|
missingFields = append(missingFields, field.String())
|
|
}
|
|
|
|
return userData, errors.New(fmt.Sprintf(
|
|
"MissingFields found when deserializing data: %s",
|
|
strings.Join(missingFields, ", "),
|
|
))
|
|
}
|
|
|
|
// Deserialize the JSON into the struct
|
|
err = json.Unmarshal(data, &userData)
|
|
if err != nil {
|
|
return userData, err
|
|
}
|
|
|
|
return userData, err
|
|
}
|