diags/grpcapi/diag.go

74 lines
1.4 KiB
Go

package grpcapi
import (
"encoding/json"
"git.coopgo.io/coopgo-platform/diags/storage"
"github.com/rs/zerolog/log"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/types/known/structpb"
)
func (e Diag) ToStorageType() storage.Diag {
diag := storage.Diag{
ID: e.Id,
Name: e.Name,
Namespace: e.Namespace,
Json_schema: e.JsonSchema,
Ui_schema: e.UiSchema,
Data: map[string]any{},
Deleted: e.Deleted,
}
for k, d := range e.Data.GetFields() {
jsondata, err := protojson.Marshal(d)
if err != nil {
log.Error().Err(err).Msg("")
break
}
var data any
json.Unmarshal(jsondata, &data)
diag.Data[k] = data
}
return diag
}
func DiagFromStorageType(diag *storage.Diag) (*Diag, error) {
d, err := sanitizeData(diag.Data)
if err != nil {
return nil, err
}
data, err := structpb.NewStruct(d)
if err != nil {
log.Error().Err(err).Msg("")
return nil, err
}
return &Diag{
Id: diag.ID,
Name: diag.Name,
Namespace: diag.Namespace,
JsonSchema: diag.Json_schema,
UiSchema: diag.Ui_schema,
Data: data,
Deleted: diag.Deleted,
}, nil
}
func sanitizeData(data map[string]any) (d map[string]any, err error) {
j, err := json.Marshal(data)
if err != nil {
return nil, err
}
if err = json.Unmarshal(j, &d); err != nil {
return nil, err
}
return d, nil
}