3
0
This commit is contained in:
Tomaž Jerman
2021-03-31 19:32:22 +02:00
parent 91187e6a50
commit fc331cc388
8 changed files with 146 additions and 147 deletions

View File

@@ -120,7 +120,6 @@ func (t *automationTrigger) MarshalYAML() (interface{}, error) {
"eventType", t.res.EventType,
"constraints", t.res.Constraints,
"enabled", t.res.Enabled,
"workflowID", t.res.WorkflowID,
"stepID", t.res.StepID,
"input", t.res.Input,

View File

@@ -18,136 +18,6 @@ import (
var _ = context.Background
var _ = fmt.Errorf
// Document is an expression type, wrapper for *RenderedDocument type
type Document struct{ value *RenderedDocument }
// NewDocument creates new instance of Document expression type
func NewDocument(val interface{}) (*Document, error) {
if c, err := CastToDocument(val); err != nil {
return nil, fmt.Errorf("unable to create Document: %w", err)
} else {
return &Document{value: c}, nil
}
}
// Return underlying value on Document
func (t Document) Get() interface{} { return t.value }
// Return underlying value on Document
func (t Document) GetValue() *RenderedDocument { return t.value }
// Return type name
func (Document) Type() string { return "Document" }
// Convert value to *RenderedDocument
func (Document) Cast(val interface{}) (TypedValue, error) {
return NewDocument(val)
}
// Assign new value to Document
//
// value is first passed through CastToDocument
func (t *Document) Assign(val interface{}) error {
if c, err := CastToDocument(val); err != nil {
return err
} else {
t.value = c
return nil
}
}
func (t *Document) AssignFieldValue(key string, val TypedValue) error {
return assignToDocument(t.value, key, val)
}
// SelectGVal implements gval.Selector requirements
//
// It allows gval lib to access Document's underlying value (*RenderedDocument)
// and it's fields
//
func (t Document) SelectGVal(ctx context.Context, k string) (interface{}, error) {
return documentGValSelector(t.value, k)
}
// Select is field accessor for *RenderedDocument
//
// Similar to SelectGVal but returns typed values
func (t Document) Select(k string) (TypedValue, error) {
return documentTypedValueSelector(t.value, k)
}
func (t Document) Has(k string) bool {
switch k {
case "document":
return true
case "name":
return true
case "type":
return true
}
return false
}
// documentGValSelector is field accessor for *RenderedDocument
func documentGValSelector(res *RenderedDocument, k string) (interface{}, error) {
switch k {
case "document":
return res.Document, nil
case "name":
return res.Name, nil
case "type":
return res.Type, nil
}
return nil, fmt.Errorf("unknown field '%s'", k)
}
// documentTypedValueSelector is field accessor for *RenderedDocument
func documentTypedValueSelector(res *RenderedDocument, k string) (TypedValue, error) {
switch k {
case "document":
return NewReader(res.Document)
case "name":
return NewString(res.Name)
case "type":
return NewString(res.Type)
}
return nil, fmt.Errorf("unknown field '%s'", k)
}
// assignToDocument is field value setter for *RenderedDocument
func assignToDocument(res *RenderedDocument, k string, val interface{}) error {
switch k {
case "document":
aux, err := CastToReader(val)
if err != nil {
return err
}
res.Document = aux
return nil
case "name":
aux, err := CastToString(val)
if err != nil {
return err
}
res.Name = aux
return nil
case "type":
aux, err := CastToString(val)
if err != nil {
return err
}
res.Type = aux
return nil
}
return fmt.Errorf("unknown field '%s'", k)
}
// DocumentType is an expression type, wrapper for types.DocumentType type
type DocumentType struct{ value types.DocumentType }
@@ -224,6 +94,136 @@ func (t *RenderOptions) Assign(val interface{}) error {
}
}
// RenderedDocument is an expression type, wrapper for *renderedDocument type
type RenderedDocument struct{ value *renderedDocument }
// NewRenderedDocument creates new instance of RenderedDocument expression type
func NewRenderedDocument(val interface{}) (*RenderedDocument, error) {
if c, err := CastToRenderedDocument(val); err != nil {
return nil, fmt.Errorf("unable to create RenderedDocument: %w", err)
} else {
return &RenderedDocument{value: c}, nil
}
}
// Return underlying value on RenderedDocument
func (t RenderedDocument) Get() interface{} { return t.value }
// Return underlying value on RenderedDocument
func (t RenderedDocument) GetValue() *renderedDocument { return t.value }
// Return type name
func (RenderedDocument) Type() string { return "RenderedDocument" }
// Convert value to *renderedDocument
func (RenderedDocument) Cast(val interface{}) (TypedValue, error) {
return NewRenderedDocument(val)
}
// Assign new value to RenderedDocument
//
// value is first passed through CastToRenderedDocument
func (t *RenderedDocument) Assign(val interface{}) error {
if c, err := CastToRenderedDocument(val); err != nil {
return err
} else {
t.value = c
return nil
}
}
func (t *RenderedDocument) AssignFieldValue(key string, val TypedValue) error {
return assignToRenderedDocument(t.value, key, val)
}
// SelectGVal implements gval.Selector requirements
//
// It allows gval lib to access RenderedDocument's underlying value (*renderedDocument)
// and it's fields
//
func (t RenderedDocument) SelectGVal(ctx context.Context, k string) (interface{}, error) {
return renderedDocumentGValSelector(t.value, k)
}
// Select is field accessor for *renderedDocument
//
// Similar to SelectGVal but returns typed values
func (t RenderedDocument) Select(k string) (TypedValue, error) {
return renderedDocumentTypedValueSelector(t.value, k)
}
func (t RenderedDocument) Has(k string) bool {
switch k {
case "document":
return true
case "name":
return true
case "type":
return true
}
return false
}
// renderedDocumentGValSelector is field accessor for *renderedDocument
func renderedDocumentGValSelector(res *renderedDocument, k string) (interface{}, error) {
switch k {
case "document":
return res.Document, nil
case "name":
return res.Name, nil
case "type":
return res.Type, nil
}
return nil, fmt.Errorf("unknown field '%s'", k)
}
// renderedDocumentTypedValueSelector is field accessor for *renderedDocument
func renderedDocumentTypedValueSelector(res *renderedDocument, k string) (TypedValue, error) {
switch k {
case "document":
return NewReader(res.Document)
case "name":
return NewString(res.Name)
case "type":
return NewString(res.Type)
}
return nil, fmt.Errorf("unknown field '%s'", k)
}
// assignToRenderedDocument is field value setter for *renderedDocument
func assignToRenderedDocument(res *renderedDocument, k string, val interface{}) error {
switch k {
case "document":
aux, err := CastToReader(val)
if err != nil {
return err
}
res.Document = aux
return nil
case "name":
aux, err := CastToString(val)
if err != nil {
return err
}
res.Name = aux
return nil
case "type":
aux, err := CastToString(val)
if err != nil {
return err
}
res.Type = aux
return nil
}
return fmt.Errorf("unknown field '%s'", k)
}
// Role is an expression type, wrapper for *types.Role type
type Role struct{ value *types.Role }

View File

@@ -10,7 +10,7 @@ import (
)
type (
RenderedDocument struct {
renderedDocument struct {
Document io.Reader
Name string
Type string
@@ -87,17 +87,17 @@ func CastToTemplateMeta(val interface{}) (out types.TemplateMeta, err error) {
}
}
func CastToDocument(val interface{}) (out *RenderedDocument, err error) {
func CastToRenderedDocument(val interface{}) (out *renderedDocument, err error) {
switch val := val.(type) {
case expr.Iterator:
out = &RenderedDocument{}
out = &renderedDocument{}
return out, val.Each(func(k string, v expr.TypedValue) error {
return assignToDocument(out, k, v)
return assignToRenderedDocument(out, k, v)
})
}
switch val := expr.UntypedValue(val).(type) {
case *RenderedDocument:
case *renderedDocument:
return val, nil
default:
return nil, fmt.Errorf("unable to cast type %T to %T", val, out)

View File

@@ -55,8 +55,8 @@ types:
struct:
- { name: 'short', exprType: 'String', goType: 'string'}
- { name: 'description', exprType: 'String', goType: 'string'}
Document:
as: '*RenderedDocument'
RenderedDocument:
as: '*renderedDocument'
struct:
- { name: 'document', exprType: 'Reader', goType: 'io.Reader' }
- { name: 'name', exprType: 'string', goType: 'string' }

View File

@@ -753,7 +753,7 @@ type (
}
templatesRenderResults struct {
Document *RenderedDocument
Document *renderedDocument
}
)
@@ -803,7 +803,7 @@ func (h templatesHandler) Render() *atypes.Function {
{
Name: "document",
Types: []string{"Document"},
Types: []string{"RenderedDocument"},
},
},
@@ -843,12 +843,12 @@ func (h templatesHandler) Render() *atypes.Function {
out = &expr.Vars{}
{
// converting results.Document (*RenderedDocument) to Document
// converting results.Document (*renderedDocument) to RenderedDocument
var (
tval expr.TypedValue
)
if tval, err = h.reg.Type("Document").Cast(results.Document); err != nil {
if tval, err = h.reg.Type("RenderedDocument").Cast(results.Document); err != nil {
return
} else if err = expr.Assign(out, "document", tval); err != nil {
return

View File

@@ -187,7 +187,7 @@ func (h templatesHandler) render(ctx context.Context, args *templatesRenderArgs)
}
rr := &templatesRenderResults{
Document: &RenderedDocument{
Document: &renderedDocument{
Document: doc,
Name: args.DocumentName,
Type: args.DocumentType,

View File

@@ -16,8 +16,8 @@ snippets:
rvTemplate: &rvTemplate
wf: Template
rvDocument: &rvDocument
wf: Document
rvRenderedDocument: &rvRenderedDocument
wf: RenderedDocument
rvTotal: &rvTotal
wf: UnsignedInteger
@@ -158,4 +158,4 @@ functions:
types:
- { wf: RenderOptions }
results:
document: *rvDocument
document: *rvRenderedDocument

View File

@@ -175,7 +175,7 @@ func Initialize(ctx context.Context, log *zap.Logger, s store.Storer, c Config)
automation.Role{},
automation.Template{},
automation.RenderOptions{},
automation.Document{},
automation.RenderedDocument{},
)
automation.UsersHandler(