mirror of
https://github.com/moby/buildkit.git
synced 2026-08-04 14:50:21 +00:00
With the switch from gogo, the `oneof` fields no longer have their `json:"name"` fields emitted. Protobuf doesn't formally support these fields and tells users to use the `protojson` package, but we didn't and the official format is incompatible with the current format we use. This adds some custom marshaling code to the already existant custom unmarshaling code to ensure these fields are marshaled with the correct casing. Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
151 lines
3.5 KiB
Go
151 lines
3.5 KiB
Go
package pb
|
|
|
|
import "encoding/json"
|
|
|
|
type jsonOp struct {
|
|
Inputs []*Input `json:"inputs,omitempty"`
|
|
Op struct {
|
|
Exec *ExecOp `json:"exec,omitempty"`
|
|
Source *SourceOp `json:"source,omitempty"`
|
|
File *FileOp `json:"file,omitempty"`
|
|
Build *BuildOp `json:"build,omitempty"`
|
|
Merge *MergeOp `json:"merge,omitempty"`
|
|
Diff *DiffOp `json:"diff,omitempty"`
|
|
}
|
|
Platform *Platform `json:"platform,omitempty"`
|
|
Constraints *WorkerConstraints `json:"constraints,omitempty"`
|
|
}
|
|
|
|
func (m *Op) MarshalJSON() ([]byte, error) {
|
|
var v jsonOp
|
|
v.Inputs = m.Inputs
|
|
switch op := m.Op.(type) {
|
|
case *Op_Exec:
|
|
v.Op.Exec = op.Exec
|
|
case *Op_Source:
|
|
v.Op.Source = op.Source
|
|
case *Op_File:
|
|
v.Op.File = op.File
|
|
case *Op_Build:
|
|
v.Op.Build = op.Build
|
|
case *Op_Merge:
|
|
v.Op.Merge = op.Merge
|
|
case *Op_Diff:
|
|
v.Op.Diff = op.Diff
|
|
}
|
|
v.Platform = m.Platform
|
|
v.Constraints = m.Constraints
|
|
return json.Marshal(v)
|
|
}
|
|
|
|
func (m *Op) UnmarshalJSON(data []byte) error {
|
|
var v jsonOp
|
|
if err := json.Unmarshal(data, &v); err != nil {
|
|
return err
|
|
}
|
|
|
|
m.Inputs = v.Inputs
|
|
switch {
|
|
case v.Op.Exec != nil:
|
|
m.Op = &Op_Exec{v.Op.Exec}
|
|
case v.Op.Source != nil:
|
|
m.Op = &Op_Source{v.Op.Source}
|
|
case v.Op.File != nil:
|
|
m.Op = &Op_File{v.Op.File}
|
|
case v.Op.Build != nil:
|
|
m.Op = &Op_Build{v.Op.Build}
|
|
case v.Op.Merge != nil:
|
|
m.Op = &Op_Merge{v.Op.Merge}
|
|
case v.Op.Diff != nil:
|
|
m.Op = &Op_Diff{v.Op.Diff}
|
|
}
|
|
m.Platform = v.Platform
|
|
m.Constraints = v.Constraints
|
|
return nil
|
|
}
|
|
|
|
type jsonFileAction struct {
|
|
Input InputIndex `json:"input"`
|
|
SecondaryInput InputIndex `json:"secondaryInput"`
|
|
Output OutputIndex `json:"output"`
|
|
Action struct {
|
|
Copy *FileActionCopy `json:"copy,omitempty"`
|
|
Mkfile *FileActionMkFile `json:"mkfile,omitempty"`
|
|
Mkdir *FileActionMkDir `json:"mkdir,omitempty"`
|
|
Rm *FileActionRm `json:"rm,omitempty"`
|
|
}
|
|
}
|
|
|
|
func (m *FileAction) MarshalJSON() ([]byte, error) {
|
|
var v jsonFileAction
|
|
v.Input = InputIndex(m.Input)
|
|
v.SecondaryInput = InputIndex(m.SecondaryInput)
|
|
v.Output = OutputIndex(m.Output)
|
|
switch action := m.Action.(type) {
|
|
case *FileAction_Copy:
|
|
v.Action.Copy = action.Copy
|
|
case *FileAction_Mkfile:
|
|
v.Action.Mkfile = action.Mkfile
|
|
case *FileAction_Mkdir:
|
|
v.Action.Mkdir = action.Mkdir
|
|
case *FileAction_Rm:
|
|
v.Action.Rm = action.Rm
|
|
}
|
|
return json.Marshal(v)
|
|
}
|
|
|
|
func (m *FileAction) UnmarshalJSON(data []byte) error {
|
|
var v jsonFileAction
|
|
if err := json.Unmarshal(data, &v); err != nil {
|
|
return err
|
|
}
|
|
|
|
m.Input = int64(v.Input)
|
|
m.SecondaryInput = int64(v.SecondaryInput)
|
|
m.Output = int64(v.Output)
|
|
switch {
|
|
case v.Action.Copy != nil:
|
|
m.Action = &FileAction_Copy{v.Action.Copy}
|
|
case v.Action.Mkfile != nil:
|
|
m.Action = &FileAction_Mkfile{v.Action.Mkfile}
|
|
case v.Action.Mkdir != nil:
|
|
m.Action = &FileAction_Mkdir{v.Action.Mkdir}
|
|
case v.Action.Rm != nil:
|
|
m.Action = &FileAction_Rm{v.Action.Rm}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type jsonUserOpt struct {
|
|
User struct {
|
|
ByName *NamedUserOpt `json:"byName,omitempty"`
|
|
ByID uint32 `json:"byId,omitempty"`
|
|
}
|
|
}
|
|
|
|
func (m *UserOpt) MarshalJSON() ([]byte, error) {
|
|
var v jsonUserOpt
|
|
switch userOpt := m.User.(type) {
|
|
case *UserOpt_ByName:
|
|
v.User.ByName = userOpt.ByName
|
|
case *UserOpt_ByID:
|
|
v.User.ByID = userOpt.ByID
|
|
}
|
|
return json.Marshal(v)
|
|
}
|
|
|
|
func (m *UserOpt) UnmarshalJSON(data []byte) error {
|
|
var v jsonUserOpt
|
|
if err := json.Unmarshal(data, &v); err != nil {
|
|
return err
|
|
}
|
|
|
|
switch {
|
|
case v.User.ByName != nil:
|
|
m.User = &UserOpt_ByName{v.User.ByName}
|
|
default:
|
|
m.User = &UserOpt_ByID{v.User.ByID}
|
|
}
|
|
return nil
|
|
}
|