github.com/octohelm/wagon@v0.0.0-20240308040401-88662650dc0b/pkg/engine/plan/task/core/socket.go (about) 1 package core 2 3 import ( 4 "context" 5 "encoding/json" 6 "sync" 7 8 "github.com/opencontainers/go-digest" 9 10 "dagger.io/dagger" 11 ) 12 13 func init() { 14 DefaultFactory.Register(&Socket{}) 15 } 16 17 type Socket struct { 18 Meta struct { 19 Socket struct { 20 ID string `json:"id,omitempty"` 21 } `json:"socket"` 22 } `json:"$wagon"` 23 } 24 25 var socketIDs = sync.Map{} 26 27 func (s Socket) SocketID() dagger.SocketID { 28 if id, ok := fsids.Load(s.Meta.Socket.ID); ok { 29 return id.(dagger.SocketID) 30 } 31 return "" 32 } 33 34 func (s *Socket) SetSocketID(id dagger.SocketID) { 35 key := digest.FromString(string(id)).String() 36 fsids.Store(key, id) 37 s.Meta.Socket.ID = key 38 } 39 40 func (v *Socket) SetSocketIDBy(ctx context.Context, socket *dagger.Socket) error { 41 id, err := socket.ID(ctx) 42 if err != nil { 43 return err 44 } 45 v.SetSocketID(id) 46 return nil 47 } 48 49 type SocketOrString struct { 50 Value string 51 Socket *Socket 52 } 53 54 func (SocketOrString) OneOf() []any { 55 return []any{ 56 "", 57 &Socket{}, 58 } 59 } 60 61 func (s *SocketOrString) UnmarshalJSON(data []byte) error { 62 if len(data) > 0 && data[0] == '{' { 63 se := &Socket{} 64 if err := json.Unmarshal(data, se); err != nil { 65 return err 66 } 67 s.Socket = se 68 return nil 69 } 70 return json.Unmarshal(data, &s.Value) 71 } 72 73 func (s SocketOrString) MarshalJSON() ([]byte, error) { 74 if s.Socket != nil { 75 return json.Marshal(s.Socket) 76 } 77 return json.Marshal(s.Value) 78 }