Skip to content

Commit 554918b

Browse files
committed
aaplying @ribeiromiranda's patch
Signed-off-by: Spolti <filippespolti@gmail.com>
1 parent 68dccba commit 554918b

File tree

3 files changed

+67
-34
lines changed

3 files changed

+67
-34
lines changed

model/workflow.go

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
package model
1616

1717
import (
18+
"bytes"
1819
"encoding/json"
19-
"regexp"
20+
"errors"
2021

2122
"github.com/serverlessworkflow/sdk-go/v2/util"
2223
)
@@ -522,33 +523,41 @@ type dataInputSchemaUnmarshal DataInputSchema
522523
// UnmarshalJSON implements json.Unmarshaler
523524
func (d *DataInputSchema) UnmarshalJSON(data []byte) error {
524525
d.ApplyDefault()
525-
err := util.UnmarshalObject("dataInputSchema", data, (*dataInputSchemaUnmarshal)(d))
526+
527+
// expected: data = "{\"key\": \"value\"}"
528+
// data = {"key": "value"}
529+
// data = "file://..."
530+
// data = { "schema": "{\"key\": \"value\"}", "failOnValidationErrors": true }
531+
// data = { "schema": {"key": "value"}, "failOnValidationErrors": true }
532+
// data = { "schema": "file://...", "failOnValidationErrors": true }
533+
534+
schemaString := ""
535+
err := util.UnmarshalPrimitiveOrObject("dataInputSchema", data, &schemaString, (*dataInputSchemaUnmarshal)(d))
526536
if err != nil {
527537
return err
528538
}
529539

530-
if d.Schema != nil && d.Schema.Type == String {
531-
// Define the regex pattern to match the prefixes
532-
pattern := `^(http|https|file)`
533-
regex := regexp.MustCompile(pattern)
534-
// if it is not external, treat as JSON object
535-
if !regex.MatchString(d.Schema.StringValue) {
536-
point := FromString(d.Schema.StringValue)
537-
d.Schema = &point
540+
if d.Schema != nil {
541+
if d.Schema.Type == Map {
538542
return nil
539-
}
540543

541-
data, err := util.LoadExternalResource(d.Schema.StringValue)
542-
if err != nil {
543-
return err
544+
} else if d.Schema.Type == String {
545+
schemaString = d.Schema.StringValue
546+
547+
} else {
548+
return errors.New("invalid dataInputSchema must be a string or object")
544549
}
550+
}
545551

546-
er := util.UnmarshalObject("schema", data, &d.Schema)
547-
// clean the string value to avoid the json URI being appended
548-
d.Schema.StringValue = ""
549-
return er
552+
if schemaString != "" {
553+
data = []byte(schemaString)
554+
if bytes.TrimSpace(data)[0] != '{' {
555+
data = []byte("\"" + schemaString + "\"")
556+
}
550557
}
551-
return nil
558+
559+
d.Schema = new(Object)
560+
return util.UnmarshalObjectOrFile("schema", data, &d.Schema)
552561
}
553562

554563
// ApplyDefault set the default values for Data Input Schema

model/workflow_test.go

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,11 @@ func TestTransitionUnmarshalJSON(t *testing.T) {
499499

500500
func TestDataInputSchemaUnmarshalJSON(t *testing.T) {
501501

502-
schemaName := FromString("schema name")
502+
var schemaName Object
503+
err := json.Unmarshal([]byte("{\"key\": \"value\"}"), &schemaName)
504+
if !assert.NoError(t, err) {
505+
return
506+
}
503507

504508
type testCase struct {
505509
desp string
@@ -511,53 +515,73 @@ func TestDataInputSchemaUnmarshalJSON(t *testing.T) {
511515
testCases := []testCase{
512516
{
513517
desp: "string success",
514-
data: `"schema name"`,
518+
data: "{\"key\": \"value\"}",
515519
expect: DataInputSchema{
516520
Schema: &schemaName,
517521
FailOnValidationErrors: true,
518522
},
519-
err: `dataInputSchema must be string or object`,
523+
err: ``,
520524
},
521525
{
522-
desp: `object success`,
523-
data: `{"schema": "schema name"}`,
526+
desp: "string fail",
527+
data: "{\"key\": }",
528+
expect: DataInputSchema{
529+
Schema: &schemaName,
530+
FailOnValidationErrors: true,
531+
},
532+
err: `invalid character '}' looking for beginning of value`,
533+
},
534+
{
535+
desp: `object success (without quotes)`,
536+
data: `{"key": "value"}`,
524537
expect: DataInputSchema{
525538
Schema: &schemaName,
526539
FailOnValidationErrors: true,
527540
},
528541
err: ``,
529542
},
530543
{
531-
desp: `object fail`,
532-
data: `{"schema": "schema name}`,
544+
desp: `schema object success`,
545+
data: `{"schema": "{\"key\": \"value\"}"}`,
533546
expect: DataInputSchema{
534547
Schema: &schemaName,
535548
FailOnValidationErrors: true,
536549
},
537-
err: `unexpected end of JSON input`,
550+
err: ``,
538551
},
539552
{
540-
desp: `object key invalid`,
541-
data: `{"schema_invalid": "schema name"}`,
553+
desp: `schema object success (without quotes)`,
554+
data: `{"schema": {"key": "value"}}`,
542555
expect: DataInputSchema{
556+
Schema: &schemaName,
543557
FailOnValidationErrors: true,
544558
},
545559
err: ``,
546560
},
561+
{
562+
desp: `schema object fail`,
563+
data: `{"schema": "schema name}`,
564+
expect: DataInputSchema{
565+
Schema: &schemaName,
566+
FailOnValidationErrors: true,
567+
},
568+
err: `unexpected end of JSON input`,
569+
},
547570
}
548571
for _, tc := range testCases {
549572
t.Run(tc.desp, func(t *testing.T) {
550573
var v DataInputSchema
551574
err := json.Unmarshal([]byte(tc.data), &v)
552575

553576
if tc.err != "" {
554-
assert.Error(t, err)
555-
assert.Regexp(t, tc.err, err)
577+
assert.Error(t, err, tc.desp)
578+
assert.Regexp(t, tc.err, err, tc.desp)
556579
return
557580
}
558581

559-
assert.NoError(t, err)
560-
assert.Equal(t, tc.expect, v)
582+
assert.NoError(t, err, tc.desp)
583+
assert.Equal(t, tc.expect.Schema, v.Schema, tc.desp)
584+
assert.Equal(t, tc.expect.FailOnValidationErrors, v.FailOnValidationErrors, tc.desp)
561585
})
562586
}
563587
}

util/unmarshal.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ func UnmarshalObjectOrFile[U any](parameterName string, data []byte, valObject *
221221
}
222222

223223
data = bytes.TrimSpace(data)
224-
if data[0] == '{' && parameterName != "constants" && parameterName != "timeouts" {
224+
if data[0] == '{' && parameterName != "constants" && parameterName != "timeouts" && parameterName != "schema" {
225225
extractData := map[string]json.RawMessage{}
226226
err = json.Unmarshal(data, &extractData)
227227
if err != nil {

0 commit comments

Comments
 (0)