mirror of https://github.com/portainer/portainer
51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
![]() |
package portainer
|
||
|
|
||
|
import "github.com/segmentio/encoding/json"
|
||
|
|
||
|
type (
|
||
|
PendingActionID int
|
||
|
PendingAction struct {
|
||
|
ID PendingActionID `json:"ID"`
|
||
|
EndpointID EndpointID `json:"EndpointID"`
|
||
|
Action string `json:"Action"`
|
||
|
ActionData any `json:"ActionData"`
|
||
|
CreatedAt int64 `json:"CreatedAt"`
|
||
|
}
|
||
|
|
||
|
PendingActionHandler interface {
|
||
|
Execute(PendingAction, *Endpoint) error
|
||
|
}
|
||
|
)
|
||
|
|
||
|
// MarshalJSON marshals the PendingAction struct to JSON
|
||
|
// and converts the ActionData field to an embedded json string
|
||
|
// This makes unmarshalling the ActionData field easier
|
||
|
func (pa PendingAction) MarshalJSON() ([]byte, error) {
|
||
|
// Create a map to hold the marshalled fields
|
||
|
data := map[string]any{
|
||
|
"ID": pa.ID,
|
||
|
"EndpointID": pa.EndpointID,
|
||
|
"Action": pa.Action,
|
||
|
"CreatedAt": pa.CreatedAt,
|
||
|
}
|
||
|
|
||
|
actionDataBytes, err := json.Marshal(pa.ActionData)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
data["ActionData"] = string(actionDataBytes)
|
||
|
|
||
|
// Marshal the map
|
||
|
return json.Marshal(data)
|
||
|
}
|
||
|
|
||
|
// Unmarshal the ActionData field from a string to a specific type.
|
||
|
func (pa PendingAction) UnmarshallActionData(v any) error {
|
||
|
s, ok := pa.ActionData.(string)
|
||
|
if !ok {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
return json.Unmarshal([]byte(s), v)
|
||
|
}
|