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  }