github.com/mavryk-network/mvgo@v1.19.9/micheline/annots.go (about)

     1  // Copyright (c) 2020-2021 Blockwatch Data Inc.
     2  // Author: alex@blockwatch.cc
     3  
     4  package micheline
     5  
     6  import (
     7  	"strings"
     8  )
     9  
    10  const (
    11  	TypeAnnoPrefix  = ":"
    12  	VarAnnoPrefix   = "%"
    13  	FieldAnnoPrefix = "@"
    14  )
    15  
    16  func (p *Prim) StripAnno(name string) {
    17  	for i := 0; i < len(p.Anno); i++ {
    18  		if p.Anno[i][1:] == name {
    19  			p.Anno = append(p.Anno[:i], p.Anno[i+1:]...)
    20  			i--
    21  		}
    22  	}
    23  }
    24  
    25  func (p Prim) HasAnno() bool {
    26  	if len(p.Anno) == 0 {
    27  		return false
    28  	}
    29  	for _, v := range p.Anno {
    30  		if len(v) > 0 {
    31  			return true
    32  		}
    33  	}
    34  	return false
    35  }
    36  
    37  func (p Prim) MatchesAnno(anno string) bool {
    38  	if len(p.Anno) == 0 {
    39  		return false
    40  	}
    41  	if len(anno) > 0 {
    42  		switch string(anno[0]) {
    43  		case TypeAnnoPrefix, VarAnnoPrefix, FieldAnnoPrefix:
    44  			anno = anno[1:]
    45  		}
    46  	}
    47  	for _, v := range p.Anno {
    48  		if v[1:] == anno {
    49  			return true
    50  		}
    51  	}
    52  	return false
    53  }
    54  
    55  func (p Prim) HasTypeAnno() bool {
    56  	for _, v := range p.Anno {
    57  		if strings.HasPrefix(v, TypeAnnoPrefix) {
    58  			return true
    59  		}
    60  	}
    61  	return false
    62  }
    63  
    64  func (p Prim) GetTypeAnno() string {
    65  	for _, v := range p.Anno {
    66  		if strings.HasPrefix(v, TypeAnnoPrefix) {
    67  			return v[1:]
    68  		}
    69  	}
    70  	return ""
    71  }
    72  
    73  // prefers TypeAnno, first anno otherwise
    74  func (p Prim) GetTypeAnnoAny() string {
    75  	if len(p.Anno) > 0 {
    76  		if p.HasTypeAnno() {
    77  			return p.GetTypeAnno()
    78  		}
    79  		if len(p.Anno[0]) > 1 {
    80  			return p.Anno[0][1:]
    81  		}
    82  	}
    83  	return ""
    84  }
    85  
    86  func (p Prim) HasVarAnno() bool {
    87  	for _, v := range p.Anno {
    88  		if strings.HasPrefix(v, VarAnnoPrefix) {
    89  			return true
    90  		}
    91  	}
    92  	return false
    93  }
    94  
    95  func (p Prim) GetVarAnno() string {
    96  	for _, v := range p.Anno {
    97  		if strings.HasPrefix(v, VarAnnoPrefix) {
    98  			return v[1:]
    99  		}
   100  	}
   101  	return ""
   102  }
   103  
   104  // prefers VarAnno, first anno otherwise
   105  func (p Prim) GetVarAnnoAny() string {
   106  	if len(p.Anno) > 0 {
   107  		if p.HasVarAnno() {
   108  			return p.GetVarAnno()
   109  		}
   110  		if len(p.Anno[0]) > 1 {
   111  			return p.Anno[0][1:]
   112  		}
   113  	}
   114  	return ""
   115  }
   116  
   117  func (p Prim) HasFieldAnno() bool {
   118  	for _, v := range p.Anno {
   119  		if strings.HasPrefix(v, FieldAnnoPrefix) {
   120  			return true
   121  		}
   122  	}
   123  	return false
   124  }
   125  
   126  func (p Prim) GetFieldAnno() string {
   127  	for _, v := range p.Anno {
   128  		if strings.HasPrefix(v, FieldAnnoPrefix) {
   129  			return v[1:]
   130  		}
   131  	}
   132  	return ""
   133  }
   134  
   135  // prefers FieldAnno, first anno otherwise
   136  func (p Prim) GetFieldAnnoAny() string {
   137  	if len(p.Anno) > 0 {
   138  		if p.HasFieldAnno() {
   139  			return p.GetFieldAnno()
   140  		}
   141  		if len(p.Anno[0]) > 1 {
   142  			return p.Anno[0][1:]
   143  		}
   144  	}
   145  	return ""
   146  }
   147  
   148  func (p Prim) HasVarOrFieldAnno() bool {
   149  	for _, v := range p.Anno {
   150  		if strings.HasPrefix(v, FieldAnnoPrefix) || strings.HasPrefix(v, VarAnnoPrefix) {
   151  			return true
   152  		}
   153  	}
   154  	return false
   155  }
   156  
   157  func (p Prim) GetVarOrFieldAnno() string {
   158  	for _, v := range p.Anno {
   159  		if strings.HasPrefix(v, FieldAnnoPrefix) || strings.HasPrefix(v, VarAnnoPrefix) {
   160  			return v[1:]
   161  		}
   162  	}
   163  	return ""
   164  }