github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/appdef/impl_command.go (about)

     1  /*
     2   * Copyright (c) 2023-present Sigma-Soft, Ltd.
     3   * @author: Nikolay Nikitin
     4   */
     5  
     6  package appdef
     7  
     8  import (
     9  	"errors"
    10  	"fmt"
    11  )
    12  
    13  // # Implements:
    14  //   - ICommand
    15  type command struct {
    16  	function
    17  	unl typeRef
    18  }
    19  
    20  func newCommand(app *appDef, name QName) *command {
    21  	cmd := &command{}
    22  	cmd.function = makeFunc(app, name, TypeKind_Command)
    23  	app.appendType(cmd)
    24  	return cmd
    25  }
    26  
    27  func (cmd *command) UnloggedParam() IType {
    28  	return cmd.unl.target(cmd.app)
    29  }
    30  
    31  // Validates command
    32  func (cmd *command) Validate() (err error) {
    33  	err = cmd.function.Validate()
    34  
    35  	if ok, e := cmd.unl.valid(cmd.app); !ok {
    36  		err = errors.Join(err, fmt.Errorf("%v: invalid or unknown unlogged parameter type: %w", cmd, e))
    37  	} else if typ := cmd.UnloggedParam(); typ != nil {
    38  		switch typ.Kind() {
    39  		case TypeKind_Any, TypeKind_Data, TypeKind_ODoc, TypeKind_Object: // ok
    40  		default:
    41  			err = errors.Join(err, ErrInvalid("unlogged parameter type «%v», should be ODoc, Object or Data", typ))
    42  		}
    43  	}
    44  
    45  	return err
    46  }
    47  
    48  func (cmd *command) setUnloggedParam(name QName) {
    49  	cmd.unl.setName(name)
    50  }
    51  
    52  type commandBuilder struct {
    53  	functionBuilder
    54  	*command
    55  }
    56  
    57  func newCommandBuilder(command *command) *commandBuilder {
    58  	return &commandBuilder{
    59  		functionBuilder: makeFunctionBuilder(&command.function),
    60  		command:         command,
    61  	}
    62  }
    63  
    64  func (cb *commandBuilder) SetUnloggedParam(name QName) ICommandBuilder {
    65  	cb.command.setUnloggedParam(name)
    66  	return cb
    67  }