Issue #3 update with rule and sequence support, also scope to specific target
diff --git a/WhiskSwiftTools/PBXProject.swift b/WhiskSwiftTools/PBXProject.swift
index 94e8e77..016509f 100644
--- a/WhiskSwiftTools/PBXProject.swift
+++ b/WhiskSwiftTools/PBXProject.swift
@@ -13,6 +13,7 @@
     case inTarget
     case inNamedTarget
     case inSources
+    case inResources
     case inFiles
     case parseFileNames
     case done
@@ -63,6 +64,10 @@
                         parseState = .inSources
                         let components = trimmedLine.components(separatedBy: CharacterSet.whitespaces)
                         targetKey = components[0]
+                    } else if trimmedLine.range(of: "/* Resources */") != nil {
+                        parseState = .inResources
+                        let components = trimmedLine.components(separatedBy: CharacterSet.whitespaces)
+                        targetKey = components[0]
                     }
 
                 case .inSources:
@@ -70,12 +75,17 @@
                     if trimmedLine.range(of: token ) != nil {
                         parseState = .inFiles
                     }
+                case .inResources:
+                    let token = "\(targetKey!) /* Resources */"
+                    if trimmedLine.range(of: token ) != nil {
+                        parseState = .inFiles
+                    }
                 case .inFiles:
                     if trimmedLine.range(of: "files = (") != nil {
                         parseState = .parseFileNames
                     }
                 case .parseFileNames:
-                    if (trimmedLine.range(of: "in Sources */") != nil) {
+                    if (trimmedLine.range(of: "in Sources */") != nil) || (trimmedLine.range(of: "in Resources */") != nil) {
                         let components = trimmedLine.components(separatedBy: CharacterSet.whitespaces)
                         let fileName = components[2]                        
                         if var files = filesForTarget[targetName] {
diff --git a/WhiskSwiftTools/ProjectManager.swift b/WhiskSwiftTools/ProjectManager.swift
index 7752387..424d176 100644
--- a/WhiskSwiftTools/ProjectManager.swift
+++ b/WhiskSwiftTools/ProjectManager.swift
@@ -62,7 +62,7 @@
                     try self.installActions()
                     try self.installSequences()
                     try self.installRules()
-                    try self.enableRules()
+                    //try self.enableRules()
                     
                     group.leave()
                 } catch {
@@ -197,6 +197,7 @@
         let group = DispatchGroup()
         
         for (name, rule) in rules {
+            print("Creating rule \(name)")
             try whisk.createRule(name: name as String, namespace: namespace, triggerName: rule.trigger as String, actionName: rule.action as String, group: group)
         }
         
diff --git a/WhiskSwiftTools/ProjectReader.swift b/WhiskSwiftTools/ProjectReader.swift
index f5c2965..1573bdd 100644
--- a/WhiskSwiftTools/ProjectReader.swift
+++ b/WhiskSwiftTools/ProjectReader.swift
@@ -345,6 +345,7 @@
                 }
                 
                 for entity in xcodeTuple.rules {
+                    print("Processing rule \(entity.name)")
                     ruleDict[entity.name] = entity
                 }
                 
@@ -352,6 +353,7 @@
                     sequenceDict[entity.name] = entity
                 }
                 
+                
             } catch {
                 print("Error reading xcode project \(error)")
             }
diff --git a/WhiskSwiftTools/WhiskAPI.swift b/WhiskSwiftTools/WhiskAPI.swift
index 37c7585..acbb944 100644
--- a/WhiskSwiftTools/WhiskAPI.swift
+++ b/WhiskSwiftTools/WhiskAPI.swift
@@ -314,10 +314,17 @@
         
         
         let path = "namespaces/\(namespace)/rules/\(name)"
-        let whiskParameters = ["trigger": triggerName, "action": actionName]
+        let whiskParameters = ["action": actionName,"trigger":triggerName]
         
         group.enter()
-        try networkManager.putCall(url: urlStr, path: path, parameters: whiskParameters as [String : AnyObject]?, group: group)
+        try networkManager.putCall(url: urlStr, path: path, parameters: whiskParameters as [String : AnyObject], group: group) {
+            response, error in
+            if let error = error {
+                print("Error creating rule \(name), error \(error)")
+            } else {
+                print("Created rule response \(response)")
+            }
+        }
         
     }
     
@@ -325,7 +332,6 @@
         
         let urlStr: String = whiskBaseURL != nil ? whiskBaseURL! : DefaultBaseURL
         
-        
         let path = "namespaces/\(namespace)/rules/\(name)"
         
         group.enter()
@@ -528,9 +534,9 @@
         request.addValue("Basic \(whiskCredentials.getBase64AuthString())", forHTTPHeaderField: "Authorization")
         request.httpMethod = "PUT"
         
+        
         if let parameters = parameters {
             request.httpBody = try JSONSerialization.data(withJSONObject: parameters as AnyObject, options: JSONSerialization.WritingOptions())
-            
         }
         
         let task = urlSession.dataTask(with: request) {
@@ -552,7 +558,12 @@
                 
             } else {
                 if let callback = callback {
-                    callback(["status":statusCode, "msg":"PUT call success"], nil)
+                    do {
+                    let respMsg = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions())
+                    callback(["status":statusCode, "msg":respMsg], nil)
+                    } catch {
+                        print("Error serialzing server response \(error)")
+                    }
                 }
             }
             
diff --git a/WhiskSwiftTools/WhiskTokenizer.swift b/WhiskSwiftTools/WhiskTokenizer.swift
index a799b51..6cb23ad 100644
--- a/WhiskSwiftTools/WhiskTokenizer.swift
+++ b/WhiskSwiftTools/WhiskTokenizer.swift
@@ -89,18 +89,19 @@
                 var isDir = ObjCBool(false)
                 let fullPath = atPath+"/\(item)"
                 
-                //print("===== inspecting \(fullPath)")
+                print("===== inspecting \(item.lastPathComponent)")
                 if dir.fileExists(atPath: fullPath, isDirectory: &isDir) == true {
                     if isDir.boolValue == true {
                         
                     }  else if item.hasSuffix(".swift") {
                         
                         if fileList.contains(item.lastPathComponent as String) {
+                            print("****Processing \(item.lastPathComponent)")
                             do {
                                 let fileStr = try String(contentsOfFile: fullPath)
                                 if let entityTuple = getWhiskEntities(str: fileStr) {
                                     
-                                    for action in entityTuple.0 {
+                                    for action in entityTuple.actions {
                                         do {
                                             
                                             let actionDirPath = toPath+"/\(OpenWhiskActionTarget)"
@@ -121,11 +122,21 @@
                                         }
                                     }
                                     
-                                    for trigger in entityTuple.1 {
+                                    for trigger in entityTuple.triggers {
                                         let whiskTrigger = Trigger(name: trigger.triggerName as NSString, feed: nil, parameters: nil)
                                         whiskTriggerArray.append(whiskTrigger)
                                     }
                                     
+                                    for rule in entityTuple.rules {
+                                        let rule = Rule(name: rule.ruleName as NSString, trigger: rule.triggerName as NSString, action: rule.actionName as NSString)
+                                        whiskRuleArray.append(rule)
+                                    }
+                                    
+                                    for sequence in entityTuple.sequences {
+                                        let seq = Sequence(name: sequence.sequenceName as NSString, actions: sequence.actionNames)
+                                        whiskSequenceArray.append(seq)
+                                    }
+                                    
                                 }
                                 
                             } catch {
@@ -143,7 +154,7 @@
         return (whiskActionArray, whiskTriggerArray, whiskRuleArray, whiskSequenceArray)
     }
     
-    func getWhiskEntities(str: String) -> ([ActionToken], [TriggerToken], [RuleToken], [SequenceToken])? {
+    func getWhiskEntities(str: String) -> (actions: [ActionToken], triggers: [TriggerToken], rules: [RuleToken], sequences: [SequenceToken])? {
         
         let scanner = Scanner(string: str)
         
@@ -179,23 +190,50 @@
                 
                 switch state {
                 case .initial:
-                    if trimmedLine.range(of: "class") != nil && trimmedLine.range(of: "WhiskTrigger") != nil && trimmedLine.range(of: ":") != nil {
+                    if trimmedLine.range(of: "let") != nil && trimmedLine.range(of: "WhiskTrigger()") != nil {
                         
-                        let classStr = trimmedLine.components(separatedBy: ":")
-                        
+                        let classStr = trimmedLine.components(separatedBy: "=")
                         // get actionName
-                        let classIndex = classStr[0].characters.index(classStr[0].startIndex, offsetBy: 6)
-                        
-                        let triggerName = classStr[0].substring(from: classIndex).trimmingCharacters(in: CharacterSet.whitespaces)
-                        
-                        print("Trigger name is \(triggerName)")
-                        
+                        let letStr = classStr[0].components(separatedBy: .whitespaces)
+                        let triggerName = letStr[1]
                         let triggerToken = TriggerToken(triggerName: triggerName)
                         triggerArray.append(triggerToken)
                         
-                    } else if trimmedLine.range(of: "WhiskRule") != nil {
+                    } else if trimmedLine.range(of: "let") != nil && trimmedLine.range(of: "WhiskRule(") != nil && trimmedLine.range(of: "trigger:") != nil && trimmedLine.range(of: "action:") != nil{
+                        var classStr = trimmedLine.components(separatedBy: "=")
+                        let letStr = classStr[0].components(separatedBy: .whitespaces)
+                        let ruleName = letStr[1].trimmingCharacters(in: .whitespacesAndNewlines)
                         
-                    } else if trimmedLine.range(of: "WhiskSequence") != nil {
+                        let paramStr = classStr[1].replacingOccurrences(of: "WhiskRule", with: "").components(separatedBy: ",")
+                        let triggerStr = paramStr[0].components(separatedBy: ":")
+                        let triggerName = triggerStr[1].trimmingCharacters(in: .whitespacesAndNewlines)
+                        var actionStr = paramStr[1].components(separatedBy: ":")
+                        let actionName = actionStr[1].replacingOccurrences(of: "(", with: "").replacingOccurrences(of: ")", with: "").trimmingCharacters(in: .whitespaces)
+                        
+                        
+
+                        print("Got trigger:\(triggerName), action:\(actionName)")
+                        
+                        let rule = RuleToken(ruleName: ruleName, triggerName: triggerName, actionName: actionName)
+                        ruleArray.append(rule)
+                        
+                    } else if trimmedLine.range(of: "let") != nil && trimmedLine.range(of: "WhiskSequence(") != nil {
+                        var classStr = trimmedLine.components(separatedBy: "=")
+                        let letStr = classStr[0].components(separatedBy: .whitespaces)
+                        let sequenceName = letStr[1]
+                        
+                        let paramStr = classStr[1].replacingOccurrences(of: "WhiskSequence", with: "").components(separatedBy: ":")
+                        
+                        let actionNames = paramStr[1].replacingOccurrences(of: "[", with: "").replacingOccurrences(of: "]", with: "").replacingOccurrences(of: "(", with: "").replacingOccurrences(of: ")", with: "").replacingOccurrences(of: " ", with: "")
+                        
+                        print("Got sequence \(actionNames)")
+                        let names = actionNames.components(separatedBy: ",")
+                        var sequenceActions = [String]()
+                        for name in names {
+                            sequenceActions.append(name)
+                        }
+                        let sequence = SequenceToken(sequenceName: sequenceName, actionNames: sequenceActions)
+                        sequenceArray.append(sequence)
                         
                     } else if trimmedLine.range(of: "OpenWhiskAction") == nil && trimmedLine.range(of: "class") != nil && trimmedLine.range(of: ":") != nil && trimmedLine.range(of: "WhiskAction") != nil {
                         
@@ -276,7 +314,7 @@
             
         }
         
-        return (actionArray, triggerArray, ruleArray, sequenceArray)
+        return (actions: actionArray, triggers: triggerArray, rules: ruleArray, sequences: sequenceArray)
     }
     
 }