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  }