changeset 25:bb80f86c5048

Added code for sending and decoding the responses of evalRequests
author Mike Pavone <pavone@retrodev.com>
date Sat, 10 Aug 2013 16:31:48 -0700
parents e1109e33b796
children 18a043613dae 655d5b19333d
files src/requests.tp
diffstat 1 files changed, 59 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/src/requests.tp	Sat Aug 10 11:53:21 2013 -0700
+++ b/src/requests.tp	Sat Aug 10 16:31:48 2013 -0700
@@ -24,7 +24,7 @@
 
 
 
-	evalRequest <- :id args {
+	evalId <- :id args {
 		#{
 			string <- {
 				idStr <- (quote: "id") . ":" . (quote: id)
@@ -34,6 +34,25 @@
 		}
 	}
 
+	evalProgram <- :program args {
+		args <- args map: :el {
+			"\"0x" . (hex: el) . "\""
+		}
+		#{
+			string <- {
+				progStr <- (quote: "program") . ":" . (quote: program)
+				argsStr <- (quote: "arguments") . ":[" . (strJoin: "," args) . "]"
+				"{" . progStr . "," . argsStr . "}"
+			}
+			sendWithKey <- :key {
+				print: "Sending: " . string . "\n"
+				cli <- http client: "icfpc2013.cloudapp.net"
+				resp <- cli post: string toPath: "/eval?auth=" . key withType: "application/json"
+				evalResponse: resp
+			}
+		}
+	}
+
 	guessRequest <- :id :prog {
 		#{
 			string <- {
@@ -44,67 +63,58 @@
 		}
 	}
 
-
-
-
-
-	expect:in:else <- :target src doElse {
-		src find: target else: {
-			print: "parse error: expected " . target . "!\n"
-			doElse:
+	evalResponse <- :httpResp {
+		_code <- httpResp statusCode
+		bod <- httpResp body
+		print: "Response code: " . (string: _code) . "\n"
+		print: bod . "\n"
+		decoded <- json decode: bod
+		_status <- "error"
+		if: _code = 200 {
+			_status <- decoded get: "status" withDefault: "error"
+		} else: {
+			print: "bad status"
 		}
-	}
-
-	getStrForKey:from:else <- :key :src :doElse {
-		firstKeyQuote <- expect: "\"" in: src else: doElse
-		secondQuote <- firstKeyQuote + 1 + (key length)
-
-		#{
-			value <- ""
-			rest <- src from: (value length)
-		}
-	}
-
-	getOutputs:else <- :str :fail {
-
-	}
-
-	getEval:else <- :str :fail {
-		statusRest <- getStrForKey: "status" from: str else: fail
-		if: (statusRest value) = "ok" { // string equality? revisit.
-			outputsRest <- getOutputs: (statusRest rest) else: fail
+		if: _status = "ok" {
+			_outputs <- (decoded get: "outputs" withDefault: #[]) map: :num {
+				(num from: 2) parseHex64
+			}
 			#{
-				value <- #{
-					status <- statusRest value
-					outputs <- outputsRest value
+				status <- { "ok" }
+				outputs <- { _outputs }
+				string <- {
+					str <- "OK:"
+					foreach: _outputs :idx val {
+						str <- str . "\n" . (string: idx) . ": 0x" . (hex: val)
+					}
+					str
 				}
-				rest <- outputsRest rest
+				print <- {
+					print: string . "\n"
+				}
 			}
 		} else: {
-			message <- ""
-			print: "Status was error, message: " . message
-			messageRest <- getStrForKey: "message" from: (statusRest rest) else: fail
+			_message <- decoded get: "message" withDefault: ""
 			#{
-				value <- #{
-					status <- statusRest value
-					message <- messageRest value
+				status <- { "error" }
+				message <- { _message }
+				string <- {
+					"Error: " . _message
 				}
-				rest <- messageRest rest
+				print <- {
+					print: string . "\n"
+				}
 			}
 		}
 	}
 
-
-
-	main <- {
-		print: ((evalRequest: "someId" #[1 2i64 3i64]) string) . "\n"
+	main <- :args {
+		print: ((evalId: "someId" #[1u64 2u64 3u64]) string) . "\n"
 		print: ((guessRequest: "someId" "someProg") string) . "\n"
 
-		exampleEvalResponse <- "{\"status\":\"ok\",\"outputs\":[\"0x0000000000000002\",\"0x01DFFFFFFFFFFFFE\"]}"
-		resp <- getEval: exampleEvalResponse else: {
-			println: "failed to parse response."
+		if: (args length) > 1 {
+			key <- args get: 1
+			print: ((evalProgram: "(lambda (input) (shl1 input))" #[1u64 0xEFFFFFFFFFFFFFu64]) sendWithKey: key)
 		}
-		println: ((resp value) status)
 	}
-
 }