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 }