github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/istructsmem/internal/descr/impl_extension.go (about) 1 /* 2 * Copyright (c) 2021-present Sigma-Soft, Ltd. 3 * @author: Nikolay Nikitin 4 */ 5 6 package descr 7 8 import ( 9 "fmt" 10 "maps" 11 12 "github.com/voedger/voedger/pkg/appdef" 13 ) 14 15 func newExtensions() *Extensions { 16 return &Extensions{ 17 Commands: make(map[appdef.QName]*CommandFunction), 18 Queries: make(map[appdef.QName]*QueryFunction), 19 Projectors: make(map[appdef.QName]*Projector), 20 } 21 } 22 23 func (ff *Extensions) read(ext appdef.IExtension) { 24 if cmd, ok := ext.(appdef.ICommand); ok { 25 c := &CommandFunction{} 26 c.read(cmd) 27 ff.Commands[c.QName] = c 28 return 29 } 30 if qry, ok := ext.(appdef.IQuery); ok { 31 q := &QueryFunction{} 32 q.read(qry) 33 ff.Queries[q.QName] = q 34 return 35 } 36 if prj, ok := ext.(appdef.IProjector); ok { 37 p := newProjector() 38 p.read(prj) 39 ff.Projectors[p.QName] = p 40 return 41 } 42 43 //notest: This panic will only work when new appdef.IFunction interface descendants appear 44 panic(fmt.Errorf("unknown func type %v", ext)) 45 } 46 47 func (e *Extension) read(ex appdef.IExtension) { 48 e.Type.read(ex) 49 e.Name = ex.Name() 50 e.Engine = ex.Engine().TrimString() 51 } 52 53 func (f *Function) read(fn appdef.IFunction) { 54 f.Extension.read(fn) 55 if a := fn.Param(); a != nil { 56 if n := a.QName(); n != appdef.NullQName { 57 f.Arg = &n 58 } 59 } 60 if r := fn.Result(); r != nil { 61 if n := r.QName(); n != appdef.NullQName { 62 f.Result = &n 63 } 64 } 65 } 66 67 func (f *CommandFunction) read(fn appdef.ICommand) { 68 f.Function.read(fn) 69 if a := fn.UnloggedParam(); a != nil { 70 if n := a.QName(); n != appdef.NullQName { 71 f.UnloggedArg = &n 72 } 73 } 74 } 75 76 func newProjector() *Projector { 77 return &Projector{ 78 Events: make(map[appdef.QName]ProjectorEvent), 79 States: make(map[appdef.QName]appdef.QNames), 80 Intents: make(map[appdef.QName]appdef.QNames), 81 } 82 } 83 84 func (p *Projector) read(prj appdef.IProjector) { 85 p.Extension.read(prj) 86 prj.Events().Enum(func(ev appdef.IProjectorEvent) { 87 e := ProjectorEvent{} 88 e.read(ev) 89 p.Events[e.On] = e 90 }) 91 p.WantErrors = prj.WantErrors() 92 p.States = maps.Clone(prj.States().Map()) 93 p.Intents = maps.Clone(prj.Intents().Map()) 94 } 95 96 func (e *ProjectorEvent) read(ev appdef.IProjectorEvent) { 97 e.Comment = ev.Comment() 98 e.On = ev.On().QName() 99 for _, k := range ev.Kind() { 100 e.Kind = append(e.Kind, k.TrimString()) 101 } 102 }