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  }