github.com/GuanceCloud/cliutils@v1.1.21/pipeline/ptinput/funcs/fn_pt_kvs.go (about)

     1  package funcs
     2  
     3  import (
     4  	_ "embed"
     5  
     6  	"github.com/GuanceCloud/platypus/pkg/ast"
     7  	"github.com/GuanceCloud/platypus/pkg/engine/runtime"
     8  	"github.com/GuanceCloud/platypus/pkg/errchain"
     9  )
    10  
    11  // embed docs.
    12  var (
    13  	//go:embed md/pt_kvs_get.md
    14  	docPtKvsGet string
    15  
    16  	//go:embed md/pt_kvs_get.en.md
    17  	docPtKvsGetEN string
    18  
    19  	//go:embed md/pt_kvs_set.md
    20  	docKvsSet string
    21  
    22  	//go:embed md/pt_kvs_set.en.md
    23  	docPtKvsSetEN string
    24  
    25  	//go:embed md/pt_kvs_del.md
    26  	docKvsDel string
    27  
    28  	//go:embed md/pt_kvs_del.en.md
    29  	docPtKvsDelEN string
    30  
    31  	//go:embed md/pt_kvs_keys.md
    32  	docKvsKeys string
    33  
    34  	//go:embed md/pt_kvs_keys.en.md
    35  	docPtKvsKeysEN string
    36  
    37  	// todo: parse function definition
    38  	_ = "fn pt_kvs_get(name: str) -> any"
    39  	_ = "fn pt_kvs_set(name: str, value: any, as_tag: bool = false) -> bool"
    40  	_ = "fn pt_kvs_del(name: str)"
    41  	_ = "fn pt_kvs_keys(tags: bool = true, fields: bool = true) -> list"
    42  
    43  	FnPtKvsGet = NewFunc(
    44  		"pt_kvs_get",
    45  		[]*Param{
    46  			{
    47  				Name: "name",
    48  				Type: []ast.DType{ast.String},
    49  			},
    50  		},
    51  		[]ast.DType{ast.Bool, ast.Int, ast.Float, ast.String,
    52  			ast.List, ast.Map, ast.Nil},
    53  		[2]*PLDoc{
    54  			{
    55  				Language: langTagZhCN, Doc: docPtKvsGet,
    56  				FnCategory: map[string][]string{
    57  					langTagZhCN: {cPointOp}},
    58  			},
    59  			{
    60  				Language: langTagEnUS, Doc: docPtKvsGetEN,
    61  				FnCategory: map[string][]string{
    62  					langTagEnUS: {ePointOp}},
    63  			},
    64  		},
    65  		ptKvsGet,
    66  	)
    67  
    68  	FnPtKvsSet = NewFunc(
    69  		"pt_kvs_set",
    70  		[]*Param{
    71  			{
    72  				Name: "name",
    73  				Type: []ast.DType{ast.String},
    74  			},
    75  			{
    76  				Name: "value",
    77  				Type: []ast.DType{ast.Bool, ast.Int, ast.Float, ast.String,
    78  					ast.List, ast.Map, ast.Nil},
    79  			},
    80  			{
    81  				Name:     "as_tag",
    82  				Type:     []ast.DType{ast.Bool},
    83  				Optional: true,
    84  				DefaultVal: func() (any, ast.DType) {
    85  					return false, ast.Bool
    86  				},
    87  			},
    88  		},
    89  		[]ast.DType{ast.Bool},
    90  		[2]*PLDoc{
    91  			{
    92  				Language: langTagZhCN, Doc: docKvsSet,
    93  				FnCategory: map[string][]string{
    94  					langTagZhCN: {cPointOp}},
    95  			},
    96  			{
    97  				Language: langTagEnUS, Doc: docPtKvsSetEN,
    98  				FnCategory: map[string][]string{
    99  					langTagEnUS: {ePointOp}},
   100  			},
   101  		},
   102  		ptKvsSet,
   103  	)
   104  
   105  	FnPtKvsDel = NewFunc(
   106  		"pt_kvs_del",
   107  		[]*Param{
   108  			{
   109  				Name: "name",
   110  				Type: []ast.DType{ast.String},
   111  			},
   112  		},
   113  		nil,
   114  		[2]*PLDoc{
   115  			{
   116  				Language: langTagZhCN, Doc: docKvsDel,
   117  				FnCategory: map[string][]string{
   118  					langTagZhCN: {cPointOp}},
   119  			},
   120  			{
   121  				Language: langTagEnUS, Doc: docPtKvsDelEN,
   122  				FnCategory: map[string][]string{
   123  					langTagEnUS: {ePointOp}},
   124  			},
   125  		},
   126  		ptKvsDel,
   127  	)
   128  
   129  	FnPtKvsKeys = NewFunc(
   130  		"pt_kvs_keys",
   131  		[]*Param{
   132  			{
   133  				Name:     "tags",
   134  				Type:     []ast.DType{ast.Bool},
   135  				Optional: true,
   136  				DefaultVal: func() (any, ast.DType) {
   137  					return true, ast.Bool
   138  				},
   139  			},
   140  			{
   141  				Name:     "fields",
   142  				Type:     []ast.DType{ast.Bool},
   143  				Optional: true,
   144  				DefaultVal: func() (any, ast.DType) {
   145  					return true, ast.Bool
   146  				},
   147  			},
   148  		},
   149  		[]ast.DType{ast.List},
   150  		[2]*PLDoc{
   151  			{
   152  				Language: langTagZhCN, Doc: docKvsKeys,
   153  				FnCategory: map[string][]string{
   154  					langTagZhCN: {cPointOp}},
   155  			},
   156  			{
   157  				Language: langTagEnUS, Doc: docPtKvsKeysEN,
   158  				FnCategory: map[string][]string{
   159  					langTagEnUS: {ePointOp}},
   160  			},
   161  		},
   162  		ptKvsKeys,
   163  	)
   164  )
   165  
   166  func ptKvsGet(ctx *runtime.Task, funcExpr *ast.CallExpr, vals ...any) *errchain.PlError {
   167  	if val, dtype, err := getPtKey(ctx.InData(), vals[0].(string)); err != nil {
   168  		ctx.Regs.ReturnAppend(nil, ast.Nil)
   169  	} else {
   170  		ctx.Regs.ReturnAppend(val, dtype)
   171  	}
   172  
   173  	return nil
   174  }
   175  
   176  func ptKvsSet(ctx *runtime.Task, funcExpr *ast.CallExpr, vals ...any) *errchain.PlError {
   177  	name := vals[0].(string)
   178  	asTag := vals[2].(bool)
   179  	val := vals[1]
   180  
   181  	pt, err := getPoint(ctx.InData())
   182  	if err != nil {
   183  		ctx.Regs.ReturnAppend(false, ast.Bool)
   184  		return nil
   185  	}
   186  
   187  	if asTag {
   188  		if ok := pt.SetTag(name, val, getValDtype(val)); !ok {
   189  			ctx.Regs.ReturnAppend(false, ast.Bool)
   190  			return nil
   191  		}
   192  	} else {
   193  		if ok := pt.Set(name, val, getValDtype(val)); !ok {
   194  			ctx.Regs.ReturnAppend(false, ast.Bool)
   195  			return nil
   196  		}
   197  	}
   198  
   199  	ctx.Regs.ReturnAppend(true, ast.Bool)
   200  	return nil
   201  }
   202  
   203  func ptKvsDel(ctx *runtime.Task, funcExpr *ast.CallExpr, vals ...any) *errchain.PlError {
   204  	name := vals[0].(string)
   205  	deletePtKey(ctx.InData(), name)
   206  	return nil
   207  }
   208  
   209  func ptKvsKeys(ctx *runtime.Task, funcExpr *ast.CallExpr, vals ...any) *errchain.PlError {
   210  	tags := vals[0].(bool)
   211  	fields := vals[1].(bool)
   212  
   213  	pt, err := getPoint(ctx.InData())
   214  	if err != nil {
   215  		ctx.Regs.ReturnAppend(false, ast.Bool)
   216  		return nil
   217  	}
   218  
   219  	var elemCount int
   220  
   221  	if tags {
   222  		elemCount += len(pt.Tags())
   223  	}
   224  	if fields {
   225  		elemCount += len(pt.Fields())
   226  	}
   227  
   228  	keyList := make([]any, 0, elemCount)
   229  
   230  	if tags {
   231  		for k := range pt.Tags() {
   232  			keyList = append(keyList, k)
   233  		}
   234  	}
   235  	if fields {
   236  		for k := range pt.Fields() {
   237  			keyList = append(keyList, k)
   238  		}
   239  	}
   240  
   241  	ctx.Regs.ReturnAppend(keyList, ast.List)
   242  
   243  	return nil
   244  }