You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by dg...@apache.org on 2022/08/15 13:43:23 UTC

[openwhisk-runtime-swift] branch master updated: Support array result include sequence action (#150)

This is an automated email from the ASF dual-hosted git repository.

dgrove pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openwhisk-runtime-swift.git


The following commit(s) were added to refs/heads/master by this push:
     new 027bb83  Support array result include sequence action (#150)
027bb83 is described below

commit 027bb83e926d9d7d8780606a2f9bd4723267a6a5
Author: ningyougang <41...@qq.com>
AuthorDate: Mon Aug 15 21:43:18 2022 +0800

    Support array result include sequence action (#150)
---
 README.md                                          | 27 ++++++++++-
 core/swift51Action/Dockerfile                      |  8 ++--
 core/swift51Action/main.swift                      |  5 ++-
 core/swift51Action/swiftbuild.py.launcher.swift    |  4 +-
 core/swift53Action/Dockerfile                      |  8 ++--
 core/swift53Action/main.swift                      |  5 ++-
 core/swift53Action/swiftbuild.py.launcher.swift    |  4 +-
 core/swift54Action/Dockerfile                      |  8 ++--
 core/swift54Action/main.swift                      |  5 ++-
 core/swift54Action/swiftbuild.py.launcher.swift    |  4 +-
 examples/swift-main-single/main.swift              |  7 +--
 .../swift-main-zip/HelloSwift4/Sources/main.swift  |  4 +-
 tests/dat/actions/HelloSwift5/Sources/main.swift   |  5 ++-
 tests/dat/actions/SwiftyRequest/Sources/main.swift |  4 +-
 .../dat/actions/SwiftyRequest5/Sources/main.swift  |  4 +-
 tests/dat/actions/sdk/swift4/createRule.swift      | 11 ++---
 tests/dat/actions/sdk/swift4/createTrigger.swift   |  7 +--
 tests/dat/actions/sdk/swift4/hello.swift           |  5 ++-
 tests/dat/actions/sdk/swift4/invoke.swift          |  5 ++-
 .../dat/actions/sdk/swift4/invokeNonBlocking.swift |  5 ++-
 tests/dat/actions/sdk/swift4/trigger.swift         |  7 +--
 tests/dat/actions/sdk/swift5/createRule.swift      | 11 ++---
 tests/dat/actions/sdk/swift5/createTrigger.swift   |  7 +--
 tests/dat/actions/sdk/swift5/hello.swift           |  5 ++-
 tests/dat/actions/sdk/swift5/invoke.swift          |  5 ++-
 .../dat/actions/sdk/swift5/invokeNonBlocking.swift |  5 ++-
 tests/dat/actions/sdk/swift5/trigger.swift         |  7 +--
 .../Swift51ActionContainerTests.scala              |  5 ++-
 .../Swift53ActionContainerTests.scala              |  5 ++-
 .../Swift54ActionContainerTests.scala              |  5 ++-
 .../SwiftActionContainerTests.scala                | 52 ++++++++++++++++++----
 .../SwiftCodableActionContainerTests.scala         |  2 +-
 32 files changed, 165 insertions(+), 86 deletions(-)

diff --git a/README.md b/README.md
index 1942676..b46e800 100644
--- a/README.md
+++ b/README.md
@@ -33,8 +33,9 @@ The traditional support for the dictionary still works:
 ```swift
 import Foundation
 
-func main(args: [String:Any]) -> [String:Any] {
-    if let name = args["name"] as? String {
+func main(args: Any) -> Any {
+    let dict = args as! [String:Any]
+    if let name = dict["name"] as? String {
         return [ "greeting" : "Hello \(name)!" ]
     } else {
         return [ "greeting" : "Hello stranger!" ]
@@ -42,6 +43,28 @@ func main(args: [String:Any]) -> [String:Any] {
 }
 ```
 
+For the return result, not only support `dictionary`, but also support `array`
+
+So a very simple `hello array` function woule be:
+
+```swift
+func main(args: Any) -> Any {
+    var arr = ["a", "b"]
+    return arr
+}
+```
+
+And support array result for sequence action as well, the first action's array result can be used as next action's input parameter.
+
+So the function can be:
+
+```swift
+ func main(args: Any) -> Any {
+     return args
+ }
+```
+When invokes above action, we can pass an array object as the input parameter.
+
 ## Swift 5.x support
 
 Some examples of using Codable In and Out
diff --git a/core/swift51Action/Dockerfile b/core/swift51Action/Dockerfile
index 99c742c..8175a05 100644
--- a/core/swift51Action/Dockerfile
+++ b/core/swift51Action/Dockerfile
@@ -16,7 +16,7 @@
 #
 
 # build go proxy from source
-FROM golang:1.16 AS builder_source
+FROM golang:1.18 AS builder_source
 ARG GO_PROXY_GITHUB_USER=apache
 ARG GO_PROXY_GITHUB_BRANCH=master
 RUN git clone --branch ${GO_PROXY_GITHUB_BRANCH} \
@@ -25,13 +25,13 @@ RUN git clone --branch ${GO_PROXY_GITHUB_BRANCH} \
    mv proxy /bin/proxy
 
 # or build it from a release
-FROM golang:1.16 AS builder_release
-ARG GO_PROXY_RELEASE_VERSION=1.16@1.19.0
+FROM golang:1.18 AS builder_release
+ARG GO_PROXY_RELEASE_VERSION=1.18@1.20.0
 RUN curl -sL \
   https://github.com/apache/openwhisk-runtime-go/archive/{$GO_PROXY_RELEASE_VERSION}.tar.gz\
   | tar xzf -\
   && cd openwhisk-runtime-go-*/main\
-  && GO111MODULE=on go build -o /bin/proxy
+  && GO111MODULE=on CGO_ENABLED=0 go build -o /bin/proxy
 
 FROM swift:5.1.5
 
diff --git a/core/swift51Action/main.swift b/core/swift51Action/main.swift
index 75071a3..2c6b1de 100644
--- a/core/swift51Action/main.swift
+++ b/core/swift51Action/main.swift
@@ -15,8 +15,9 @@
  * limitations under the License.
  */
 
-func main(args: [String:Any]) -> [String:Any] {
-    if let name = args["name"] as? String {
+func main(args: Any) -> Any {
+    let newArgs = args as! [String:Any]
+    if let name = newArgs["name"] as? String {
         return [ "greeting" : "Hello \(name)!" ]
     } else {
         return [ "greeting" : "Hello stranger!" ]
diff --git a/core/swift51Action/swiftbuild.py.launcher.swift b/core/swift51Action/swiftbuild.py.launcher.swift
index 3405777..5260280 100644
--- a/core/swift51Action/swiftbuild.py.launcher.swift
+++ b/core/swift51Action/swiftbuild.py.launcher.swift
@@ -43,9 +43,9 @@ func _whisk_print_buffer(jsonString: String){
 }
 
 // snippet of code "injected" (wrapper code for invoking traditional main)
-func _run_main(mainFunction: ([String: Any]) -> [String: Any], json: Data) -> Void {
+func _run_main(mainFunction: (Any) -> Any, json: Data) -> Void {
     do {
-        let parsed = try JSONSerialization.jsonObject(with: json, options: []) as! [String: Any]
+        let parsed = try JSONSerialization.jsonObject(with: json, options: [])
         let result = mainFunction(parsed)
         if JSONSerialization.isValidJSONObject(result) {
             do {
diff --git a/core/swift53Action/Dockerfile b/core/swift53Action/Dockerfile
index 9807280..cc91019 100644
--- a/core/swift53Action/Dockerfile
+++ b/core/swift53Action/Dockerfile
@@ -16,7 +16,7 @@
 #
 
 # build go proxy from source
-FROM golang:1.16 AS builder_source
+FROM golang:1.18 AS builder_source
 ARG GO_PROXY_GITHUB_USER=apache
 ARG GO_PROXY_GITHUB_BRANCH=master
 RUN git clone --branch ${GO_PROXY_GITHUB_BRANCH} \
@@ -25,13 +25,13 @@ RUN git clone --branch ${GO_PROXY_GITHUB_BRANCH} \
    mv proxy /bin/proxy
 
 # or build it from a release
-FROM golang:1.16 AS builder_release
-ARG GO_PROXY_RELEASE_VERSION=1.16@1.19.0
+FROM golang:1.18 AS builder_release
+ARG GO_PROXY_RELEASE_VERSION=1.18@1.20.0
 RUN curl -sL \
   https://github.com/apache/openwhisk-runtime-go/archive/{$GO_PROXY_RELEASE_VERSION}.tar.gz\
   | tar xzf -\
   && cd openwhisk-runtime-go-*/main\
-  && GO111MODULE=on go build -o /bin/proxy
+  && GO111MODULE=on CGO_ENABLED=0 go build -o /bin/proxy
 
 FROM swift:5.3
 
diff --git a/core/swift53Action/main.swift b/core/swift53Action/main.swift
index 75071a3..2c6b1de 100644
--- a/core/swift53Action/main.swift
+++ b/core/swift53Action/main.swift
@@ -15,8 +15,9 @@
  * limitations under the License.
  */
 
-func main(args: [String:Any]) -> [String:Any] {
-    if let name = args["name"] as? String {
+func main(args: Any) -> Any {
+    let newArgs = args as! [String:Any]
+    if let name = newArgs["name"] as? String {
         return [ "greeting" : "Hello \(name)!" ]
     } else {
         return [ "greeting" : "Hello stranger!" ]
diff --git a/core/swift53Action/swiftbuild.py.launcher.swift b/core/swift53Action/swiftbuild.py.launcher.swift
index 3405777..5260280 100644
--- a/core/swift53Action/swiftbuild.py.launcher.swift
+++ b/core/swift53Action/swiftbuild.py.launcher.swift
@@ -43,9 +43,9 @@ func _whisk_print_buffer(jsonString: String){
 }
 
 // snippet of code "injected" (wrapper code for invoking traditional main)
-func _run_main(mainFunction: ([String: Any]) -> [String: Any], json: Data) -> Void {
+func _run_main(mainFunction: (Any) -> Any, json: Data) -> Void {
     do {
-        let parsed = try JSONSerialization.jsonObject(with: json, options: []) as! [String: Any]
+        let parsed = try JSONSerialization.jsonObject(with: json, options: [])
         let result = mainFunction(parsed)
         if JSONSerialization.isValidJSONObject(result) {
             do {
diff --git a/core/swift54Action/Dockerfile b/core/swift54Action/Dockerfile
index d330660..f1f4a7f 100644
--- a/core/swift54Action/Dockerfile
+++ b/core/swift54Action/Dockerfile
@@ -16,7 +16,7 @@
 #
 
 # build go proxy from source
-FROM golang:1.16 AS builder_source
+FROM golang:1.18 AS builder_source
 ARG GO_PROXY_GITHUB_USER=apache
 ARG GO_PROXY_GITHUB_BRANCH=master
 RUN git clone --branch ${GO_PROXY_GITHUB_BRANCH} \
@@ -25,13 +25,13 @@ RUN git clone --branch ${GO_PROXY_GITHUB_BRANCH} \
    mv proxy /bin/proxy
 
 # or build it from a release
-FROM golang:1.16 AS builder_release
-ARG GO_PROXY_RELEASE_VERSION=1.16@1.19.0
+FROM golang:1.18 AS builder_release
+ARG GO_PROXY_RELEASE_VERSION=1.18@1.20.0
 RUN curl -sL \
   https://github.com/apache/openwhisk-runtime-go/archive/{$GO_PROXY_RELEASE_VERSION}.tar.gz\
   | tar xzf -\
   && cd openwhisk-runtime-go-*/main\
-  && GO111MODULE=on go build -o /bin/proxy
+  && GO111MODULE=on CGO_ENABLED=0 go build -o /bin/proxy
 
 FROM swift:5.4
 
diff --git a/core/swift54Action/main.swift b/core/swift54Action/main.swift
index 75071a3..2c6b1de 100644
--- a/core/swift54Action/main.swift
+++ b/core/swift54Action/main.swift
@@ -15,8 +15,9 @@
  * limitations under the License.
  */
 
-func main(args: [String:Any]) -> [String:Any] {
-    if let name = args["name"] as? String {
+func main(args: Any) -> Any {
+    let newArgs = args as! [String:Any]
+    if let name = newArgs["name"] as? String {
         return [ "greeting" : "Hello \(name)!" ]
     } else {
         return [ "greeting" : "Hello stranger!" ]
diff --git a/core/swift54Action/swiftbuild.py.launcher.swift b/core/swift54Action/swiftbuild.py.launcher.swift
index 3405777..5260280 100644
--- a/core/swift54Action/swiftbuild.py.launcher.swift
+++ b/core/swift54Action/swiftbuild.py.launcher.swift
@@ -43,9 +43,9 @@ func _whisk_print_buffer(jsonString: String){
 }
 
 // snippet of code "injected" (wrapper code for invoking traditional main)
-func _run_main(mainFunction: ([String: Any]) -> [String: Any], json: Data) -> Void {
+func _run_main(mainFunction: (Any) -> Any, json: Data) -> Void {
     do {
-        let parsed = try JSONSerialization.jsonObject(with: json, options: []) as! [String: Any]
+        let parsed = try JSONSerialization.jsonObject(with: json, options: [])
         let result = mainFunction(parsed)
         if JSONSerialization.isValidJSONObject(result) {
             do {
diff --git a/examples/swift-main-single/main.swift b/examples/swift-main-single/main.swift
index 9a7aaf8..2de8dcb 100644
--- a/examples/swift-main-single/main.swift
+++ b/examples/swift-main-single/main.swift
@@ -15,15 +15,16 @@
  * limitations under the License.
  */
 
-func main(args: [String:Any]) -> [String:Any] {
-    if let name = args["name"] as? String {
+func main(args: Any) -> Any {
+    let newArgs = args as! [String:Any]
+    if let name = newArgs["name"] as? String {
         return [ "greeting" : "Hello \(name)!" ]
     } else {
         return [ "greeting" : "Hello swif4.2!" ]
     }
 }
 
-func mainenv(args: [String: Any]) -> [String: Any] {
+func mainenv(args: Any) -> Any {
      let env = ProcessInfo.processInfo.environment
      var a = "???"
      var b = "???"
diff --git a/examples/swift-main-zip/HelloSwift4/Sources/main.swift b/examples/swift-main-zip/HelloSwift4/Sources/main.swift
index 6237c80..7ba5e13 100644
--- a/examples/swift-main-zip/HelloSwift4/Sources/main.swift
+++ b/examples/swift-main-zip/HelloSwift4/Sources/main.swift
@@ -15,8 +15,8 @@
 # limitations under the License.
 #
 
-func main(args: [String:Any]) -> [String:Any] {
-    if let name = args["name"] as? String {
+func main(args: Any) -> Any {
+    if let name = newArgs["name"] as? String {
         return [ "greeting" : "Hello \(name)!" ]
     } else {
         return [ "greeting" : "Hello stranger!" ]
diff --git a/tests/dat/actions/HelloSwift5/Sources/main.swift b/tests/dat/actions/HelloSwift5/Sources/main.swift
index a8bfed4..4d927ec 100644
--- a/tests/dat/actions/HelloSwift5/Sources/main.swift
+++ b/tests/dat/actions/HelloSwift5/Sources/main.swift
@@ -17,8 +17,9 @@
 
 import Foundation
 
-func main(args: [String:Any]) -> [String:Any] {
-    if let name = args["name"] as? String {
+func main(args: Any) -> Any {
+    let newArgs = args as! [String:Any]
+    if let name = newArgs["name"] as? String {
         return [ "greeting" : "Hello \(name)!" ]
     } else {
         return [ "greeting" : "Hello stranger!" ]
diff --git a/tests/dat/actions/SwiftyRequest/Sources/main.swift b/tests/dat/actions/SwiftyRequest/Sources/main.swift
index 35de61e..e145587 100644
--- a/tests/dat/actions/SwiftyRequest/Sources/main.swift
+++ b/tests/dat/actions/SwiftyRequest/Sources/main.swift
@@ -19,12 +19,12 @@ import SwiftyRequest
 import Dispatch
 import Foundation
 
-func main(args: [String:Any]) -> [String:Any] {
+func main(args: Any) -> Any {
     var resp :[String:Any] = ["error":"Action failed"]
     let echoURL = "http://httpbin.org/post"
 
     // setting body data to {"Data":"string"}
-    let origJson: [String: Any] = args
+    let origJson = args as! [String:Any]
     guard let data = try? JSONSerialization.data(withJSONObject: origJson, options: []) else {
         return ["error": "Could not encode json"]
     }
diff --git a/tests/dat/actions/SwiftyRequest5/Sources/main.swift b/tests/dat/actions/SwiftyRequest5/Sources/main.swift
index 8aac40a..7afe444 100644
--- a/tests/dat/actions/SwiftyRequest5/Sources/main.swift
+++ b/tests/dat/actions/SwiftyRequest5/Sources/main.swift
@@ -19,12 +19,12 @@ import SwiftyRequest
 import Dispatch
 import Foundation
 
-func main(args: [String:Any]) -> [String:Any] {
+func main(args: Any) -> Any {
     var resp :[String:Any] = ["error":"Action failed"]
     let echoURL = "http://httpbin.org/post"
 
     // setting body data to {"Data":"string"}
-    let origJson: [String: Any] = args
+    let origJson = args as! [String:Any]
     guard let data = try? JSONSerialization.data(withJSONObject: origJson, options: []) else {
         return ["error": "Could not encode json"]
     }
diff --git a/tests/dat/actions/sdk/swift4/createRule.swift b/tests/dat/actions/sdk/swift4/createRule.swift
index 6c8895f..f02c31e 100644
--- a/tests/dat/actions/sdk/swift4/createRule.swift
+++ b/tests/dat/actions/sdk/swift4/createRule.swift
@@ -15,18 +15,19 @@
  * limitations under the License.
  */
 
-func main(args: [String:Any]) -> [String:Any] {
-  if let baseUrl = args["baseUrl"] as? String {
+func main(args: Any) -> Any {
+  let newArgs = args as! [String:Any]
+  if let baseUrl = newArgs["baseUrl"] as? String {
     //Overriding WHISK API HOST using baseUrl, only applicable in testing with self sign ssl certs"
     Whisk.baseUrl = baseUrl
   }
-  guard let triggerName = args["triggerName"] as? String else {
+  guard let triggerName = newArgs["triggerName"] as? String else {
       return ["error": "You must specify a triggerName parameter!"]
   }
-  guard let actionName = args["actionName"] as? String else {
+  guard let actionName = newArgs["actionName"] as? String else {
       return ["error": "You must specify a actionName parameter!"]
   }
-  guard let ruleName = args["ruleName"] as? String else {
+  guard let ruleName = newArgs["ruleName"] as? String else {
       return ["error": "You must specify a ruleName parameter!"]
   }
   print("Rule Name: \(ruleName), Trigger Name: \(triggerName), actionName: \(actionName)")
diff --git a/tests/dat/actions/sdk/swift4/createTrigger.swift b/tests/dat/actions/sdk/swift4/createTrigger.swift
index 097497e..93075ba 100644
--- a/tests/dat/actions/sdk/swift4/createTrigger.swift
+++ b/tests/dat/actions/sdk/swift4/createTrigger.swift
@@ -15,12 +15,13 @@
  * limitations under the License.
  */
 
-func main(args: [String:Any]) -> [String:Any] {
-  if let baseUrl = args["baseUrl"] as? String {
+func main(args: Any) -> Any {
+  let newArgs = args as! [String:Any]
+  if let baseUrl = newArgs["baseUrl"] as? String {
     //Overriding WHISK API HOST using baseUrl, only applicable in testing with self sign ssl certs"
     Whisk.baseUrl = baseUrl
   }
-  guard let triggerName = args["triggerName"] as? String else {
+  guard let triggerName = newArgs["triggerName"] as? String else {
     return ["error": "You must specify a triggerName parameter!"]
   }
   print("Trigger Name: \(triggerName)")
diff --git a/tests/dat/actions/sdk/swift4/hello.swift b/tests/dat/actions/sdk/swift4/hello.swift
index 75071a3..2c6b1de 100644
--- a/tests/dat/actions/sdk/swift4/hello.swift
+++ b/tests/dat/actions/sdk/swift4/hello.swift
@@ -15,8 +15,9 @@
  * limitations under the License.
  */
 
-func main(args: [String:Any]) -> [String:Any] {
-    if let name = args["name"] as? String {
+func main(args: Any) -> Any {
+    let newArgs = args as! [String:Any]
+    if let name = newArgs["name"] as? String {
         return [ "greeting" : "Hello \(name)!" ]
     } else {
         return [ "greeting" : "Hello stranger!" ]
diff --git a/tests/dat/actions/sdk/swift4/invoke.swift b/tests/dat/actions/sdk/swift4/invoke.swift
index 5afca75..222f1ab 100644
--- a/tests/dat/actions/sdk/swift4/invoke.swift
+++ b/tests/dat/actions/sdk/swift4/invoke.swift
@@ -26,8 +26,9 @@ struct Activation: Decodable {
   let activationId: String
 }
 
-func main(args: [String:Any]) -> [String:Any] {
-  if let baseUrl = args["baseUrl"] as? String {
+func main(args: Any) -> Any {
+  let newArgs = args as! [String:Any]
+  if let baseUrl = newArgs["baseUrl"] as? String {
     //Overriding WHISK API HOST using baseUrl, only applicable in testing with self sign ssl certs"
     Whisk.baseUrl = baseUrl
   }
diff --git a/tests/dat/actions/sdk/swift4/invokeNonBlocking.swift b/tests/dat/actions/sdk/swift4/invokeNonBlocking.swift
index b81c308..68f3b39 100644
--- a/tests/dat/actions/sdk/swift4/invokeNonBlocking.swift
+++ b/tests/dat/actions/sdk/swift4/invokeNonBlocking.swift
@@ -19,8 +19,9 @@ struct Activation: Decodable {
   let activationId: String
 }
 
-func main(args: [String:Any]) -> [String:Any] {
-  if let baseUrl = args["baseUrl"] as? String {
+func main(args: Any) -> Any {
+  let newArgs = args as! [String:Any]
+  if let baseUrl = newArgs["baseUrl"] as? String {
     //Overriding WHISK API HOST using baseUrl, only applicable in testing with self sign ssl certs"
     Whisk.baseUrl = baseUrl
   }
diff --git a/tests/dat/actions/sdk/swift4/trigger.swift b/tests/dat/actions/sdk/swift4/trigger.swift
index a7307f3..4d9649a 100644
--- a/tests/dat/actions/sdk/swift4/trigger.swift
+++ b/tests/dat/actions/sdk/swift4/trigger.swift
@@ -15,12 +15,13 @@
  * limitations under the License.
  */
 
-func main(args: [String:Any]) -> [String:Any] {
-  if let baseUrl = args["baseUrl"] as? String {
+func main(args: Any) -> Any {
+  let newArgs = args as! [String:Any]
+  if let baseUrl = newArgs["baseUrl"] as? String {
     //Overriding WHISK API HOST using baseUrl, only applicable in testing with self sign ssl certs"
     Whisk.baseUrl = baseUrl
   }
-  if let triggerName = args["triggerName"] as? String {
+  if let triggerName = newArgs ["triggerName"] as? String {
     print("Trigger Name: \(triggerName)")
     return Whisk.trigger(eventNamed: triggerName, withParameters: [:])
   } else {
diff --git a/tests/dat/actions/sdk/swift5/createRule.swift b/tests/dat/actions/sdk/swift5/createRule.swift
index 7f7a88b..b2751e0 100644
--- a/tests/dat/actions/sdk/swift5/createRule.swift
+++ b/tests/dat/actions/sdk/swift5/createRule.swift
@@ -17,18 +17,19 @@
 
 import Foundation
 
-func main(args: [String:Any]) -> [String:Any] {
-  if let baseUrl = args["baseUrl"] as? String {
+func main(args: Any) -> Any {
+  let newArgs = args as! [String:Any]
+  if let baseUrl = newArgs["baseUrl"] as? String {
     //Overriding WHISK API HOST using baseUrl, only applicable in testing with self sign ssl certs"
     Whisk.baseUrl = baseUrl
   }
-  guard let triggerName = args["triggerName"] as? String else {
+  guard let triggerName = newArgs["triggerName"] as? String else {
       return ["error": "You must specify a triggerName parameter!"]
   }
-  guard let actionName = args["actionName"] as? String else {
+  guard let actionName = newArgs["actionName"] as? String else {
       return ["error": "You must specify a actionName parameter!"]
   }
-  guard let ruleName = args["ruleName"] as? String else {
+  guard let ruleName = newArgs["ruleName"] as? String else {
       return ["error": "You must specify a ruleName parameter!"]
   }
   print("Rule Name: \(ruleName), Trigger Name: \(triggerName), actionName: \(actionName)")
diff --git a/tests/dat/actions/sdk/swift5/createTrigger.swift b/tests/dat/actions/sdk/swift5/createTrigger.swift
index bd3e497..fc24508 100644
--- a/tests/dat/actions/sdk/swift5/createTrigger.swift
+++ b/tests/dat/actions/sdk/swift5/createTrigger.swift
@@ -17,12 +17,13 @@
 
 import Foundation
 
-func main(args: [String:Any]) -> [String:Any] {
-  if let baseUrl = args["baseUrl"] as? String {
+func main(args: Any) -> Any {
+  let newArgs = args as! [String:Any]
+  if let baseUrl = newArgs["baseUrl"] as? String {
     //Overriding WHISK API HOST using baseUrl, only applicable in testing with self sign ssl certs"
     Whisk.baseUrl = baseUrl
   }
-  guard let triggerName = args["triggerName"] as? String else {
+  guard let triggerName = newArgs["triggerName"] as? String else {
     return ["error": "You must specify a triggerName parameter!"]
   }
   print("Trigger Name: \(triggerName)")
diff --git a/tests/dat/actions/sdk/swift5/hello.swift b/tests/dat/actions/sdk/swift5/hello.swift
index a8bfed4..4d927ec 100644
--- a/tests/dat/actions/sdk/swift5/hello.swift
+++ b/tests/dat/actions/sdk/swift5/hello.swift
@@ -17,8 +17,9 @@
 
 import Foundation
 
-func main(args: [String:Any]) -> [String:Any] {
-    if let name = args["name"] as? String {
+func main(args: Any) -> Any {
+    let newArgs = args as! [String:Any]
+    if let name = newArgs["name"] as? String {
         return [ "greeting" : "Hello \(name)!" ]
     } else {
         return [ "greeting" : "Hello stranger!" ]
diff --git a/tests/dat/actions/sdk/swift5/invoke.swift b/tests/dat/actions/sdk/swift5/invoke.swift
index ba03066..3992a00 100644
--- a/tests/dat/actions/sdk/swift5/invoke.swift
+++ b/tests/dat/actions/sdk/swift5/invoke.swift
@@ -28,8 +28,9 @@ struct Activation: Decodable {
   let activationId: String
 }
 
-func main(args: [String:Any]) -> [String:Any] {
-  if let baseUrl = args["baseUrl"] as? String {
+func main(args: Any) -> Any {
+  let newArgs = args as! [String:Any]
+  if let baseUrl = newArgs["baseUrl"] as? String {
     //Overriding WHISK API HOST using baseUrl, only applicable in testing with self sign ssl certs"
     Whisk.baseUrl = baseUrl
   }
diff --git a/tests/dat/actions/sdk/swift5/invokeNonBlocking.swift b/tests/dat/actions/sdk/swift5/invokeNonBlocking.swift
index 043e0b4..cb3507e 100644
--- a/tests/dat/actions/sdk/swift5/invokeNonBlocking.swift
+++ b/tests/dat/actions/sdk/swift5/invokeNonBlocking.swift
@@ -21,8 +21,9 @@ struct Activation: Decodable {
   let activationId: String
 }
 
-func main(args: [String:Any]) -> [String:Any] {
-  if let baseUrl = args["baseUrl"] as? String {
+func main(args: Any) -> Any {
+  let newArgs = args as! [String:Any]
+  if let baseUrl = newArgs["baseUrl"] as? String {
     //Overriding WHISK API HOST using baseUrl, only applicable in testing with self sign ssl certs"
     Whisk.baseUrl = baseUrl
   }
diff --git a/tests/dat/actions/sdk/swift5/trigger.swift b/tests/dat/actions/sdk/swift5/trigger.swift
index 0481e23..2459247 100644
--- a/tests/dat/actions/sdk/swift5/trigger.swift
+++ b/tests/dat/actions/sdk/swift5/trigger.swift
@@ -17,12 +17,13 @@
 
 import Foundation
 
-func main(args: [String:Any]) -> [String:Any] {
-  if let baseUrl = args["baseUrl"] as? String {
+func main(args: Any) -> Any {
+  let newArgs = args as! [String:Any]
+  if let baseUrl = newArgs["baseUrl"] as? String {
     //Overriding WHISK API HOST using baseUrl, only applicable in testing with self sign ssl certs"
     Whisk.baseUrl = baseUrl
   }
-  if let triggerName = args["triggerName"] as? String {
+  if let triggerName = newArgs["triggerName"] as? String {
     print("Trigger Name: \(triggerName)")
     return Whisk.trigger(eventNamed: triggerName, withParameters: [:])
   } else {
diff --git a/tests/src/test/scala/runtime/actionContainers/Swift51ActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/Swift51ActionContainerTests.scala
index 183f867..af58421 100644
--- a/tests/src/test/scala/runtime/actionContainers/Swift51ActionContainerTests.scala
+++ b/tests/src/test/scala/runtime/actionContainers/Swift51ActionContainerTests.scala
@@ -37,9 +37,10 @@ class Swift51ActionContainerTests extends SwiftActionContainerTests {
                    | #if canImport(FoundationNetworking)
                    |  import FoundationNetworking
                    | #endif
-                   | func main(args:[String: Any]) -> [String:Any] {
+                   | func main(args: Any) -> Any {
                    |     var resp :[String:Any] = ["error":"getUrl failed"]
-                   |     guard let urlStr = args["getUrl"] as? String else {
+                   |     let newArgs = args as! [String:Any]
+                   |     guard let urlStr = newArgs["getUrl"] as? String else {
                    |         return ["error":"getUrl not found in action input"]
                    |     }
                    |     guard let url = URL(string: urlStr) else {
diff --git a/tests/src/test/scala/runtime/actionContainers/Swift53ActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/Swift53ActionContainerTests.scala
index 0814f9a..3acf7ac 100644
--- a/tests/src/test/scala/runtime/actionContainers/Swift53ActionContainerTests.scala
+++ b/tests/src/test/scala/runtime/actionContainers/Swift53ActionContainerTests.scala
@@ -37,9 +37,10 @@ class Swift53ActionContainerTests extends SwiftActionContainerTests {
                    | #if canImport(FoundationNetworking)
                    |  import FoundationNetworking
                    | #endif
-                   | func main(args:[String: Any]) -> [String:Any] {
+                   | func main(args: Any) -> Any {
                    |     var resp :[String:Any] = ["error":"getUrl failed"]
-                   |     guard let urlStr = args["getUrl"] as? String else {
+                   |     let newArgs = args as! [String:Any]
+                   |     guard let urlStr = newArgs["getUrl"] as? String else {
                    |         return ["error":"getUrl not found in action input"]
                    |     }
                    |     guard let url = URL(string: urlStr) else {
diff --git a/tests/src/test/scala/runtime/actionContainers/Swift54ActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/Swift54ActionContainerTests.scala
index 4ae7358..e4487e1 100644
--- a/tests/src/test/scala/runtime/actionContainers/Swift54ActionContainerTests.scala
+++ b/tests/src/test/scala/runtime/actionContainers/Swift54ActionContainerTests.scala
@@ -37,9 +37,10 @@ class Swift54ActionContainerTests extends SwiftActionContainerTests {
                    | #if canImport(FoundationNetworking)
                    |  import FoundationNetworking
                    | #endif
-                   | func main(args:[String: Any]) -> [String:Any] {
+                   | func main(args: Any) -> Any {
                    |     var resp :[String:Any] = ["error":"getUrl failed"]
-                   |     guard let urlStr = args["getUrl"] as? String else {
+                   |     let newArgs = args as! [String:Any]
+                   |     guard let urlStr = newArgs["getUrl"] as? String else {
                    |         return ["error":"getUrl not found in action input"]
                    |     }
                    |     guard let url = URL(string: urlStr) else {
diff --git a/tests/src/test/scala/runtime/actionContainers/SwiftActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/SwiftActionContainerTests.scala
index 147baa7..421be38 100644
--- a/tests/src/test/scala/runtime/actionContainers/SwiftActionContainerTests.scala
+++ b/tests/src/test/scala/runtime/actionContainers/SwiftActionContainerTests.scala
@@ -50,7 +50,7 @@ abstract class SwiftActionContainerTests extends BasicActionRunnerTests with Wsk
 
   override val testInitCannotBeCalledMoreThanOnce = {
     TestConfig("""
-        | func main(args: [String: Any]) -> [String: Any] {
+        | func main(args: Any) -> Any {
         |     return args
         | }
       """.stripMargin)
@@ -59,7 +59,7 @@ abstract class SwiftActionContainerTests extends BasicActionRunnerTests with Wsk
   override val testEntryPointOtherThanMain = {
     TestConfig(
       """
-        | func niam(args: [String: Any]) -> [String: Any] {
+        | func niam(args: Any) -> Any {
         |     return args
         | }
       """.stripMargin,
@@ -78,7 +78,7 @@ abstract class SwiftActionContainerTests extends BasicActionRunnerTests with Wsk
         |     }
         | }
         |
-        | func main(args: [String: Any]) -> [String: Any] {
+        | func main(args: Any) -> Any {
         |     print("hello stdout")
         |     var standardError = FileHandle.standardError
         |     print("hello stderr", to: &standardError)
@@ -89,8 +89,9 @@ abstract class SwiftActionContainerTests extends BasicActionRunnerTests with Wsk
 
   override val testUnicode = {
     TestConfig("""
-        | func main(args: [String: Any]) -> [String: Any] {
-        |     if let str = args["delimiter"] as? String {
+        | func main(args: Any) -> Any {
+        |     let newArgs = args as! [String:Any]
+        |     if let str = newArgs["delimiter"] as? String {
         |         let msg = "\(str) ☃ \(str)"
         |         print(msg)
         |         return [ "winter" : msg ]
@@ -104,7 +105,7 @@ abstract class SwiftActionContainerTests extends BasicActionRunnerTests with Wsk
   override val testEnv = {
     TestConfig(
       """
-        | func main(args: [String: Any]) -> [String: Any] {
+        | func main(args: Any) -> Any {
         |     let env = ProcessInfo.processInfo.environment
         |     var a = "???"
         |     var b = "???"
@@ -142,7 +143,7 @@ abstract class SwiftActionContainerTests extends BasicActionRunnerTests with Wsk
 
   override val testLargeInput = {
     TestConfig("""
-        | func main(args: [String: Any]) -> [String: Any] {
+        | func main(args: Any) -> Any {
         |     return args
         | }
       """.stripMargin)
@@ -151,7 +152,7 @@ abstract class SwiftActionContainerTests extends BasicActionRunnerTests with Wsk
   it should "support application errors" in {
     val (out, err) = withActionContainer() { c =>
       val code = """
-                   | func main(args: [String: Any]) -> [String: Any] {
+                   | func main(args: Any) -> Any {
                    |     return [ "error": "sorry" ]
                    | }
                  """.stripMargin
@@ -220,6 +221,41 @@ abstract class SwiftActionContainerTests extends BasicActionRunnerTests with Wsk
     })
   }
 
+  it should "support return array result" in {
+    val (out, err) = withActionContainer() { c =>
+      val code = """
+                   | func main(args: Any) -> Any {
+                   |     var arr = ["a", "b"]
+                   |     return arr
+                   | }
+                 """.stripMargin
+
+      val (initCode, _) = c.init(initPayload(code))
+      initCode should be(200)
+
+      val (runCode, runRes) = c.runForJsArray(runPayload(JsObject()))
+      runCode should be(200)
+      runRes shouldBe Some(JsArray(JsString("a"), JsString("b")))
+    }
+  }
+
+  it should "support array as input param" in {
+    val (out, err) = withActionContainer() { c =>
+      val code = """
+                   | func main(args: Any) -> Any {
+                   |     return args
+                   | }
+                 """.stripMargin
+
+      val (initCode, _) = c.init(initPayload(code))
+      initCode should be(200)
+
+      val (runCode, runRes) = c.runForJsArray(runPayload(JsArray(JsString("a"), JsString("b"))))
+      runCode should be(200)
+      runRes shouldBe Some(JsArray(JsString("a"), JsString("b")))
+    }
+  }
+
   // Helpers specific to swift actions
   override def withActionContainer(env: Map[String, String] = Map.empty)(code: ActionContainer => Unit) = {
     withContainer(swiftContainerImageName, env)(code)
diff --git a/tests/src/test/scala/runtime/actionContainers/SwiftCodableActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/SwiftCodableActionContainerTests.scala
index e455d99..0b3a55c 100644
--- a/tests/src/test/scala/runtime/actionContainers/SwiftCodableActionContainerTests.scala
+++ b/tests/src/test/scala/runtime/actionContainers/SwiftCodableActionContainerTests.scala
@@ -198,7 +198,7 @@ abstract class SwiftCodableActionContainerTests extends BasicActionRunnerTests w
       """.stripMargin
     } else {
       """
-        | func main(args: [String: Any]) -> [String: Any] {
+        | func main(args: Any) -> Any {
         |     return args
         | }
       """.stripMargin