github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/smartcontract/manifest/event.go (about) 1 package manifest 2 3 import ( 4 "errors" 5 "fmt" 6 7 "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" 8 ) 9 10 // Event is a description of a single event. 11 type Event struct { 12 Name string `json:"name"` 13 Parameters []Parameter `json:"parameters"` 14 } 15 16 // IsValid checks Event consistency and correctness. 17 func (e *Event) IsValid() error { 18 if e.Name == "" { 19 return errors.New("empty or absent name") 20 } 21 return Parameters(e.Parameters).AreValid() 22 } 23 24 // ToStackItem converts Event to stackitem.Item. 25 func (e *Event) ToStackItem() stackitem.Item { 26 params := make([]stackitem.Item, len(e.Parameters)) 27 for i := range e.Parameters { 28 params[i] = e.Parameters[i].ToStackItem() 29 } 30 return stackitem.NewStruct([]stackitem.Item{ 31 stackitem.Make(e.Name), 32 stackitem.Make(params), 33 }) 34 } 35 36 // FromStackItem converts stackitem.Item to Event. 37 func (e *Event) FromStackItem(item stackitem.Item) error { 38 var err error 39 if item.Type() != stackitem.StructT { 40 return errors.New("invalid Event stackitem type") 41 } 42 event := item.Value().([]stackitem.Item) 43 if len(event) != 2 { 44 return errors.New("invalid Event stackitem length") 45 } 46 e.Name, err = stackitem.ToString(event[0]) 47 if err != nil { 48 return err 49 } 50 if event[1].Type() != stackitem.ArrayT { 51 return errors.New("invalid Params stackitem type") 52 } 53 params := event[1].Value().([]stackitem.Item) 54 e.Parameters = make([]Parameter, len(params)) 55 for i := range params { 56 p := new(Parameter) 57 if err := p.FromStackItem(params[i]); err != nil { 58 return err 59 } 60 e.Parameters[i] = *p 61 } 62 return nil 63 } 64 65 // CheckCompliance checks compliance of the given array of items with the 66 // current event. 67 func (e *Event) CheckCompliance(items []stackitem.Item) error { 68 if len(items) != len(e.Parameters) { 69 return fmt.Errorf("mismatch between the number of parameters and items: %d vs %d", len(e.Parameters), len(items)) 70 } 71 for i := range items { 72 if !e.Parameters[i].Type.Match(items[i]) { 73 return fmt.Errorf("parameter %d type mismatch: %s (manifest) vs %s (notification)", i, e.Parameters[i].Type.String(), items[i].Type().String()) 74 } 75 } 76 return nil 77 }