github.com/mavryk-network/mvgo@v1.19.9/micheline/view.go (about) 1 // Copyright (c) 2020-2021 Blockwatch Data Inc. 2 // Author: alex@blockwatch.cc 3 4 package micheline 5 6 import ( 7 "encoding/json" 8 ) 9 10 type View struct { 11 Name string 12 Param Type 13 Retval Type 14 Code Prim 15 Prim Prim 16 } 17 18 type Views map[string]View 19 20 func NewView(p Prim) View { 21 vp := p.Clone() 22 return View{ 23 Name: vp.Args[0].String, 24 Param: Type{vp.Args[1]}, 25 Retval: Type{vp.Args[2]}, 26 Code: vp.Args[3], 27 Prim: vp, 28 } 29 } 30 31 func NewViewPtr(p Prim) *View { 32 v := NewView(p) 33 return &v 34 } 35 36 func (v View) IsValid() bool { 37 return v.Name != "" && v.Param.IsValid() && v.Retval.IsValid() 38 } 39 40 func (v View) IsEqual(v2 View) bool { 41 return IsEqualPrim(v.Param.Prim, v2.Param.Prim, false) && IsEqualPrim(v.Retval.Prim, v2.Retval.Prim, false) 42 } 43 44 func (v View) IsEqualWithAnno(v2 View) bool { 45 return IsEqualPrim(v.Param.Prim, v2.Param.Prim, true) && IsEqualPrim(v.Retval.Prim, v2.Retval.Prim, true) 46 } 47 48 func (v View) IsEqualWithCode(v2 View) bool { 49 return v.IsEqual(v2) && IsEqualPrim(v.Code, v2.Code, false) 50 } 51 52 // TODO if needed 53 // func (v *View) UnmarshalBinary(buf []byte) error { 54 // return t.Prim.UnmarshalBinary(buf) 55 // } 56 57 func (v View) MarshalJSON() ([]byte, error) { 58 if !v.IsValid() { 59 return []byte("{}"), nil 60 } 61 type view struct { 62 Type Typedef `json:"type"` 63 Prim *Prim `json:"prim,omitempty"` 64 Code *Prim `json:"code,omitempty"` 65 } 66 val := view{ 67 Type: v.Typedef(), 68 } 69 if v.Code.IsValid() { 70 val.Code = &v.Code 71 } 72 if v.Prim.IsValid() { 73 val.Prim = &v.Prim 74 } 75 return json.Marshal(val) 76 } 77 78 func (v View) Clone() View { 79 return View{ 80 Name: v.Name, 81 Param: v.Param.Clone(), 82 Retval: v.Retval.Clone(), 83 Code: v.Code.Clone(), 84 } 85 } 86 87 func (v View) Typedef() Typedef { 88 return Typedef{ 89 Name: v.Name, 90 Type: K_VIEW.String(), 91 Args: []Typedef{ 92 buildTypedef(CONST_PARAM, v.Param.Prim, []int{}), 93 buildTypedef(CONST_RETURN, v.Retval.Prim, []int{}), 94 }, 95 } 96 } 97 98 func (v View) TypedefPtr(name string) *Typedef { 99 td := v.Typedef() 100 return &td 101 }