github.com/storacha/go-ucanto@v0.7.2/ucan/capability.go (about) 1 package ucan 2 3 import ( 4 "encoding/json" 5 ) 6 7 type jsonModel struct { 8 Can Ability `json:"can"` 9 With Resource `json:"with"` 10 Nb interface{} `json:"nb,omitempty"` 11 } 12 13 type capability[T any] struct { 14 can Ability 15 nb T 16 with Resource 17 } 18 19 var _ Capability[any] = (*capability[any])(nil) 20 21 func (c *capability[T]) Can() Ability { 22 return c.can 23 } 24 25 func (c *capability[T]) Nb() T { 26 return c.nb 27 } 28 29 func (c *capability[T]) With() Resource { 30 return c.with 31 } 32 33 func (c *capability[T]) MarshalJSON() ([]byte, error) { 34 return json.Marshal(jsonModel{ 35 Can: c.can, 36 With: c.with, 37 Nb: c.nb, 38 }) 39 } 40 41 func NewCapability[Caveats any](can Ability, with Resource, nb Caveats) Capability[Caveats] { 42 return &capability[Caveats]{ 43 can: can, 44 with: with, 45 nb: nb, 46 } 47 }